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

问题描述

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

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,以及来自 A 和 B 的每个属性的共享索引:p1_Shared、p2_Shared、p3_Shared、p4_Shared、p5_Shared?

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

解决方法

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

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

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

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

不会创建多个分隔的索引,但相同的通用索引将用于几个不同的事情。组 有一个隐式主键索引条目。对于属性,有条目 。这样,Datastore 可以有效地搜索具有完整键(包括父级)的特定实体,可以搜索具有特定父级的实体,或者可以在类型已知时搜索属性的名称/值。

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

此查询无效。没有索引 ,并且不支持没有种类的复合索引。这样做会迫使 Datastore 搜索可能非常大量的数据。

这在 the documentation 中有解释:“没有种类和祖先的查询从数据存储模式检索应用程序的所有实体。此类无种类查询不能包含过滤器或排序顺序关于财产价值。”

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

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

不同类型的p3的值如何比较?

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