从GAE数据存储区读取多对多对象的最有效方法

时间:2014-10-30 20:30:02

标签: java google-cloud-datastore objectify

我已经阅读了一些关于Google数据存储区中多对多关系的问题和文章,但我仍然不确定哪种方式最适合我的情况:我有一个User引用N CollectionOfThingsCollectionOfThings可以引用M个用户。 M和N都非常小。我除了不超过5个。(我申请的性质)。几乎在每个请求中都提取用户对象。另一个对象没有。我需要从CollectionOfThings所有用户的实例和用户CollectionOfThing个实例的所有实例进行查询。

所以我看到可能的实现:

  • CollectionOfThings有一个用户列表。 User有一个CollectionOfThings的集合。关系的两端都没有用@Load注释。如果我需要一个relatin部分的对象,我用ofy()加载它们.load()。keys();

  • 我使用了一个关系对象,我可以查询ofy().... filter(" user",...),反之亦然。

现在最大的问题是:从数据存储读取操作的角度来看,最有效的方法是什么?

1 个答案:

答案 0 :(得分:1)

从最简单/最简单的方法开始,您可以随时迁移。根据您的描述,我将从指向两个方向的Set<Ref>字段开始。您可以使用@Load组,以便默认情况下不会发生加载,但您仍然可以使用该工具。 确保在交易中更新关系的两端。

假设User&lt; - &gt; CollectionOfThings关系是对称双向的,另一个选择是仅保留一组键/ ref并且@Index它。这样做的好处是,您不需要事务来保持bidir关系同步。它的缺点是你使用查询来反向关系;那些查询最终会保持一致;维护这些索引需要额外的费用。