我正在尝试建模一个简单的图表编辑器,将数据存储到GAE的HRD数据存储区中,我遇到的问题是,我想知道你是否可以给我一些建议。基本上,编辑的模型是:
[图表] - 包含 - > [形状] - 包含 - > [文本]
最初,我将这些放入同一个实体组,以确保数据一致。通过这样做,每当我添加新形状或向现有形状添加文本对象时,它们都会正确显示(因为它是从数据存储区查询的);但是,我遇到了问题,因为用户可能会快速添加许多形状,这会导致每秒对图表对象进行多次更新,从而导致写入争用。
或者,我可以这样设计:
[Diagram] [Shape - contains diagramId] [Text - contains shapeId]
将它们放在不同的实体组中,当我创建一个新形状时,我只需要保存形状对象本身。这解决了写入争用问题,但数据不再一致 - 取决于HRD提交写入的时间,我可能会得到过时的数据。
我尝试了将图表放在缓存中的组合,只有在缓存不包含图表时才从HRD中检索;然而,这是不可预测的,因为我无法确定图表是否会在缓存中(我希望可以同时编辑许多图表)......
处理此类问题的最佳做法是什么?我正在使用Java和JDO,如果这有任何区别......
答案 0 :(得分:1)
很少注意到:
如果使用get
,则HRD读取非常一致,如果使用query
,则最终保持一致(因为查询依赖于索引,需要时间构建)。如果可能,您可以使用get
来解决您的问题。
如果文本和形状是一个图表的一部分,如果您不需要单独访问它们而且您不需要按Text或Shape的属性进行搜索,那么您可以在图表中序列化文本和形状。我使用Objectify,这只是通过字段上的@Serialize
注释实现的(不知道JDO,因为我不使用它)。