数据存储效率,低级别 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' - 这是动态的 - 作为实体名称,这会给你带来过多的痛苦。
编辑:
为了提供特别的帮助,根据您的描述,可行解决方案的一个选项是:
- 给每一层一个唯一的id(可能是一个uuid),将名称存储为属性
- 包括图层键作为每个点实体的父键
- 在获取层的点时使用祖先查询(强一致)
另一种选择是将点存储为嵌入式实体,并且整个层只有一个实体 - 取决于您要实现的目标。
每个 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' - 这是动态的 - 作为实体名称,这会给你带来过多的痛苦。
编辑: 为了提供特别的帮助,根据您的描述,可行解决方案的一个选项是:
- 给每一层一个唯一的id(可能是一个uuid),将名称存储为属性
- 包括图层键作为每个点实体的父键
- 在获取层的点时使用祖先查询(强一致)
另一种选择是将点存储为嵌入式实体,并且整个层只有一个实体 - 取决于您要实现的目标。