Python:在数据存储中建模一对一关系

标签 python google-app-engine data-structures google-cloud-datastore

假设我们有两个模型:UserToken。一个用户可能只有一个Token,一个Token只能属于一个用户。

来自关系数据库,以下似乎是实现它的方式:

class User(db.Model):
    name = db.StringProperty()

class Token(db.Model):
    name = db.StringProperty()
    owner = db.ReferenceProperty(User)

这当然也会创建 User.token_set,这是一个 db.Query。 但是我真的很想只使用 User.token 而不是 User.token_set.get() 来访问 token ,那么如何......

class User(db.Model):
    name = db.StringProperty()
    token = db.ReferenceProperty(Token)

class Token(db.Model):
    name = db.StringProperty()
    owner = db.ReferenceProperty(User)

现在我可以双向访问它们:User.token & User.owner。忽略我拥有那些自动创建的 .token_setuser_set 的事实。

这有什么问题吗?在逻辑方面,在性能方面?

也许我什至不应该有两个模型。实际上,它们都包含四五个属性。他们应该只是一个吗?什么时候应该放弃一对一关系而合并到一个模型中?

感谢您的任何输入!

最佳答案

这是应用引擎数据存储。这不是sql。您应该将系统使用的数据分组在一起。大概你有一些地方可以一起使用用户和 token ,并且由于多对一没有问题,所以它们可以放在同一个模型实例中。这将为您提供更好的性能(例如,通过 token 更简单地检索用户)和更容易处理一致性(更新 token 和用户将在单个事务中)。

我不知道这里是否可以接受自链接,所以如果不能,也许有人会编辑它,但我写了 http://acooke.org/cute/LessonsLea2.html尝试收集我在数据存储方面的经验。您可能会发现它很有用。

[编辑:一种思考方式:您不是在建模数据。您正在编写一个旨在扩展的系统。那 - 而不是建模数据 - 是驱动一切的动力。我并不是说这是个好主意,但这是 Appengine 所做的。如果您的首要任务是建模数据 - 例如,如果您希望多个应用程序以不同的方式使用您的数据 - 那么您不应该使用 appengine。]

关于Python:在数据存储中建模一对一关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6996504/

相关文章:

python - 如何将来自两个不同来源(没有 RDBMS 关系)的数据合并到单个序列化程序中?

python - 自定义用户身份验证。它是如何完成的,有最佳实践吗?

javascript - 相当于字典的数据结构?

php - 在数据库驱动的网站中使用图形、树和其他高级数据结构的一些示例有哪些?

python - 如何使用 python 从文件中分割每一行?

python - 对 App Engine 上的数据库中的所有 float 实体求和

google-app-engine - GAE 数据存储查看器中的 utf8 错误(Go 运行时)

ios - 将 UNIX 时间从 json 导入(swift 结构)转换为日期作为字符串并填充表

python - 在系列1中找到系列2中元素的位置。系列1 : [1,2,3,4,5,6,7] series 2[1,3,7] Sample Output: [0,2,6]

java - 任务队列Java API