我们可以拥有一个具有很多属性的模型(比如30),同时避免爆炸性的索引陷阱吗?

时间:2012-01-16 18:23:29

标签: google-app-engine google-cloud-datastore

我在想,也许你可以让index.yaml只指定某些索引(而不是GAE自动为你做的所有索引)。

如果这不是一个好主意,那么处理存储大量属性的另一种方法是什么,而不是将额外的属性存储为blob属性中的序列化对象。

2 个答案:

答案 0 :(得分:4)

new improved query planner应生成优化的索引定义。

请注意,您可以使用python中的indexed=FalseJava中的Entity.setUnindexedProperty将属性设置为无索引。

答案 1 :(得分:2)

一些注意事项:

  1. 当您拥有multiple properties that contain "multiple values"时,就会发生爆炸索引,即具有MULTIPLE列表属性的实体,并且这些属性列在复合索引中。在这种情况下,为每个列表属性值组合创建索引条目。换句话说:创建的索引条目等于列表属性大小的乘积。因此,当在一个复合索引下的index.yaml中列出两个条目时,将创建一个包含20个条目的列表属性和另一个包含30个条目的列表属性。

  2. 对于简单(非列表)属性,或者实体中只有一个列表属性,不会发生爆炸索引。

  3. 如果您未在index.yaml文件中创建复合索引,并且在同一索引中列出至少两个列表属性,则不会发生爆炸索引。

  4. 如果你有很多属性而你不需要查询它们,那么你可以简单地将它们放在一个列表或两个并行列表中(以模拟地图),或者序列化它们。最简单的是两个并行列表:如果您将objectifyembedded classes一起使用,则会自动为您完成。