0

每个 Cloud Datastore 查询都使用一个或多个索引来计算其结果,这些索引包含按索引属性和(可选)实体祖先指定的序列中的实体键。索引会以增量方式更新以反映应用程序对其实体所做的任何更改,以便所有查询的正确结果都可用,而无需进一步计算。

一般来说,我想知道是否

datastore.get(List<Key> listOfKeys);

比准备好索引文件的查询更快或更慢(结果相同)。

Query q = new Query("Kind")(.setFilter(someFilter));

我目前的问题:

我的数据由图层和点组成。点仅属于一个唯一的层,并且在层内具有唯一的 id。我可以通过多种方式加载这些点:

1)具有“图层名称”属性的点并使用过滤器进行查询。- 在这里我不确定数据存储是否会准备好结果,因为图层名称会动态变化。

2) 只使用键。该层必须存储点 ID。

KeyFactory.createKey("Layer", "layer name");
KeyFactory.createKey("Point", "layer name"+"x"+"point id");

3) 使用不带过滤器的查询:我实际上不需要通用种类“点”,可以更具体:种类将是 (“层名称”+“点 id”) - 创建更多种类的成本是多少?这可能是最快的方法吗?

你真的能详细了解数据存储是如何工作的吗?

4

1 回答 1

1

比准备好索引文件的查询更快或更慢(结果相同)。

从根本上说,查询和按键获取不能保证具有相同的结果。

查询最终是一致的,而按键获取数据是强一致的。

在优化速度之前,您的第一个挑战可能是确保您显示正确的数据。

这些文档非常适合解释最终一致性与强一致性,听起来您可以选择使用可以强一致性的祖先查询。我还强烈建议避免使用“名称”——它是动态的——作为实体名称,这会给你带来过多的悲伤。

编辑:为了特别有帮助,基于您的描述的可行解决方案的一个选项是:

  1. 为每一层提供一个唯一的 id(可能是一个 uuid),将名称存储为属性
  2. 包括图层键作为每个点实体的父键
  3. 在获取层的点时使用祖先查询(这是强一致的)

另一种选择是将点存储为嵌入式实体,并且整个层只有一个实体 - 取决于您要实现的目标。

于 2016-10-26T21:12:20.003 回答