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


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

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


11614
2017-11-06 03:03


起源



答案:


祖先是分层的 - 当事物之间存在层次关系时(例如,在您可能拥有的论坛系统中),可以使用它们 Forum有的 Topic反过来又有 PostS)。

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

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


16
2017-11-06 03:17



还要注意,当使用祖先来定义层次结构时,它是固定的。你无法移动孩子,所以如果你想在heirarchy中移动实体,你可以使用KeyProperties。另请注意,您可以在键中指定祖先,但祖先不必存在。 - Tim Hoffman
此外,您可以在祖先下存储最大大小,因为它不会被分发(这也是为什么它具有很强的一致性)。 - Zig Mandel


答案:


祖先是分层的 - 当事物之间存在层次关系时(例如,在您可能拥有的论坛系统中),可以使用它们 Forum有的 Topic反过来又有 PostS)。

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

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


16
2017-11-06 03:17



还要注意,当使用祖先来定义层次结构时,它是固定的。你无法移动孩子,所以如果你想在heirarchy中移动实体,你可以使用KeyProperties。另请注意,您可以在键中指定祖先,但祖先不必存在。 - Tim Hoffman
此外,您可以在祖先下存储最大大小,因为它不会被分发(这也是为什么它具有很强的一致性)。 - Zig Mandel