Domanda

Rails utilizza il concetto di migrazioni per gestire le modifiche del modello utilizzando l'API ActiveRecord.

CouchDB utilizza JSON (mappe e matrici nidificate) per rappresentare i suoi oggetti modello.

Nel lavorare con CouchDB finora, non vedo buoni modi per riconoscere quando la struttura del documento è cambiata (oltre a essere disciplinata come sviluppatore) o per migrare documenti da un vecchio a un nuovo modello.

Esistono funzionalità esistenti o hai le migliori pratiche per gestire le modifiche al modello in CouchDB?

È stato utile?

Soluzione

Tempo per il lavaggio del cervello da RDBMS. :)

Uno dei maggiori punti del design senza schema di couchdb è diretto a prevenire la necessità di migrazioni. La rappresentazione JSON degli oggetti semplifica semplicemente la digitazione dei tuoi oggetti.

Ad esempio, dato che hai un'app Web di tipo blog con post e qualsiasi cosa stravagante le persone memorizzano in un blog. I documenti dei tuoi post hanno campi come autore, titolo, creati a, ecc. Ora vieni e pensi a te stesso, "dovrei tracciare in quale fase sta la luna quando pubblico i miei post ..." puoi semplicemente iniziare ad aggiungere moon_phase come attributo ai nuovi post.

Se vuoi essere completo, tornerai indietro e aggiungere moon_phase ai vecchi post, ma non è strettamente necessario.

Nelle tue viste, puoi accedere a moon_phase come attributo. E sarà nullo o causerà un'eccezione o qualcosa del genere. (Non sono un esperto di JS, penso che null sia la risposta giusta)

Il fatto è che non importa. Se hai voglia di cambiare qualcosa, basta cambiarlo. Assicurati però che le tue opinioni comprendano quel cambiamento. Il che nella mia esperienza non richiede molto.

Inoltre, se sei davvero paranoico, potresti memorizzare un attributo versione / tipo, come in:

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

Spero che sia d'aiuto.

Altri suggerimenti

Se ti piacciono gli schemi e vuoi comunque usare CouchDB otterrai una "mancata corrispondenza di impedenza".

Tuttavia, avendo " migrazioni " non è così difficile. Aggiungi un elemento schema_version a ciascun documento. Quindi utilizza la tua funzione di lettura dei documenti " include l'aggiornamento. Qualcosa del genere:

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

Se vuoi aggiornare l'intero DB in una sola volta, chiama read (doc_id) per ogni documento.

Scopri ActiveCouch .

CouchDB è intenzionalmente privo di schemi, quindi non esiste un mapping 1 a 1 di concetti dalle migrazioni ActiveRecord a un equivalente CouchDB. Tuttavia, ActiveCouch include le migrazioni per le "viste" di CouchDB.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top