数据存储区在多对多参考关系中查询父项

时间:2016-01-14 19:07:54

标签: java google-app-engine data-modeling google-cloud-datastore

我有几个数据存储区实体存在于多对多关系中,其中父级具有对子级的引用列表。我们正在使用Objectify。

@Entity
@Cache
public class Parent {
    @Index
    String name;

    private List<Ref<Child>> children;
...getters/setters etc...
}

@Entity
@Cache
public class Child {
    @Index
    String name;
...getters/setters etc...
}

我需要获得所有孩子的清单以及每个孩子的所有父母的清单。这是建立我的关系的正确方法吗?查询是什么样的?

我可以获得所有孩子的列表和所有父母的列表,然后遍历每个孩子以查看存在哪些关系,但我想知道是否有更好的方法。

1 个答案:

答案 0 :(得分:0)

您可以在其中一个实体中列出关系。然后,您可以直接从实体获取父母或子女的列表,通过对此索引属性的查询获得另一种关系。

您必须牢记两个问题:

  1. 索引属性列表的属性可能很棘手 - 请阅读爆炸索引。如果这个实体有许多其他索引字段,那么这不是一个好的选择。

  2. 每次更新关系时,都必须重写此实体中的每个索引属性,如果关系经常更新和/或此实体中有其他索引属性,则可能非常昂贵。 / p>

  3. 如果您遇到这些问题,可以考虑创建一个新实体“Relationship”,其中包含一个子ID的索引属性。该实体可以是父实体的子实体。使用此方法,您可以通过在关系实体上运行祖先查询来获取所有子项的列表,并且您可以通过在关系实体上运行简单查询来获取所有父项的列表,并使用筛选器来匹配子ID(可以提取父ID来自此查询通过调用getParent().getId()返回的实体。)