1

我有一个问答评论应用程序(类似于 stackoverflow)。这些问题及其相关答案和评论在逻辑上构成了App Engine 文档中定义的实体组的一部分。

我想使用实体组/祖先路径将我的实体组合在一起,原因有两个:

  1. 通过将问题和答案实体物理存储在一起来提高查询效率
  2. 允许我执行祖先查询,从而无需我将答案键存储在问题实体(关系)上

我不想要强一致性,因为它最终会引起争用。

App Engine 是否总是在更新时锁定实体组,还是仅在事务中完成更新时锁定?换句话说,实体组是强制更新在事务中发生还是只是提供使用事务的选项?

4

1 回答 1

3

关于您选择基于祖先的方法的第一个原因——我认为我从未见过关于数据存储中物理位置的任何承诺——我想任何此类约束都会与其高可扩展性发生冲突。我不会担心,恕我直言,这种效率优化的收益(如果有的话)将微不足道。

您应该知道,争用与(强)一致性没有直接关系(一致性实际上归结为查询结果的准确性)。

然而,争用与同时访问同一个实体组直接相关,即使是读取操作,也不仅仅是写操作——参见Google App Engine 中的争用问题。使用祖先只会让事情变得更糟,因为祖先树中的所有实体都在同一个实体组中。

对于您的第二个原因(如果我正确理解您的目标),您不需要将答案键存储到您的问题实体中或使用祖先。如果您将问题键(或键 ID)存储到答案实体中,则可以通过对具有匹配问题键/ID 的答案实体进行常规(非祖先)查询来获取问题的答案。

实体组“锁定”仅在事务中可见(不,不强制执行事务,但在尝试写入外部事务之前请三思而后行 - 会发生意外覆盖)。但请注意,这种锁定仅可有效防止写操作冲突,但不能防止争用。

于 2019-09-24T03:18:48.027 回答