2009-02-09 1 views
6

Sind die untergeordneten Elemente einer Entität in einer Abfrage verfügbar?Google App Engine-Abfrage (kein Filter) für untergeordnete Elemente einer Entität

Gegeben:

class Factory(db.Model): 
    """ Parent-kind """ 
    name = db.StringProperty() 

class Product(db.Model): 
    """ Child kind, use Product(parent=factory) to make """ 
    @property 
    def factory(self): 
     return self.parent() 
    serial = db.IntegerProperty() 

Angenommen, 500 Fabriken 500 Produkte für insgesamt 250.000 Produkten gemacht haben. Gibt es eine Möglichkeit, eine ressourceneffiziente Abfrage zu erstellen, die nur die 500 Produkte einer bestimmten Fabrik zurückgibt? Die Vorfahrenmethode ist ein Filter, so dass z.B. Product.all(). Ancestor (factory_1) würde wiederholte Aufrufe des Datenspeichers erfordern.

Antwort

8

Obwohl der Vorgänger ein "Filter" ist, wird die Abfrage nur aktualisiert, um die Vorgängerbedingung hinzuzufügen. Sie senden keine Anforderung an den Datenspeicher, bis Sie über die Abfrage iterieren, also was Sie haben, wird gut funktionieren.

Ein kleiner Punkt: 500 Entitäten mit demselben übergeordneten Element können die Skalierbarkeit beeinträchtigen, da Schreibvorgänge für Mitglieder einer Entitätsgruppe serialisiert werden. Wenn Sie nur die Fabrik verfolgen möchten, die ein Produkt aus, verwenden Sie einen Reference:

class Product(db.Model): 
    factory = db.ReferenceProperty(Factory, collection_name="products") 

Anschließend können Sie alle Produkte erhalten, indem mit:

myFactory.products 
+0

Die docs nennen es einen Filter, aber es isn nicht? Mercy Sakes, was als nächstes. Der Anwendungsfall für Schreibvorgänge ist jede Factory erstellt null bis zehn Produkte/Tag mit einer minimalen Zeit zwischen Produkten von zehn Sekunden ("bursty"). 95% der Produktlesevorgänge sind Factory-as-a-whole. Ist Eltern-Kind oder ReferenceProperty besser? –

+0

Ich denke, die Empfehlung ist, Entity-Gruppen nur aus Transaktionen zu verwenden, also wäre eine ReferenceProperty besser, obwohl es wahrscheinlich keinen großen Unterschied gibt ... – mcobrien

+0

Es ist nichts falsch mit 500 Elementen in der gleichen Entity-Gruppe - es ist die Aktualisierungsrate das zählt. –

Verwandte Themen