【问题标题】:Google App Engine Datastore 200 index limit (index.yaml)Google App Engine Datastore 200 索引限制 (index.yaml)
【发布时间】:2014-03-30 06:15:47
【问题描述】:

使用:Google App Engine、Python 2.7、Google NDB Datastore、GQL。

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

我喜欢向用户展示按各种实体/字段排序的信息:

示例:index.yaml - 客户类可能有 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 个?

感谢您的建议

【问题讨论】:

  • 新的 App Engine SDK - 发行说明 1.9.0 版 - 2014 年 2 月 26 日谈到:“索引数量没有固定限制”仅适用于 Search API 或所有自定义申请索引???
  • 问题 8305:code.google.com/p/googleappengine/issues/detail?id=8305 正在解决这个问题,正如我所说,我认为限制应该是每个 NDB 类型

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


【解决方案1】:

您需要重新考虑您的数据模型。您的主要问题不是 200 个索引的限制。如果您实施您正在考虑的模型,您的索引将占用比您的数据多很多倍的存储空间,并且您的写入成本将是天文数字。

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

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

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

编辑:

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

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

【讨论】:

  • 安德烈,感谢您的回复。我在大多数字段上都有 (indexed=False),但由于多公司、多用户、安全性、对客户信息的访问变得复杂,因此创建了自定义索引。
  • 此外,用户还有一个导出功能,允许他们从 1 - 3 个字段中的下拉字段值中进行选择,这些字段值会根据选择导出信息。
  • 最后一条评论揭示了“将现有的关系数据模型移植到数据存储区”场景。我赞成 Andrei,因为设计应该包含云并放弃第三范式。如果这导致功能痛苦,请降低用户对应用程序云版本的期望。在低效的事情上大力推动平台是不值得的。另一方面,存储和读取成本很低,因此您可以按照 Andrei 的建议通过过度读取和丢弃大量记录来保留很多功能。
  • 您可以在任何索引属性上添加排序顺序。请记住,如果您使用不等式过滤器,则应首先对其进行排序。
  • 如果您尝试检索所有记录,则不必在查询中对它们进行排序 - 您可以检索它们并自行排序。事实上,您甚至可能根本不需要对它们进行排序,而只需按标准过滤(例如,在某个日期之后),这非常快。
猜你喜欢
  • 2015-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-12
  • 2012-07-09
  • 2015-10-08
  • 1970-01-01
相关资源
最近更新 更多