English 中文(简体)
GQL查询以有效地跨越实体关系。
原标题:
  • 时间:2008-11-29 17:25:02
  •  标签:

我处于这样的情况中,需要在查询中跨越 Google App Engine 实体关联,就像 Django 数据库模型中的关系跨度查找一样。我使用ListProperty来表示一对多关系,像这样:

class Foo(db.Model): bars = db.ListProperty(db.Key)
class Bar(db.Model): eggs = db.ListProperty(db.Key)

我想执行一个查询,它可以做到以下的事情:

# Foo.filter( bars.eggs = , target_egg)
[foo
for egg in eggs if egg == target_egg
for eggs in bar.eggs
for bar in foo.bars
for foo in Foo.all()]

理解似乎极不高效。我真的希望执行如注释部分所示的查询,但看起来GQL语法不允许查询属性的属性:

   SELECT * FROM <kind>
    [WHERE <condition> [AND <condition> ...]]
    [ORDER BY <property> [ASC | DESC] [, <property> [ASC | DESC] ...]]
    [LIMIT [<offset>,]<count>]
    [OFFSET <offset>]

  <condition> := <property> {< | <= | > | >= | = | != } <value>
  <condition> := <property> IN <list>
  <condition> := ANCESTOR IS <entity or key>
最佳回答

您是正确的,App Engine 数据存储不允许此类查询。而且您也是正确的,列表推导式效率低下。不过请注意,当您执行具有连接的查询时,基本上就是关系型数据库所做的工作——数据库必须执行与您在此处执行的相同的 O(n^3) 工作——唯一的区别是您是在 Python 中执行它,并且还需要额外的往返时间。由于 App Engine 是设计用于可扩展性的,因此不适合这种类型的查询。

通常情况下,可以进行模型的反规范化以便于操作,将需要访问的属性移到 Foo 模型上,或者如果你正在做聚合操作,也可以将总数移到 Foo 模型上。但如果不知道你要解决什么问题,很难给出具体的解决方案。

问题回答

暂无回答




相关问题
热门标签