2014-05-15 7 views
5

Ich versuche, eine grundlegende lineare kommentieren für mein Blog in App Engine zu modellieren (Sie können es bei http://codeinsider.us sehen). Meine Hauptklassen von Objekten sind:Was sind gute Beispiele für App Engine NDB-Kommentarmodelle?

Benutzer, Artikel, Kommentare

Ein Benutzer viele Kommentare haben und sollten auf einen Blick ihre Kommentare betrachten können.

Ein Artikel werden viele Kommentare und sollten auf einen Blick sichtbar.

Ein Kommentar wird mit genau einem Benutzer und genau ein Artikel zugeordnet wird.

Ich weiß, wie ich dies in einer relationalen Standarddatenbank erstellen könnte - ich könnte sagen, Tabellen für Kommentare, Benutzer und Artikel, mit Fremdschlüsseln, um sie zusammen, Eindeutigkeit Einschränkungen für Artikel und Benutzer, und keine auf Kommentare usw. Nichts Besonderes.

Was ist die beste Möglichkeit, dies in Python App Engine mit NDB zu modellieren? ndb.KeyProperty scheint ebenso interessant zu sein wie StructuredProperty. Ich glaube jedoch nicht, dass ich StructuredProperty verwenden kann, da ein Kommentar sowohl einem Benutzer als auch einem Artikel "gehören" kann. Aber mit ndb.KeyProperty scheint es, wie die keyProperty keine Kontrolle oder Validierungslogik machen, so würde ich das auf meinem eigenen implementieren.

Die andere Sache, die ich tun kann, ist nur in das Handtuch werfen und speichern riesige JSON-Blobs in Benutzer und Artikel, die die Schlüssel und Arten von Kommentaren darstellen. Das ist vielleicht keine schlechte Lösung.

Irgendwelche Gedanken?

Edit: Dies wird hoch lesen, niedrig schreiben. Ich mag Kommentare zu Kommentaren hinzufügen (upvotes/downvotes), aber selbst dann wird es stark auf Lesevorgänge gewichtet.

Antwort

4

Ich empfehle Ihnen, sorgfältig darüber nachzudenken, welche Funktionen Sie bereitstellen möchten, da die Strukturierung Ihrer Modelle in irgendeiner Weise einige Änderungen in der Zukunft erschweren kann.

Ich werde dies wie folgt tun:

Zunächst sei angenommen, eine eventuelle Konsistenz. Egal, wie Sie dies gestalten, Sie werden in einigen Abfragen eine gewisse Konsistenz haben.

Machen Sie einen KeyProperty "Eigentümer" im Artikel, um den user_key zu speichern. Wenn Sie eine starke Konsistenz beim Abfragen der Artikel eines einzelnen Benutzers erreichen möchten, dann verwenden Sie einfach keyProperty "owner", um den user_key zum übergeordneten Element des Artikels zu machen (dadurch wird eine Entitätsgruppe für den Benutzer und seine Artikel erstellt und ist hier in Ordnung)).

Mit Kommentaren können Sie mehr Dinge tun.

  1. Wenn Sie erwarten, weniger als 100 (je nach Artikel Größe auf dem Datenspeicher kann mehr sein) Kommentare für jeden Artikel erstellen Um einen Kommentar KeyProperty (Wiederholung = True) in Artikel alle Kommentare Schlüssel zu speichern und dann hol sie mit get_multi (starke Konsistenz).

    Um den Kommentar zu erstellen und auch die Artikelkommentareigenschaft zu ändern, benötigen Sie möglicherweise eine Transaktion, weil Sie die zwei Operationen oder nicht von ihnen ausführen möchten. Aber .. die zwei Entitäten sind nicht in der gleichen Entity-Gruppe, also: 1) verwenden Sie Gruppenkreuzung oder 2) machen Sie die Elternteil des Kommentars der Artikel (diese zweite Option wird einige Konsequenzen haben später diskutiert) Anzahl der Kommentare sind einfach, aber begrenzt auf 100 oder mehr Kommentare wie zuvor gesagt.

  2. Erstellen Sie ein Kommentar ndb-Modell mit zwei KeyProperties, "Besitzer" und "Artikel". Der Artikel ruft Kommentare mit einer Abfrage ab. Um alle Kommentare innerhalb eines Artikels abzufragen, haben Sie möglicherweise Konsistenz, es sei denn, Sie machen den Artikel das übergeordnete Element des Kommentars (in diesem Fall nicht den Artikel KeyProperty natürlich erstellen). Dieser Ansatz ermöglicht viele Kommentare.

Das Problem der Entitätsgruppen mit, dass zum Beispiel, wenn Sie Kommentare stimmen lassen, dann auf jeden Kommentar eine einzelne Schreiboperation in dem Loch Entitätsgruppe des Artikels nicht berühren jede Schreib blockiert. So kann die Erstellung und Abstimmung durch andere Benutzer beeinflusst werden. Aber das interessiert Sie nicht wirklich, wenn Sie nur wenige Stimmen erwarten und Sie die Entitätsgruppen klein halten.

Wenn Sie Kommentarstimmen zulassen möchten, kann dies sehr kompliziert werden, da Sie beispielsweise nur eine Stimme pro Benutzer wünschen. Dies erfordert zusätzliche Beziehungen, die vorher durchdacht werden müssen.

Persönlich bevorzuge ich es, fast immer Konsistenz anzunehmen.

Weitere Ansätze sind möglich, aber ich mag diese beiden.

1

Hoch lesen, niedrig schreiben Szenario ist die Spezialität auf GAE, das ist also eine gute Sache für Ihren Zweck.

Ich würde die ancestry feature des GAE-Modells nutzen, da es Ihnen transaktionale/atomare Operationen innerhalb einer Entitätsgruppe gewährleistet. Ich schätze, du brauchst nicht viel davon, aber es ist eine gute Sache, immer noch zu haben.

Die richtige Struktur wird durch die Art und Weise behandeln Sie werden bestimmt/Ihre Daten verwenden. Ich bin der typische Fall in Ihrem Blog Kommentare zu einem Artikel zu zeigen, wäre unter der Annahme, so würde ich Ihren Kommentar Modell ein Kind Ihres Artikels Modell machen - Sie dann Kommentare für einen bestimmten (Artikel) Vorfahr abfragen könnte und das wäre großartig skalieren.

Ich würde eine KeyProperty für den Autor in den Kommentar einfügen, da dies hauptsächlich verwendet würde, um einen Benutzer von dem Schlüssel, den ich vermute, abzurufen. Wenn Sie die KeyProperty-Funktionalität erweitern möchten, können Sie dies tun. Hier ist ein Beispiel, wie man KeyProperty behave as ReferenceProperty in db verwendet. (Punkt 1.)

+0

Danke! Die Verwendung der Vorgängerfunktion ist also sinnvoll für Artikel -> Kommentare, aber muss ich nicht immer noch weitere Leseabfragen durchführen, wenn ein Benutzer alle seine Kommentare anzeigen möchte? – mallyvai

+0

Auch, wenn ich das richtig verstehe, würden die Kommentare eines einzelnen Artikels nicht "N" lesen? Die Lösung, die ich gerade ausprobiere, ist eine Art Denormalisierung - jeder Artikel hat eine Liste mit Strukturierten Eigenschaften von Kommentaren, und ein Benutzer hat die gleiche Liste mit Strukturierten Eigenschaften von Kommentaren (tatsächliche Kommentare, keine Referenzen). Ich verwende eine gruppenübergreifende Transaktion, um das Update auf die richtige Art und Weise durchzuführen. Der Kompromiss hier scheint zu sein, dass zu viel paralleles Schreiben zu Bombenanschlägen führen wird, aber das ist okay für die Zeit ... – mallyvai

Verwandte Themen