请帮助我了解 GAE 数据存储区中的实体层次结构

Posted

技术标签:

【中文标题】请帮助我了解 GAE 数据存储区中的实体层次结构【英文标题】:Please help me understand entity hierarchies in GAE's Datastore 【发布时间】:2010-11-20 12:56:52 【问题描述】:

Google App Engine 数据存储区允许每个实体拥有一个父实体,本质上是一种形成实体层次结构的方法。例如,Employee 可以寻址为:

Company#521/Department#5/Employee#3

实体id只在同父实体之间是唯一的,所以需要完整的实体路径来唯一寻址。

到目前为止,一切都很好。

但是什么时候我应该以这种方式建模父子关系,而不是像在传统数据库中那样依赖实体内的基本引用属性?

我能想到的唯一原因是解决数据存储区查询中缺少连接的问题。我只能使用我正在检索其种类的实体的属性过滤查询 - 以及作为实体层次结构中任何级别的父级的任何实体。

还有其他使用此功能的理由吗?

Datastore 文档说,属于同一层次结构的实体被视为一个实体组,并且同一实体组中的实体具有序列化的写访问权限。这到底是什么意思呢?这是否意味着如果我的应用程序的一个线程正在更新Department#5,另一个正在写入Employee#3 的线程将不得不等待此更新完成?

谢谢!

【问题讨论】:

有趣的问题。期待答案。 【参考方案1】:

您应该仅在需要定义事务域时使用实体组。在 App Engine 上,事务只能修改单个实体组中的实体,即具有相同父级的实体。如果您不需要两个实体之间的事务完整性,则它们不应位于同一实体组中。

如果您绝对需要全局事务,您可以自己实现它们 - 参见 my blog post on the subject 示例。实际上,相对较小比例的应用实际上需要全局事务。

【讨论】:

【参考方案2】:

Parent 功能而不是 ReferenceProperties 的典型用法是transactions。 Google App Engine 只允许在同一个entity group 中的实体上进行交易,即一组具有相同父级的实体。

【讨论】:

“Google App Engine 只允许在同一实体组中的实体上进行交易”——但是如果我的应用程序将资金从用户 A 的 BankAccount 转移到用户 B 的 BankAccount 怎么办?这 2 个实体不共享父级,但我肯定希望他们参与事务...?! @Jen 没有什么能阻止您为不同的 BankAccounts 定义一个公共父模型。 @systempuntoout 这是个糟糕的主意,会立即导致争用问题。 因为您可以在同一实体组中更新实体的速率有限制。将所有实体放在同一个组中会限制所有这些实体的更新速率,这使得可扩展性几乎不可能。 @Nick 谢谢.. 所以,你的意思是我们需要避免不同实体之间的交易?我认为这是一个常见的交易用例。我必须阅读您的交易文章:)。

以上是关于请帮助我了解 GAE 数据存储区中的实体层次结构的主要内容,如果未能解决你的问题,请参考以下文章

NDB 层次结构和实体组的 GAE 含义

GAE 数据存储增量 ID

在“编译”时不知道属性名称的情况下,在 Python 中复制 Google App Engine 数据存储区中的实体

说明在 Google Datastore (GAE) 上读/写的性能注意事项?

Google Appengine 数据存储的层次结构优化

什么对 GAE 数据存储配额有影响?