Ich frage mich, ob jemand einen konzeptionellen Ratschlag für eine effiziente Methode geben könnte, ein Datenmodell zu erstellen, um das unten beschriebene einfache System zu realisieren. Bin ein wenig neu zu denken in einer nicht-relationalen Art und möchte versuchen, offensichtliche Fallstricke zu vermeiden. Es ist mein Verständnis, dass ein Grundprinzip ist, dass "Speicher billig ist, mach dir keine Sorgen über Datenduplizierung" wie du es in einem normalisierten RDBMS machen könntest.
Was ich gerne modellieren würde:
Ein Blogartikel, der mit 0-n Tags versehen werden kann. Viele Blogartikel können dasselbe Tag verwenden. Wenn das Abrufen von Daten das Abrufen aller Artikel ermöglichen würde, die mit einem Tag übereinstimmen. In vielerlei Hinsicht sehr ähnlich dem hier bei stackoverflow durchgeführten Ansatz.
Meine normale Einstellung wäre, eine Beziehung zwischen mehreren Tags und Blogartikeln zu erstellen. Ich denke jedoch im Zusammenhang mit GAE, dass dies teuer wäre, obwohl ich Beispiele dafür gesehen habe.
Vielleicht eine ListProperty, die jedes Tag als Teil der Artikelentitäten enthält, und ein zweites Datenmodell, um Tags zu verfolgen, wenn sie hinzugefügt und gelöscht werden? Auf diese Weise sind keine Beziehungen erforderlich, und die ListProperty lässt weiterhin Abfragen zu, bei denen ein Listenelement-Matching Ergebnisse liefert.
Irgendwelche Vorschläge, wie Sie GAE am effizientesten angehen können?
Danke euch beiden für eure Vorschläge. Ich habe (erste Iteration) wie folgt implementiert. Nicht sicher, ob es der beste Ansatz ist, aber es funktioniert.
Klasse A = Artikel. Hat eine StringListProperty, die auf ihren Listenelementen abgefragt werden kann
Klasse B = Tags. Eine Entität pro Tag behält auch eine laufende Anzahl der Gesamtzahl der Artikel, die jedes Tag verwenden.
Datenänderungen an A werden von Wartungsarbeiten an B begleitet. Das Denken, dass das Rechnen vorberechnet ist, ist ein guter Ansatz in einer lese-schweren Umgebung.
counts, die vorberechnet werden, sind nicht nur praktisch , sondern auch notwendig, weil die count () Funktion ein Maximum von 1000 zurückgibt. Wenn Schreibkonflikte ein Problem darstellen könnten, sollten Sie das Beispiel für den Sharked Counter ausprobieren.
Viele-zu-viele klingt vernünftig. Vielleicht sollten Sie es zuerst versuchen, um zu sehen, ob es wirklich teuer ist.
Gute Sache über G.A.E. ist, dass es Ihnen sagen wird, wenn Sie zu viele Zyklen verwenden. Profiling kostenlos!
Ein möglicher Weg ist mit Expando
, wo Sie ein Tag wie folgt hinzufügen würden:
Dann könnten Sie alle Entitäten mit einem Tag wie:
abfragen %Vor%Natürlich müssen Sie Ihre Tags als richtige Python-IDs aufräumen. Ich habe das nicht versucht, also bin ich mir nicht sicher, ob es wirklich eine gute Lösung ist.
Tags und Links python google-app-engine data-modeling bigtable