数据存储效率,低级API

时间:2016-10-25 19:32:01

标签: google-app-engine google-cloud-datastore low-level-api

每个云数据存储区查询使用一个或多个索引计算其结果,这些索引包含由索引属性和(可选)实体的祖先指定的序列中的实体键。索引会逐步更新,以反映应用程序对其实体所做的任何更改,以便所有查询的正确结果都可用,无需进一步计算。

一般来说,我想知道是否

datastore.get(List<Key> listOfKeys);

比编写索引文件的查询更快或更慢(具有相同的结果)。

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

我目前的问题:

我的数据包括图层和点数。点只属于一个唯一图层,并且在图层中具有唯一ID。我可以用几种方式加载点数:

1)使用&#34;图层名称&#34;属性和带过滤器的查询。 - 这里我不确定数据存储区是否会准备好结果,因为图层名称会动态变化。

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

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

3)使用没有过滤器的查询:我实际上并不需要一般的类型&#34; Point&#34;并且可以更具体:善意是(&#34;图层名称&#34; +&#34;点ID&#34;) - 创造更多种类的成本是多少?这可能是最快的方式吗?

您真的可以详细了解数据存储区的工作原理吗?

1 个答案:

答案 0 :(得分:1)

  

比编写索引文件的查询更快或更慢(具有相同的结果)。

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

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

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

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

编辑: 为了特别有用,基于您的描述的工作解决方案的一个选项是:

  1. 为每个图层提供唯一ID(可能是uuid),将名称存储为属性
  2. 将图层键包含为每个点实体的父键
  3. 在获取图层的点(强烈一致)时使用祖先查询
  4. 另一种选择是将点存储为嵌入式实体,并且整个层只有一个实体 - 取决于您要实现的目标。