我什么时候应该使用ndb.KeyProperty与祖先?

joh*_*n2x 11 google-app-engine app-engine-ndb

在AppEngine的NDB数据存储区中,似乎有两种方法可以将对象相互关联.有ndb.KeyProperty父母/祖先的钥匙.关于什么时候我应该使用其中一个,我有点困惑?

现在我一直在使用KeyProperty,因为它是最熟悉的,但我想知道什么时候比另一个更合适.

Amb*_*ber 16

祖先是等级的 - 当你在事物之间有层次关系时可以使用它们(例如,在你可能拥有Forums 的论坛系统中,Topics又具有Posts).

KeyProperty本质上不是等级的 - 它只是提供了一个链接.它应该用于项目之间的非分层链接.重用前一段中的论坛示例,可以使用a KeyProperty将a链接PostUser创建它的人 - 因为Users不在forum-topic-post层次结构中.它们与所有3个相关(例如,User可能创建帖子,创建主题和/或调节论坛).

但是,最后,祖先和密钥之间的主要权衡是一致性与吞吐量:基于祖先的查询相对于最近的更新提供了强大的一致性,但对于任何给定的实体组和最大值,每秒施加1次修改的限制由于缺乏分配,该组的大小限制.

  • 还要注意,当使用祖先来定义层次结构时,它是固定的.你不能移动孩子,所以如果你想在heirarchy中移动实体,你可以使用KeyProperties.另请注意,您可以在键中指定祖先,但祖先不必存在. (2认同)