エンティティの関係を効果的に広げるためのGQLクエリ
-
11-07-2019 - |
質問
Djangoデータベースモデル。次のように、1対多の関係に 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に移動することで、モデルを少し非正規化してこれを容易にする方法がありますモデル。ただし、どのような問題を解決しようとしているのかを理解することなく、具体的なソリューションを提供することは困難です。
所属していません StackOverflow