我正在尝试建模一个简单的图编辑器,该图编辑器将数据存储到GAE的HRD数据存储中,并且遇到了一些问题,我想知道您是否可以向我提供一些建议。基本上,编辑器的模型为:

[图解]-包含-> [形状]-包含-> [文字]

最初,我将它们放在同一实体组中,以确保数据一致。这样,每当我添加新形状或向现有形状添加文本对象时,它们就会正确显示(从数据存储区中查询);但是,我遇到了问题,因为用户可能会快速添加许多形状,这导致每秒对图形对象进行一次以上的更新,从而导致写入争用。

另外,我可以这样设计:

[图表] [形状-包含diagramId] [文本-包含shapeId]

将它们放在不同的实体组中,当我创建新形状时,我只需要保存形状对象本身。这解决了写入争用问题,但是数据不再一致-根据HRD提交写入的时间,我可能会得到陈旧的数据。

我尝试了将图放置在缓存中的组合,并且仅在缓存不包含图的情况下才从HRD中检索。但是,这是不可预测的,因为我不确定该图是否在缓存中(我希望同时编辑许多图)...

处理此类问题的最佳实践是什么?我正在使用Java和JDO,如果有什么不同的话...

最佳答案

几点注意事项:


如果使用get,则HRD读取是高度一致的;如果使用query,则HRD读取最终是一致的(因为查询依赖于索引,而这些索引需要时间来构建)。如果可能,可以使用get解决您的问题。
如果“文本和形状”是一个图的一部分,并且不需要单独访问它们并且不需要按“文本”或“形状”的属性进行搜索,则只需在图内序列化“文本”和“形状”即可。我使用Objectify,这可以通过在字段上使用@Serialize注释简单地实现(因为我不使用JDO,所以不了解JDO)。

10-08 13:09