Modifiche al modello di documento CouchDB?
-
02-07-2019 - |
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?
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.