在 AppEngine 的 NDB 数据存储中,似乎有两种方法可以将对象相互关联。有ndb.KeyProperty
和父母/祖先的钥匙。我有点困惑什么时候应该使用其中一个?
现在我一直在使用KeyProperty
,因为它是最熟悉的,但我想知道什么时候比另一个更合适。
在 AppEngine 的 NDB 数据存储中,似乎有两种方法可以将对象相互关联。有ndb.KeyProperty
和父母/祖先的钥匙。我有点困惑什么时候应该使用其中一个?
现在我一直在使用KeyProperty
,因为它是最熟悉的,但我想知道什么时候比另一个更合适。
祖先是分层的——它们可以在事物之间存在分层关系时使用(例如,在论坛系统中,您可能有Forum
s,而Topic
s 又具有Post
s)。
KeyProperty
本质上不是分层的——它只是提供了一个链接。它应该用于项目之间的非层次链接。重用上一段中的论坛示例,可以使用 aKeyProperty
将 a 链接Post
到User
创建它的人 - 因为User
s 不在论坛-主题-帖子层次结构中。它们与所有 3 个相关(例如,User
可能创建帖子、创建主题和/或管理论坛)。
然而,最后,祖先和键之间的主要权衡是一致性与吞吐量:基于祖先的查询为您提供相对于最近更新的强一致性,但对任何给定实体组施加每秒 1 次修改的限制,并且最大由于缺乏分布,组的大小限制。