数据存储效率,低级别 API

Datastore efficiency, low level API

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

一般来说,我想知道是否

datastore.get(List<Key> listOfKeys);

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

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

我目前的问题:

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

1) 用 "layer name" 属性 点并用过滤器查询。 - 这里我不确定数据存储是否会准备好结果,因为层名称会动态变化。

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

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

3) 使用不带过滤器的查询:我实际上不需要通用类型 "Point" 并且可以更具体:类型为 ("layer name"+"point id") - 创造更多种类的成本是多少?这可能是最快的方法吗?

你真的能详细了解数据存储的工作原理吗?

faster or slower than a query with the index file prepared (with the same results).

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

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

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

文档很好地解释了最终一致性与强一致性,听起来您可以选择使用可以强一致性的祖先查询。我还强烈建议避免使用 'name' - 这是动态的 - 作为实体名称,这会给你带来过多的痛苦。

编辑: 为了提供特别的帮助,根据您的描述,可行解决方案的一个选项是:

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

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