0

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

Container
  Metric
    Value

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

所以当子模型的状态更新时,我需要更新父模型的“状态”字段。我知道我可以_post_put_hook()在 Value 模型中添加一个,并且put()只要它更新就只添加所有的父母,但这似乎很昂贵。

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

1 回答 1

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)]

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

于 2012-10-18T12:06:57.340 回答