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

Java 从GAE数据存储读取多对多对象的最有效方法,java,google-cloud-datastore,objectify,Java,Google Cloud Datastore,Objectify,我已经阅读了一些关于谷歌数据存储中多对多关系的问题和文章,但我仍然不确定在我的情况下哪种方式是最有效的:我有一个用户,它引用了NCollectionOfThings。一个things的集合可以引用M个用户。M和N都非常小。除了5点以外,我什么都没有。(我的申请性质)。几乎在每个请求中都会获取用户对象。另一个对象不是。我需要从CollectionOfThings所有用户的实例中查询,并从用户的CollectionOfThing实例中查询所有实例 因此,我考虑可能的实现: CollectionOf

我已经阅读了一些关于谷歌数据存储中多对多关系的问题和文章,但我仍然不确定在我的情况下哪种方式是最有效的:我有一个
用户
,它引用了N
CollectionOfThings
。一个
things的集合可以引用M个用户。M和N都非常小。除了5点以外,我什么都没有。(我的申请性质)。几乎在每个请求中都会获取用户对象。另一个对象不是。我需要从
CollectionOfThings
所有用户的实例中查询,并从用户的
CollectionOfThing
实例中查询所有实例

因此,我考虑可能的实现:

  • CollectionOfThings
    有一个用户列表<代码>用户
拥有一组
内容的集合
。关系的两端都没有@Load注释。如果我需要一个相关部分的对象,我就用ofy()加载它们

  • 我使用一个关系对象,我可以查询Y()..过滤器(“用户”),反之亦然


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

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

    另一个选项是,假设
    用户
    CollectionOfThings
    关系是对称双向的,则只将键/引用集保留在一侧并@Index它。这样做的好处是不需要事务来保持bidir关系同步。它的缺点是使用查询来反向跟踪关系;这些疑问最终将是一致的;维护这些索引需要额外的成本