GQL查询有效地跨越实体关系

时间:2008-11-29 17:25:02

标签: google-app-engine gql

我处于需要在in the Django database model之类的查询中跨越Google App Engine实体关系的情况。我将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()]

这种理解似乎效率极低。我真的想在注释掉的部分执行查询,但看起来the GQL syntax不允许查询属性的属性:

   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>

1 个答案:

答案 0 :(得分:3)

您说得对,App Engine数据存储区不允许此类查询。你是对的,列表理解是低效的。但是,请考虑一下,当您使用类似的连接执行查询时,这几乎就是关系数据库所执行的操作 - 数据库必须执行您在此处执行的相同O(n ^ 3)工作 - 唯一的区别是你是用Python做的,还有额外的往返时间。由于App Engine是为扩展而设计的,因此并不是真的可以用于这类查询。

通常情况下,有一种方法可以通过将一些需要访问的属性移动到Foo模型上,或者如果你正在进行聚合,通过将总数移到Foo上来对模型进行非规范化以促进这一点。模型。但是,如果没有更多地了解你试图解决的问题,很难给出具体的解决方案。