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