更新子模型时更新ComputedProperty的成本最低的方法?

时间:2012-10-17 19:44:59

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

我有一个父子关系的数据模型,结构如下:

Container
  Metric
    Value

这些模型中的每一个都有一个“状态”字段,但只有Value模型允许在该字段上输入;其他模型的ComputedProperty根据其祖先Value模型中的“status”字段而变化。就目前而言,当直接读取模型时,我会在父项上获得当前结果(就像@property行为一样),但当模型是查询的一部分时,我会得到陈旧的结果。

因此,当更新子模型的状态时,我需要更新父模型的“状态”字段。我知道我可以在Value模型中放置一个_post_put_hook(),只要{!1}}所有父母都更新,但这看起来很昂贵。

  • 有没有办法让父母“看”孩子们?
  • 在“状态”属性上查询父母是否有较便宜的解决方法? (所以我不必使用ComputedProperty)
  • 我使用的模型太多了吗?我应该将它们作为StructuredProperties混合在一起,以便一个put()放入所有吗? (虽然我也有问题,以及更新父母在孩子面前的状态)
  • 我还缺少其他什么吗?

1 个答案:

答案 0 :(得分:0)

对于索引,您可以获得最终的一致性,这意味着它们通常会在一秒左右内更新,但不能保证。

使用您当前的设计(取决于您的一致性要求),您可能必须以事务方式执行状态更新,可能使用_pre_put_hook(希望能够启动事务)。这是3次写入,但如果您必须更新实体组中的3个嵌套实体,则无法解决这个问题。

我认为没有任何“观察”或自动事件/触发器处理可用。

如果这始终是1:1的关系,那么将它组成一个始终具有状态的单个对象可能是有意义的。潜在的缺点是每次更新时都必须写回所有内容,这对于大对象来说是更多的开销。优势是能够查询任何财产。

如果您需要在每个级别查询状态和其他属性,则需要在任何位置使用状态,否则您可以将状态移动到必须可用于查询的实体。

如果您只查询状态而不查询Container或Metric的其他属性,则可以执行类似

的操作
[value_key.parent().parent().get() for value_key in Value.query().get(keys_only=True)]

从Value查询中获取容器列表。