我正在尝试建模一个简单的图编辑器,该图编辑器将数据存储到GAE的HRD数据存储中,并且遇到了一些问题,我想知道您是否可以向我提供一些建议。基本上,编辑器的模型为:
[图解]-包含-> [形状]-包含-> [文字]
最初,我将它们放在同一实体组中,以确保数据一致。这样,每当我添加新形状或向现有形状添加文本对象时,它们就会正确显示(从数据存储区中查询);但是,我遇到了问题,因为用户可能会快速添加许多形状,这导致每秒对图形对象进行一次以上的更新,从而导致写入争用。
另外,我可以这样设计:
[图表] [形状-包含diagramId] [文本-包含shapeId]
将它们放在不同的实体组中,当我创建新形状时,我只需要保存形状对象本身。这解决了写入争用问题,但是数据不再一致-根据HRD提交写入的时间,我可能会得到陈旧的数据。
我尝试了将图放置在缓存中的组合,并且仅在缓存不包含图的情况下才从HRD中检索。但是,这是不可预测的,因为我不确定该图是否在缓存中(我希望同时编辑许多图)...
处理此类问题的最佳实践是什么?我正在使用Java和JDO,如果有什么不同的话...
最佳答案
几点注意事项:
如果使用get
,则HRD读取是高度一致的;如果使用query
,则HRD读取最终是一致的(因为查询依赖于索引,而这些索引需要时间来构建)。如果可能,可以使用get
解决您的问题。
如果“文本和形状”是一个图的一部分,并且不需要单独访问它们并且不需要按“文本”或“形状”的属性进行搜索,则只需在图内序列化“文本”和“形状”即可。我使用Objectify,这可以通过在字段上使用@Serialize
注释简单地实现(因为我不使用JDO,所以不了解JDO)。