2010-01-04 32 views
10

Soweit ich von App Engine Tutorial verstehen, existieren Entitätsgruppen nur zum Zweck der Transaktionen:Google App Engine Entitätsgruppen

„Nur Gruppen Nutzung Einheit, wenn sie für Transaktionen benötigt werden“ (aus dem Tutorial)

Die Definition des Seins in der gleichen Entitätsgruppe hat die gleiche Wurzel. In diesem Fall, was ist die Verwendung von mehr als 1 Hierarchieebene? Das heißt, warum sollte ich "A -> B -> C" verwenden (A ist die Wurzel, B sein Sohn, C sein Enkel) statt "A -> B; A -> C"? (A, B und C befinden sich immer noch in derselben Entitätsgruppe, da A ihre Wurzel ist).

Wenn der einzige Zweck von Entitäten Gruppen in Transaktionen zwischen Entitäten möglich machen, warum sollte ich mehr als 1 Hierarchieebene verwenden (was verdiene ich von Root -> Grandson-Verknüpfung)?

Antwort

17

Wenn Sie Abfragen tun, können Sie ancestor() verwenden, um die Abfrage zu beschränken Kinder einer bestimmten Entität - in Ihrem Beispiel könnten Sie nur nach Nachkommen von B suchen, die Sie nicht tun könnten, wenn sie alle auf der obersten Ebene wären.

Es gibt mehr auf Vorfahren Abfragen in Programming Google App Engine

Die Keys and Entity Groups doc sagt auch, dass:

Entity Gruppenbeziehungen App Engine sagen im gleichen Teil des verteilten Netzwerkes mehr Einheiten zu speichern ... Alle Einheiten in einer Gruppe werden in der selben Datenspeicher-Knoten

bearbeiten gespeichert: das gleiche Dokument listet auch einige der Gründe, warum Sie yo nicht wollen ur Entitätsgruppen zu groß wachsen:

Je mehr Entitätsgruppen Ihre Anwendung hat, das heißt, je mehr Wurzel Entitäten gibt es je mehr effizient die Datenspeicher kann die Entity-Gruppen über Datenspeicher-Knoten verteilen . Bessere Verteilung verbessert die Leistung der Erstellung und Aktualisieren von Daten. Auch mehrere Benutzer versuchen, Entitäten in die gleiche Entitätsgruppe zur gleichen Zeit zu aktualisieren, wird dazu führen, dass einige Benutzer ihre Transaktionen erneut versuchen, möglicherweise einige zu fehlschlagen, um Änderungen zu begehen. Setzen Sie nicht alle der Entitäten der Anwendung unter eine Wurzel.

Jede Transaktion in einer Entität in einer Gruppe führt dazu, dass andere Schreibvorgänge in derselben Entitätsgruppe fehlschlagen.Wenn Sie eine große Entitätsgruppe mit vielen Schreibvorgängen haben, führt dies zu vielen Konflikten. Ihre App muss dann die erwarteten Schreibfehler verarbeiten. Avoiding datastore contention geht ausführlicher auf die Strategien ein, die Sie verwenden können, um die Konkurrenz zu minimieren.

+0

Ok, endlich habe ich es! Also im Grunde der Satz aus dem Tutorial "Verwenden Sie nur Entity-Gruppen, wenn sie für Transaktionen benötigt werden" ist nicht wirklich richtig, weil es andere Anwendungen hat ... – Joel

+3

Das ist richtig, es ist ein bisschen irreführend. Ich denke, der Punkt ist, wirklich zu denken, bevor Sie Entitätsgruppen verwenden, denken Sie nicht nur, dass es eine nette logische Möglichkeit ist, Daten zu gruppieren. Es gibt einige nicht-transaktionale Vorteile, z. B. Leistung. Brett Slatkin schlug etwas vor, das er "Relation Index Entities" nannte, indem er Entity Groups verwendete: http://code.google.com/events/io/2009/sessions/BuildingScalableComplexApps.html –

+1

kleine Klarstellung: Ich denke, wo James sagt " Jede Transaktion in einer Entität in einer Gruppe führt dazu, dass andere Schreibvorgänge in derselben Entitätsgruppe fehlschlagen ", meint er" Any WRITE transaction ... ". Eine READ-Transaktion für eine Entitätsgruppe führt nicht dazu, dass gleichzeitige WRITE-Transaktionen fehlschlagen (und die Schreibvorgänge führen nicht dazu, dass gleichzeitige Lesevorgänge fehlschlagen). Bitte korrigieren Sie mich, wenn das falsch ist. –

0

Wenn Sie A -> B -> C speichern, hat A viele Bs, und ein B hat viele Cs. Wenn Sie A -> B und A -> C speichern, hat A viele Bs und viele Cs. Mit anderen Worten, ein C gehört nicht zu einem einzelnen B.

Welche Struktur Sie verwenden, hängt wirklich von den Daten ab, die Sie speichern.

Wenn viele Schreibzugriffe verwenden, können Sie nicht intuitiv Dinge zu Ihrem entitygroups zu tun haben, sehen Sharding Counters für ein Beispiel dafür:

+0

Danke für die schnelle Antwort. Ich verstehe die Idee, dass C im ersten Fall zu B "gehört", aber nicht in der zweiten (wie ein Baum). Aber was bedeutet "gehört" im Falle von Entitätsgruppen? Was nützt mir die Tatsache, dass sie miteinander verbunden sind? Wenn die ganze Idee in Entitätsgruppen Transaktionen zwischen Entitäten erlauben soll und in beiden Fällen erwähnte Transaktionen mit A, B und C erlaubt sind, was bekomme ich von der Tatsache, dass B und C verbunden sind? – Joel

+0

Das gleiche wie die Antwort von James :-). Ein einfaches Beispiel ist eine Sammlung von Dateien als ein Archiv, ähnlich wie ein Zip. Sie könnten Archiv -> Dateien -> Dateieigenschaften haben. Jetzt kann jede Datei Eigenschaften haben (auf die mit dem Vorgänger zugegriffen werden kann). Wenn Sie Archiv -> Dateien und Archiv -> Dateieigenschaften haben, gibt es so etwas nicht. –

+0

Hey, thnx für die Antwort :) Allerdings verstehe ich immer noch nicht vollständig, da Sie ReferenceProperty für den Zweck verwenden können. Zitat aus Google Tutorial: "Verwenden Sie nur Entity-Gruppen, wenn sie für Transaktionen benötigt werden. Für andere Beziehungen zwischen Entitäten, verwenden Sie ReferenceProperty Eigenschaften und Key-Werte, die in Abfragen verwendet werden können." Das stört mich :) – Joel

1

Tatsächlich ist Transaktion ein Nebeneffekt von Entitätsgruppen. Da Entitätsgruppenzeilen gemeinsam angeordnet sind, sind Transaktionen auf ihnen überhaupt möglich.

Ich würde sogar so weit gehen zu behaupten, dass Entitätsgruppen intrinsische Eigenschaft des Datenspeichers ist, die es hierarchischen Datenbanken ähnelt.