什么时候对不同种类的实体使用相同的父密钥才有意义?

When does it make sense to have the same parent key to entities of different kinds?

什么时候对不同种类的实体使用相同的父密钥才有意义?如果您像这样创建实体:

Key k1 = KeyFactory.createKey("X", "x1");
String kind_A = "A";
String kind_B = "B";
Entity e1 = new Entity(kind_A, "a1", k1);       
Entity e2 = new Entity(kind_B, "b1", k1);
        
Query q1 = new Query(k1); //{will return a1, b1}
Query q2 = new Query(kind_A, k1); // will return a1

如果 e1 具有属性名称:p1、p2、p3,并且 e2 具有属性名称:p3、p4、p5,并且您创建如下查询:

Query q3 = new Query(k1).addSort("p3");
Query q4 = new Query(kind_A, k1).addSort("p3");

将为键 k1(X, x1) 创建多少个索引?

每一种都会有索引吗:p1_A, p2_A, p3_A, p3_B, p4_B, p5_B, plus A 和 B 中每个 属性 的共享索引:p1_Shared、p2_Shared、p3_Shared、p4_Shared、p5_Shared?

如果 p3 的值是不同的类型,例如 Long 和 String,或者 Blob 和 String/Long,将如何比较它们?

我将尝试解决您在此处提出的几个问题。

When does it make sense to have the same parent key to entities of different kinds?

数据应该根据需要的种类建模。如果一个种类有自然父代,那么使用父键是有意义的,它允许您在不创建索引的情况下查询父代。如果两个不同的物种有相同的亲本,你应该这样做。

How many indexes will be created for key k1(X, x1)?

不会创建多个单独的索引,但相同的通用索引将用于几个不同的事物。组 有一个隐式主键索引条目。对于属性,有条目 。这样,Datastore 可以有效地搜索具有完整键(包括父级)的特定实体,它可以搜索具有特定父级的实体,或者它可以搜索 属性 的 name/value 当类型众所周知。

Query q3 = new Query(k1).addSort("p3");

此查询无效。没有索引,不支持复合索引。这样做会强制 Datastore 搜索可能非常大量的数据。

这在 the documentation 中有解释:“没有种类和祖先的查询从数据存储模式检索应用程序的所有实体。这样的 kindless 查询不能在 属性 值上包含过滤器或排序顺序。"

Query q4 = new Query(kind_A, k1).addSort("p3");

此查询也无效。没有索引 。尽管如此,您可以在种类“A”属性“p3”上创建一个复合索引,包括祖先。

How the values of p3 will be compared if they are of different types?

根据the documentation,属性将根据其类型排序,然后根据其值排序。