【问题标题】:When should I use ndb.KeyProperty vs. ancestors?我什么时候应该使用 ndb.KeyProperty 与祖先?
【发布时间】:2013-11-17 04:08:45
【问题描述】:

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

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

【问题讨论】:

    标签: google-app-engine app-engine-ndb


    【解决方案1】:

    祖先是分层的 - 当事物之间存在分层关系时可以使用它们(例如,在论坛系统中,您可能有 Forums,而 Topics 又是 Posts)。

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

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

    【讨论】:

    • 另请注意,当使用祖先定义层次结构时,它是固定的。您不能移动孩子,因此如果您希望能够移动层次结构中的实体,您可以使用 KeyProperties。另请注意,您可以在键中指定祖先,但祖先不必存在。
    • 还有一个可以存储在祖先下的最大大小,因为它不会被分发(这也是它具有强一致性的原因)。
    猜你喜欢
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    • 2012-09-22
    • 1970-01-01
    • 2012-12-23
    • 2021-07-13
    • 2015-04-14
    相关资源
    最近更新 更多