0

Django データベース モデルのようなクエリで、Google App Engine エンティティ関係にまたがる必要がある状況にいます。ListProperty次のように、1対多の関係に s を使用しています。

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>
4

1 に答える 1

3

その通りです。App Engine データストアでは、この種のクエリは許可されていません。そして、リスト内包表記が非効率的であることは間違いありません。ただし、それは、リレーショナルデータベースがあなたのような結合でクエリを実行するときに行うこととほぼ同じであることを考慮してください-データベースは、ここで行っているのと同じ O(n^3) 作業を実行する必要があります-唯一の違いはあなたはPythonでそれをやっていて、追加のラウンドトリップ時間を使っています. App Engine はスケーリングするように設計されているため、実際にはこの種のクエリには適していません。

ただし、通常は、アクセスする必要のあるプロパティの一部を Foo モデルに移動するか、集計を行っている場合は合計を Foo モデルに移動することで、これを容易にするためにモデルを少し非正規化する方法があります。ただし、どのような問題を解決しようとしているのかがわからなければ、具体的な解決策を提示することは困難です。

于 2008-11-29T17:56:24.750 に答える