2008-11-20 12 views
8

Ich frage mich, ob jemand einige konzeptionelle Hinweise auf eine effiziente Möglichkeit geben könnte, ein Datenmodell zu erstellen, um das unten beschriebene einfache System zu erreichen. 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.Beratung zur Datenmodellierung für Blog-Tagging-System in Google App Engine

Was Ich mag würde modellieren ist:

Ein Blog-Artikel, die 0-n-Tags gegeben 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 zu dem hier bei stackoverflow.

Meine normale Denkweise wäre eine Beziehung zwischen Tags und Blog-Artikeln 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 zum Nachverfolgen von Tags, 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.

Haben Sie Vorschläge, wie Sie GAE möglichst effizient angehen können?

Antwort

7

Vielen Dank an Sie für Ihre 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 speichert außerdem die 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.

+0

Nur der Ansatz, den ich vorschlug, außer dass ich keine Zeit fand. :) –

1

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!

+0

Ich dachte many-to-many auch, aber auch die Dokumentation bei Google dagegen warnt in allen außer den notwendigsten Situationen. Guter Rat über Profilerstellung, ich denke, ich werde versuchen, einige Tests mit verschiedenen Ansätzen durchzuführen und die Ergebnisse hier zu melden. – Matty

1

Eine Möglichkeit ist mit Expando, wo Sie einen Tag hinzufügen mögen:

setattr(entity, 'tag_'+tag_name, True) 

Dann Sie alle Entitäten wie mit einem Tag nicht abfragen:

def get_all_with_tag(model_class, tag): 
    return model_class.all().filter('tag_%s =' % tag, True) 

Natürlich haben Sie um Ihre Tags als richtige Python-IDs zu bereinigen. Ich habe das nicht versucht, also bin ich mir nicht sicher, ob es wirklich eine gute Lösung ist.

+1

Was ist, wenn Tagnamen nicht englisch sein müssen? –

2

Zählwerte vorge berechnet wird nicht nur praktischen , aber auch erforderlich, weil die Zählung() Funktion maximal 1000 zurückgibt. Wenn Schreibkonflikte ein Problem darstellen, sollten Sie das Beispiel für den Sharked-Zähler überprüfen.

http://code.google.com/appengine/articles/sharding_counters.html

+0

In den neuesten Versionen von gae sdk hat die Funktion count() keine Obergrenze: http://code.google.com/appengine/docs/python/datastore/queryclass.html#Query_count –

+0

true! wird bearbeiten. – mainsocial