我已经阅读了有关Google数据存储区中多对多关系的一些问题和文章,但是我仍然不确定哪种方法最有效:我有一个User
引用了N CollectionOfThings
。 CollectionOfThings
可以引用M个用户。 M和N都非常小。我除了不超过5。(我的应用程序的性质)。几乎在每个请求中都提取用户对象。另一个对象没有。我需要从所有用户的CollectionOfThings
实例以及一个用户的CollectionOfThing
实例的所有实例中查询。
所以我看到了可能的实现:CollectionOfThings
具有用户列表。 User
具有CollectionOfThings
的集合。关系的两端均未使用@Load注释。如果我需要一个相关部分的对象,则可以用ofy()。load()。keys();加载它们。
我使用一个可以查询ofy().... filter(“ user”,...)的关系对象,反之亦然。
现在最大的问题是:从数据存储读取操作的角度来看,最有效的方法是什么?
最佳答案
从最简单/最简单的方法开始,您以后总是可以迁移。根据您的描述,我将从两个方向指向的Set<Ref>
字段开始。您可以使用@Load
组,以使加载默认情况下不会发生,但是您仍然可以使用该工具。确保在事务中更新关系的两端。
假设User
CollectionOfThings
关系是对称双向的,另一种选择是仅将Set of key / refs保留在一侧,并@Index。这样做的好处是,您不需要进行交易即可使bidir关系保持同步。缺点是您使用查询来沿相反的方向跟踪关系。这些查询最终将保持一致;维护这些索引需要额外花费。