2008-09-24 9 views
8

Rails verwendet das Migrationskonzept, um Modelländerungen mithilfe der ActiveRecord-API zu behandeln.CouchDB Document Model Änderungen?

CouchDB verwendet JSON (verschachtelte Maps und Arrays), um seine Modellobjekte darzustellen.

Wenn ich bisher mit CouchDB arbeite, sehe ich keine guten Möglichkeiten zu erkennen, wann sich die Struktur des Dokuments geändert hat (anders als diszipliniert als Entwickler) oder Dokumente von einem alten auf ein neues Modell zu migrieren.

Gibt es bestehende Funktionen oder haben Sie Best Practices für die Handhabung von Modelländerungen in CouchDB?

Antwort

9

Zeit für RDBMS-Gehirnwäsche. :)

Einer der wichtigsten Punkte des schemaless-Designs von couchdb zielt direkt darauf ab, die Notwendigkeit von Migrationen zu verhindern. Die JSON-Darstellung von Objekten macht es einfach, Ihre Objekte einfach zu ducken.

Zum Beispiel, da Sie eine Blog-Art Web-App mit Posts und was auch immer fancy Dinge haben Menschen in einem Blog speichern. Ihre Post-Dokumente haben Felder wie Autor, Titel, erstellt, usw. Jetzt kommen Sie und denken Sie an sich selbst, "Ich sollte verfolgen, in welcher Phase der Mond ist, wenn ich meine Posts veröffentlichen ..." Sie können einfach beginnen, moon_phase als hinzuzufügen ein Attribut für neue Posts.

Wenn Sie vollständig sein möchten, würden Sie zurückkehren und moon_phase zu alten Posts hinzufügen, aber das ist nicht unbedingt notwendig.

In Ihren Ansichten können Sie auf moon_phase als Attribut zugreifen. Und es wird null oder eine Ausnahme oder etwas verursachen. (Kein JS-Experte, ich denke, null ist die richtige Antwort)

Die Sache ist, es ist nicht wirklich wichtig. Wenn Sie etwas verändern möchten, ändern Sie es einfach. Stellen Sie jedoch sicher, dass Ihre Ansichten diese Änderung verstehen. Was meiner Erfahrung nach nicht viel verlangt.

Auch, wenn Sie wirklich paranoid sind, könnten speichern Sie eine Version/type-Attribut, wie in:

{ 
    _id: "foo-post", 
    _rev: "23490AD", 
    type: "post", 
    typevers: 0, 
    moon_phase: "full" 
} 

Hoffnung, das hilft.

3

Check out ActiveCouch: http://code.google.com/p/activecouch/

CouchDB ist schema weniger absichtlich, so dass es nicht eine 1-zu-1-Abbildung von Konzepten aus der Active Migrationen auf einen CouchDB-äquivalent. ActiveCouch enthält jedoch Migrationen für CouchDBs "Ansichten".

+1

Sieht aus wie activcouch ist jetzt auf GitHub - http://github.com/arunthampi/activecouch/tree/master – Evan

3

Wenn Sie Schemas haben und immer noch CouchDB verwenden möchten, erhalten Sie eine "Impedanz-Mismatch".

Nichtsdestotrotz ist "Migration" nicht so schwer. Fügen Sie jedem Dokument ein schema_version Element hinzu. Dann haben Sie Ihre "Dokument lesen Funktion" Update enthalten. Etwas wie folgt aus:

def read(doc_id): 
    doc = db.get(doc_id) 
    if doc.schema_version == 1: 
     # version 1 had names broken down too much 
     doc.name = "%s %s" % (doc.first, doc.last) 
     del doc.first 
     del doc.last 
     doc.schema_version = 2 
     db.put(doc) 
    if doc.schema_version == 2: weight 
     # version 2 used kg instead of g 
     doc.weight_g = doc.weight_kg * 1000 
     del doc.volume_kg 
     doc.schema_version = 3 
     db.put(doc) 
    return doc 

Wenn Sie die gesamte DB auf einmal nur nennen read(doc_id) für jedes Dokument aktualisieren möchten.