2009-07-09 6 views
19

Ich kenne alle Details darüber, wie Entitätsgruppen im GAE-Speicher funktionieren, aber gestern (beim App Engine Meetup in Palo Alto), als ein Moderator seine Verwendung von Entitätsgruppen erklärte, fiel mir auf, dass ich nie wirklich Gebrauch davon gemacht habe von ihnen in meinen eigenen GAE-Apps, und ich erinnere mich nicht, sie in Open-Source-GAE-Apps verwendet zu sehen, die ich verwendet habe.Gute Open-Source-Beispiele für die Verwendung von Entitätsgruppen in App Engine?

Also, ich vermute, ich habe gerade solche Beispiele übersehen (nicht bemerkt oder erinnert), weil ich einfach nicht genug an sie gewöhnt bin, um sofort "Verwendung von Entitätsgruppe" mit "Art von Anwendungsproblemen, die gelöst werden" zu verbinden - und ich denke, ich sollte Abhilfe schaffen, indem ich solche Quellen mit diesem Ziel untersuche und mich darauf konzentriere, welches Problem die EG-Nutzung löst (dh warum die App damit arbeitet, aber ohne oder ohne schlechtes Funktionieren nicht funktionieren würde) es).

Kann jemand gute URLs für solchen Code empfehlen? (Essays wären auch willkommen, wenn sie sich auf die Problemlösung auf Anwendungsebene konzentrieren, aber nicht wenn sie, wie die meisten, die ich gesehen habe, sich nur auf die Details konzentrieren, wie EGs funktionieren! -).

Antwort

22

Die Hauptverwendung von Entitätsgruppen besteht darin, die Möglichkeit bereitzustellen, mehr als eine Entität in einer Transaktion zu aktualisieren.

Wenn Sie sie nicht verwenden mussten, zählen Sie Ihren Segen. Entweder haben Sie Ihre Datenmodelle so entworfen, dass keine zwei Entitäten jemals gleichzeitig aktualisiert werden müssen, um konsistent zu bleiben, sonst brauchen Sie sie, aber Sie haben Glück :)

Stellen Sie sich vor, dass ich habe einen Rechnungseinheitstyp und einen LineItem-Entitätstyp. Einer Rechnung können mehrere LineItems zugeordnet sein. Meine Rechnungseinheit hat ein Feld namens LastUpdated. Jedes Mal, wenn ein LineItem zu meiner Rechnung hinzugefügt wird, möchte ich das aktuelle Datum im Feld LastUpdated speichern.

Meine Update-Funktion wie diese (Pseudo-Code) aussehen könnte

invoice.lastUpdated = now() 
lineitem = new lineitem() 

invoice.put() 
lineitem.put() 

Was passiert, wenn die Rechnung put() erfolgreich ist und die lineitem put() fehlschlägt? Mein Rechnungsdatum zeigt an, dass etwas aktualisiert wurde, aber das eigentliche Update (das neue LineItem) wäre nicht vorhanden. Die Lösung besteht darin, beide puts() innerhalb einer Transaktion zu platzieren.

Eine alternative Lösung wäre, eine Abfrage zu verwenden, um das Datum des zuletzt eingefügten LineItem zu finden, anstatt diese Daten im Feld LastUpdated zu speichern. Das würde jedoch bedeuten, dass Sie sowohl die Rechnung als auch alle Zeilenelemente jedes Mal abholen müssen, wenn Sie wissen wollten, wann ein Zeilenelement zuletzt hinzugefügt wurde. Das kostet Sie wertvolle Datenspeicherkontingente.

EDIT ZU POSTER KOMMENTAR REAGIEREN

Ah. Ich glaube, ich verstehe deine Verwirrung. Die obigen Absätze zeigen, warum Transaktionen wichtig sind. Aber Sie sagen, Sie interessieren sich immer noch nicht für Entitätsgruppen, weil Sie nicht sehen, wie sie sich auf Transaktionen beziehen. Wenn Sie db.run-in-transaction verwenden, verwenden Sie Entitätsgruppen, vielleicht ohne es zu merken! Jede Transaktion umfasst eine einzige Entitätsgruppe und jede Transaktion kann nur Entitäten betreffen, die derselben Gruppe angehören. siehe here

„Alle Datenspeichervorgänge in einer Transaktion auf Entitäten in derselben Einheit Gruppe arbeiten müssen“.

Was machen Sie bei Ihren Transaktionen? Es gibt viele gute Gründe, Transaktionen mit nur einer Entität zu verwenden, die sich standardmäßig in einer eigenen Unternehmensgruppe befindet.Aber manchmal müssen Sie 2 oder mehr Entitäten synchron halten, wie in meinem obigen Beispiel. Wenn sich die Invoice- und die LineItem-Entitäten nicht in derselben Entitätsgruppe befinden, konnten Sie die Änderungen in einem db.run-in-transaction-Aufruf nicht umbrechen. Wenn Sie also mit 2 oder mehr Entitäten arbeiten möchten, müssen Sie zunächst sicherstellen, dass sie sich in derselben Gruppe befinden. Hoffnung, die es klarer macht, warum sie nützlich sind.

+1

Ich habe db.run_in_transaction (siehe http://code.google.com/appengine/docs/python/datastore/functions.html) für Transaktionen verwendet (oder natürlich get_or_insert für diesen speziellen Fall, siehe auch http : //code.google.com/appengine/docs/python/datastore/transactions.html) - Was ist der Vorteil von Entitätsgruppen? –

+1

autsch! mein erster Downvote. Der Vorteil von Entitätsgruppen gegenüber Transaktionen besteht darin, dass Transaktionen nicht außerhalb von Entitätsgruppen arbeiten. Wenn Sie Transaktionen verwendet haben, verwenden Sie Entitätsgruppen, wenn auch nur implizit. Jede Entität ist standardmäßig in einer Gruppe. Transaktionen sind in ihrem Umfang darauf beschränkt, jeweils eine Unternehmensgruppe zu beeinflussen. Ich habe meine Antwort mit einer längeren Erklärung bearbeitet. –

+0

Warum wird dies abgelehnt? Es ist eine gute Antwort. –

2

Ich habe sie here verwendet. Ich setze mein Kundenobjekt als Eltern der Kartenmarkierungen. Dies schafft eine Einheit Gruppe für jeden Kunden und gibt mir zwei Vorteile:

  1. Getting den Marker einen Kunden ist viel schneller, weil sie physisch mit dem Kunden-Objekt gespeichert sind (auf dem gleichen Server, wahrscheinlich auf. die gleiche Platte)

  2. Ich kann die Markierungen für einen Kunden in einer Transaktion ändern. Ich vermute, dass der Grund dafür, dass Transaktionen erfordern, dass alle Objekte, auf denen sie operieren, in der gleichen Gruppe liegen, weil sie am selben physischen Ort gespeichert sind, was es einfacher macht, eine Sperre für die Daten zu implementieren.

1

Ich habe sie here in diesem einfachen Wiki-System verwendet. Die neueste Version einer Seite ist immer eine Root-Entität und frühere Versionen haben die neueste Version als Vorgänger. Die Kopieroperation wird in einer Transaktion ausgeführt, um die Versionskonsistenz beizubehalten und bei Parallelität den Verlust einer Version zu vermeiden.

Verwandte Themen