Frage

Ich bin in einer Situation, wo ich brauche in einer Abfrage wie in dem Django Datenbankmodell . Ich verwende ListPropertys für eine Eins-zu-viele-Beziehungen, etwa so:

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

Und ich möchte eine Abfrage auszuführen, führt Folgendes aus:

# 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()]

Das Verständnis scheint radikal ineffizient. Ich würde wirklich eine Abfrage wie im Kommentar gesetzt Teil gerne durchführen, aber es sieht nicht aus wie die GQL Syntax für Abfragen mit den Attributen von Attributen ermöglicht:

   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>
War es hilfreich?

Lösung

Du hast Recht, der App Engine-Datenspeicher erlaubt es nicht, für diese Art der Abfrage. Und, Sie haben Recht, dass die Liste Verständnis ineffizient ist. Betrachten wir aber, dass so ziemlich genau das, was eine relationale Datenbank tut, wenn Sie eine Abfrage ausführen, mit wie Ihr eine schließt sich - die Datenbank die gleiche O ausführen muss (n ^ 3) arbeiten Sie tun hier - der einzige Unterschied ist, dass Sie es in Python, und mit zusätzlicher Umlaufzeit tun. Da App Engine skaliert ist so konzipiert, ist es nicht wirklich für diese Art von Abfragen gemacht.

Für gewöhnlich, jedoch gibt es eine Art und Weise Sie Ihr Modell ein wenig denormalise kann dies zu erleichtern, indem Sie auf den Foo Modell zugreifen müssen einige der Eigenschaften zu bewegen, oder wenn Sie Aggregate tun, indem man die Gesamt auf den Foo bewegen Modell. Es ist schwierig, ohne mehr von einer Idee von konkreten Lösungen zu geben, was Problem Sie versuchen, wenn auch zu lösen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top