何时在GAE的数据存储区中使用实体组

Ton*_*ony 11 google-app-engine entity-groups google-cloud-datastore

我之前关于GAE数据存储区实体层次结构的问题之后,我仍然对何时使用实体组感到困惑.

举个简单的例子:

  • 每个人Company都有一个或多个Employee实体
  • 一个Employee不能被移动到另一个Company,并与一个处理用户Company不能看到Employee的是另一个sCompany

这看起来像在那里我可以做的情况下,Employee一个子实体Company,但什么是实际的后果是什么?这是否会提高可扩展性,损害可扩展性或没有影响?使用或不使用实体层次结构的其他优点/缺点是什么?

(实体组启用事务,但假设此示例我不需要事务).

Ril*_*ark 9

如果您不需要事务,请不要使用实体组.在某些情况下,它们会降低速度,并且永远不会加快速度.他们唯一的好处是他们支持交易.

据我所知,使用实体组的最佳位置是许多用户不可能同时访问的数据,并且您经常希望包含在事务中.因此,如果您存储购物车的内容(可能只有该购物车的所有者经常处理),那么这些内容可能对实体组有利 - 能够对该数据使用交易会很好当您添加或更新实体时,当您这样做时,您并未锁定其他任何人.

  • 这里的精神绝对正确,我可以稍微修改技术细节.实体组损害了可伸缩性,因为写入是按实体组序列化的,而不是因为它们的数据紧密存储在一起.(空间局部性实际上通常适用于缓存和扩展,具体取决于实现细节.)鉴于此,不要过分担心每个实体组的数据量.需要担心的主要是写吞吐量.正如许多其他地方所指出的,每个实体组每秒执行的操作不能超过1到10次. (8认同)
  • 另一个主要好处是强烈一致的读取.也许"他们启用交易"意味着这一点,但这对我来说并不是很明确. (3认同)

Rob*_*uin 8

尼克明确表示,你不应该让这些组大于必要,编写可扩展应用程序最佳实践有一些讨论原因.

需要交易时使用实体组.在您给出的示例中,员工的ReferenceProperty将获得类似的结果.

除了事务之外,实体组可能很有用,因为可以从父实体键入密钥提取和查询.但是,您可能需要考虑这些类型的用例的多租户.

最终,大型实体组可能会损害可扩展性,实体组中的实体将存储在同一平板电脑中.你塞进一个实体组的东西越多,你就越能减少并行完成的工作量 - 它需要连续完成.