Google App Engine数据存储200索引限制(index.yaml)

时间:2014-02-27 02:44:09

标签: python google-app-engine indexing google-cloud-datastore app-engine-ndb

使用:Google App Engine,Python 2.7,Google NDB数据存储区,GQL。

我编写了一个有很多NDB类型的业务应用程序(ndb.Model) 例如:客户,供应商,供应商,制造商,订单等。

我想向用户显示按各种实体/字段排序的信息:

示例:index.yaml - Customer类可能有12-15个索引文件条目。

- kind: Customers
  - properties:
  - name: Name
  - name: NewDate
  - direction: desc
- kind: Customers
  - properties:
  - name: State
  - name: Name
- kind: Customers
  - properties:
  - name: Country
  - name: Name
- kind: Customer
  - properties:
  - name: Code
  - name: Name
  - name: Class
  - name: LastOrderDate
  - direction: desc

只是一个例子,但我喜欢大约20-30种NDB类型(ndb.Model),每种类型约有15个复合索引。如果我遇到200限制,我想确保我有一个解决方法。

不确定为什么Google会将此限制在200,我认为限制应该是每个NDB类型(ndb.Model)可能每个20?

感谢您提出任何建议

1 个答案:

答案 0 :(得分:3)

您需要再次考虑您的数据模型。您的主要问题不是200个索引的限制。如果您实现了正在考虑的模型,那么索引的存储空间将比数据多出许多倍,并且您的写入成本将是天文数字。

每次保存数据对象时,每个实体加上每个索引属性加上每个自定义索引,都会产生成本。使用您的数据模型,每个实体的每次更新最终支付的费用将超过必要的15-20倍。

您可能有使用SQL数据库的经验,但数据存储区非常不同。您必须以不同方式对数据建模。

我构建了一个非常复杂的应用程序,其中包含许多不同的实体,它们之间的关系非常复杂。我在这个应用程序中有5个自定义索引。

编辑:

在非关系数据库中有许多数据建模方法。例如,让我们以“名称和状态”索引为例。有多少客户将拥有相同的名称,但在不同的州?检索具有给定名称的所有客户,然后选择属于所需状态的客户,而不是仅为此属性组合创建自定义索引要便宜得多。请记住,读取比写入便宜得多,而且数据大小也更小。

这同样适用于您的所有示例。您可以按名称和订单日期选择所有客户,而在极少数情况下,当两个客户具有相同的名称时,只需删除具有错误代码/类的客户,而不是“代码和名称AND类和LastOrderDate”。