假设我们有两个模型:User
和 Token
。一个用户可能只有一个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_set
和 user_set
的事实。
这有什么问题吗?在逻辑方面,在性能方面?
也许我什至不应该有两个模型。实际上,它们都包含四五个属性。他们应该只是一个吗?什么时候应该放弃一对一关系而合并到一个模型中?
感谢您的任何输入!
最佳答案
这是应用引擎数据存储。这不是sql。您应该将系统使用的数据分组在一起。大概你有一些地方可以一起使用用户和 token ,并且由于多对一没有问题,所以它们可以放在同一个模型实例中。这将为您提供更好的性能(例如,通过 token 更简单地检索用户)和更容易处理一致性(更新 token 和用户将在单个事务中)。
我不知道这里是否可以接受自链接,所以如果不能,也许有人会编辑它,但我写了 http://acooke.org/cute/LessonsLea2.html尝试收集我在数据存储方面的经验。您可能会发现它很有用。
[编辑:一种思考方式:您不是在建模数据。您正在编写一个旨在扩展的系统。那 - 而不是建模数据 - 是驱动一切的动力。我并不是说这是个好主意,但这是 Appengine 所做的。如果您的首要任务是建模数据 - 例如,如果您希望多个应用程序以不同的方式使用您的数据 - 那么您不应该使用 appengine。]
关于Python:在数据存储中建模一对一关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6996504/