1

我的一个查询可以根据用户输入采用许多不同的过滤器和排序顺序。这会生成一个包含 50 多个索引的巨大 index.yaml 文件。

我正在考虑将我的许多布尔和多选(字符串)属性非规范化为单个字符串列表属性。这样,我将减少查询组合的数量,因为大多数查询将简单地向字符串列表属性添加一个过滤器,并且我的索引计数应该会大大减少。

它肯定会增加我的存储大小,但这并不是真正的问题,因为我不会有那么多数据。

这听起来是个好主意,还是这种方法有任何其他缺点?

4

3 回答 3

3

与往常一样,这取决于您要如何查询实体。对于您可以针对此类属性列表执行的大多数类型的查询,App Engine 已经包含一个自动构建的索引,您不必在 app.yaml 中指定。同样,您想要执行的大多数查询都需要复合索引,您不能使用列表属性,或者需要该列表属性上的“爆炸”索引。

如果您告诉我们更多关于您通常在此对象上运行的查询类型,我们可以为您提供更具体的建议。

于 2011-01-27T04:08:57.500 回答
2

对数据进行非规范化以减少索引数量听起来像是一个很好的权衡。减少您需要的索引数量将有更少的索引需要更新(尽管您的一个索引会有更多的更新);目前尚不清楚这将如何影响 GAE 的性能。如果您保留原始字段,大小当然会更大(因为您正在将数据复制到字符串列表属性中),但这可能不会太重要,除非您的实体已经非常大。

这有点复杂,因为列表上的索引将为每个实体的列表中的每个元素包含一个条目(而不是每个实体只有一个条目)。这肯定会影响空间和查询性能。此外,请注意创建包含多个列表属性的索引,否则您可能会遇到索引爆炸的问题(多个列表属性 => 每个列表中的每个值组合都有一个索引条目)。

尝试试验,看看它在实践中是如何为您工作的(使用AppStats!)。

于 2010-07-21T19:45:39.777 回答
0

“它肯定会增加我的存储容量,但这并不是真正的问题,因为我不会有那么多数据。

如果这是真的,那么你没有理由去规范化。

于 2011-01-26T02:40:31.213 回答