9

Aus einem relationalen Datenbankhintergrund, wie viele andere sicher sind, suche ich nach festen Richtlinien für das Einrichten/Entwerfen meines Datenspeichers bei Google App-Engine Gibt es irgendwelche guten Faustregeln für die Einrichtung solcher schemalosen Datenspeicher? Ich verstehe einige der Grundlagen wie Denormalisierung, da Sie Joins nicht tun können, aber ich fragte mich, welche anderen Empfehlungen die Leute hatten.Schema-lose Design-Richtlinien für den Google App Engine Datastore und andere NoSQL-DBs

Das besondere einfache Beispiel, mit dem ich arbeite, betrifft die Speicherung von Suchen und deren Ergebnissen. Zum Beispiel habe ich die folgenden beiden Modelle definiert in meinem Google App Engine App mit Python:

class Search(db.Model): 
    who = db.StringProperty() 
    what = db.StringProperty() 
    where = db.StringProperty() 

    createDate = db.DateTimeProperty(auto_now_add=True) 

class SearchResult(db.Model): 
    title = db.StringProperty() 
    content = db.StringProperty() 

    who = db.StringProperty() 
    what = db.StringProperty() 
    where = db.StringProperty() 

    createDate = db.DateTimeProperty(auto_now_add=True) 

Ich bin ein Bündel von Eigenschaften zwischen den Modellen aus Gründen der Denormalisierung duplizieren, da ich nicht Search und SearchResult beitreten zusammen. Macht das Sinn? Oder sollte ich eine Such-ID im Modell SearchResult speichern und die beiden Modelle im Code "verbinden", wenn ich sie aus dem Datenspeicher abrufe? Bitte beachten Sie, dass dies ein einfaches Beispiel ist. Beide Modelle werden viel mehr Eigenschaften haben und die Art, wie ich mich dem jetzt annähere, würde ich jede Eigenschaft, die ich in das Suchmodell einfüge, ebenfalls in das SearchResult Modell einfügen.

Antwort

6

Kopieren Sie die Eigenschaften nicht, wenn sie zwischen SearchResult und Search immer gleich sind. Wenn eine SearchResult einen Verweis auf eine Search haben sollte, halten Sie eine ReferenceProperty auf die Suche zeigen. Dieser speichert im Prinzip die zugehörige SearchKey im Modell.

class SearchResult(db.Model): 
    search = db.ReferenceProperty(Search, required=True) 
    # other stuff... 

Ich empfehle Ihnen auch einige der App Engine videos from last year's Google I/O (und von 2008) zu beobachten, insbesondere this one von Brett Slatkin und this one von Ryan Barrett. Sie sind alle ziemlich hilfreiche Videos, wenn Sie die Zeit haben, aber ich fand diese zwei besonders, um wirklich groß zu sein.

+0

Ausgezeichnet, danke Mann. – jamesaharvey