1
2
你所建议的方法会很管用;您可以将行项目的'appointment\u Key\u list'建模为列表属性,它将按您所期望的那样工作。您不必使用IN运算符—这是为了将数据存储中的单个值与您拥有的键列表(例如,“WHERE datastore\u column IN('a'、'b'、'c'))进行匹配,而相反—将单个值与数据存储中的列表进行匹配。 不过,我建议,反过来可能更适合您的任务:让每个约会都有一个行项目键列表。这与操作方式大致相同,但要检索约会上的所有数据,您需要先获取约会,然后使用约会实体中的键对行项目执行批量获取。如果您知道约会的关键,那么您就完全不需要进行任何查询。 我一直在试图向Pindatjuh解释为什么查询列表属性的效率不比单值属性低,但显然需要更详细的描述,因此不需要进一步的讨论,下面是。。。 appengine数据存储索引简介尽管Python和Java为数据存储提供了各种高级接口,但数据存储本身表示一种较低级别的抽象,称为实体。实体由以下部分组成:
但这和列表是如何相互作用的呢?嗯,列表被视为“多值”属性。也就是说,包含n个项目的列表存储为n个单独的属性。举个例子可能会更清楚地说明这一点:
将序列化为:
如您所见,列表由一系列值表示,所有值都具有相同的名称。从数据存储加载数据时,SDK会看到重复的值并将其转换为列表。
('a_key'这里是原始实体键的占位符。)当您执行使用此索引的查询时,它只需要在索引上进行查找,以找到具有适当前缀的行(例如,'SELECT*FROM Kind WHERE a_string=“Hello,world”ORDER BY an_int')。 不过,当您为列表编制索引时,appengine会插入多个索引行。“一个整数”和“一个整数列表”上的索引将为上述实体生成以下行:
同样,查询的工作原理与以前相同—应用程序引擎只需在索引中查找具有正确前缀的行。列表中的条目数对查询的速度没有影响,只影响生成和写入索引条目所用的时间。事实上,查询规划器并不知道“一个\个\个\个\个\个\个\个\个整数的列表\个”是一个多值属性—它只是将其视为任何其他索引项。 简而言之:
|
2
1
标准化形式的模型将有第三个表,其中引用
但是有一个问题!因为你使用的是googleappengine,而且他们的数据存储非常有限 ("GQL cannot perform an SQL-like JOIN") 而且大多需要反规范化。
您建议使用类似列表的字段。这是一个可能的使用,但它是非常困难的索引。寻找钥匙
现在,这是一个明确的选择:要么更快,要么更好的存储。首先,它降低了模型的复杂性,而且存储从来都不是现代系统的问题。较低的复杂性通常意味着更少的bug和更少的开发/测试成本,这就证明了存储需求的成本是合理的。 |
Itamar Cohen · 谷歌管理的SSL证书不起作用 2 年前 |
cozimo · 谷歌云警告:自动应用检测已被弃用,并将很快被删除 6 年前 |
Noah Watkins · ndb的控制索引。Expando模型属性 6 年前 |