【问题标题】:Google app engine entity groupsGoogle 应用引擎实体组
【发布时间】:2010-01-04 22:56:21
【问题描述】:

据我从应用引擎教程中了解到,实体组的存在仅用于交易目的:

“仅在事务需要时使用实体组”(来自教程)

在同一实体组中的定义是具有相同的根.. 在那种情况下,具有多个层次结构级别有什么用? 也就是为什么要使用“A -> B -> C”(A是根,B是儿子,C是孙子) 而不是 "A -> B ; A -> C" ? (A、B 和 C 仍然在同一个实体组中,因为 A 是它们的根)。

如果实体组的唯一目的是使实体之间的交易成为可能,我为什么要使用超过 1 个层次结构级别(我从 Root -> Grandson 链接获得什么)?

【问题讨论】:

    标签: google-app-engine


    【解决方案1】:

    当您进行查询时,您可以使用 ancestor() 将查询限制为特定实体的子代 - 在您的示例中,您可以只查找 B 的后代,如果他们无法做到这一点都是顶级的。

    Programming Google App Engine 中有更多关于祖先查询的内容

    Keys and Entity Groups 文档还说:

    实体组关系告诉 App Engine 将多个实体存储在分布式网络的同一部分......一个组中的所有实体都存储在 同一个数据存储节点

    编辑:同一文档还列出了您不希望实体组变得太大的一些原因:

    您的实体组越多 应用程序有——也就是说,根越多 存在的实体——越多 数据存储可以有效地 将实体组分布在 数据存储节点。更好的分布 提高创建性能 和更新数据。还有,多 试图更新实体的用户 同时同一个实体组 将导致一些用户重试他们的 交易,可能导致一些 未能提交更改。不要把所有 下的应用程序实体 一个根。

    对组中实体的任何事务都会导致对同一实体组的任何其他写入失败。如果您有一个包含大量写入的大型实体组,这会导致大量争用,然后您的应用程序必须处理预期的写入失败。 Avoiding datastore contention 更详细地介绍了可用于最小化争用的策略。

    【讨论】:

    • 好吧,我终于明白了!所以基本上教程中的句子“仅在事务需要时才使用实体组”并不真正正确,因为它还有其他用途......
    • 没错,有点误导。我认为重点是在使用实体组之前要真正思考,不要仅仅认为这是对数据进行分组的一种很好的逻辑方式。有一些非事务性的好处,例如性能。 Brett Slatkin 在此处使用实体组提出了他称之为“关系索引实体”的建议:code.google.com/events/io/2009/sessions/…
    • 小澄清:我认为詹姆斯说“组中实体上的任何事务都会导致对同一实体组的任何其他写入失败”,他的意思是“任何 WRITE 事务......” .实体组上的 READ 事务不会导致同时 WRITE 事务失败(写入也不会导致同时读取失败)。如有错误请指正。
    • @Andyd 不,我的意思是任何交易;我的回答似乎是基于我链接到的 [避免数据存储争用][code.google.com/appengine/articles/scaling/contention.html] 页面。但是,该页面已有 2.5 年历史,而我在这里的评论已有 2 年历史。我没有跟上 AppEngine 的变化,尤其是在高复制数据存储方面;我不知道这是否仍然正确。
    • 您不能通过在实体中存储 ID 来创建自己的组。然后您可以查询和过滤ID。我想这不如祖先查询那么有效,但你不会有争用的问题。这将使每个实体都成为根实体。这样存储数据有问题吗?
    【解决方案2】:

    实际上,事务是实体组的副作用。因为实体组行是位于同一位置的事务,所以它们上的事务是完全可能的。

    我什至会声称实体组是数据存储的固有属性,使其类似于分层数据库。

    【讨论】:

      【解决方案3】:

      当你存储 A -> B -> C 时,A 有很多 B,而 B 有很多 C。当你存储 A -> B 和 A -> C 时,A 有很多 B,也有很多 C。换句话说,C 不属于单个 B。

      您使用哪种结构实际上取决于您存储的数据。

      当使用大量写访问时,您可能不得不对实体组做一些不直观的事情,请参阅 Sharding Counters 以获取此示例:

      【讨论】:

      • 感谢您的快速回复。我理解 C 在第一种情况下“属于”B 但在第二种情况下不属于 B 的想法(如树)。但是在实体组的情况下,“属于”是什么意思?它们相互连接,我有什么用处?如果实体组中的整个想法是允许实体之间的交易,并且在这两种情况下我都提到了 A、B 和 C 允许交易,那么我从 B 和 C 连接的事实中得到什么?
      • 实际上与詹姆斯的回答相同:-)。 Simples 示例是将文件集合作为存档,有点像 zip。你可以有存档 -> 文件 -> 文件属性。现在每个文件都可以具有属性(可以使用祖先访问)。当你有存档 -> 文件和存档 -> 文件属性时,就没有这样的东西了。
      • 嘿,谢谢回答 :) 但是,我仍然不完全理解,因为您可以使用 ReferenceProperty 来达到目的。引自google教程:“仅在事务需要时使用实体组。对于实体之间的其他关系,使用ReferenceProperty属性和Key值,可以在查询中使用。”这就是困扰我的地方:)
      猜你喜欢
      • 1970-01-01
      • 2013-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-09
      相关资源
      最近更新 更多