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

时间:2010-11-20 12:56:52

标签: google-app-engine google-cloud-datastore

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

Company#521/Department#5/Employee#3

实体ID仅在具有相同父级的实体中是唯一的,因此需要完整的实体路径来唯一地对其进行寻址。

到目前为止,非常好。

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

我能想到的唯一原因是绕过数据存储区查询中缺少连接。我只能使用我正在检索的实体的属性以及实体层次结构中任何级别的父级的任何实体来过滤查询。

使用此功能的任何其他原因?

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

谢谢!

2 个答案:

答案 0 :(得分:2)

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

如果您绝对需要全局交易,可以自己实施 - 请参阅my blog post on the subject以获取示例。实际上,相对较小比例的应用实际上需要全球交易。

答案 1 :(得分:1)

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