2009-08-26 12 views
21

avrebbero i seguenti essere una strategia praticabile per l'attuazione delle versioni (usando "esempio", come un tipo di documento del campione):CouchDB strategia di controllo delle versioni

Avere un documento originale in cui il campo tipo è denominato example_original.

Le modifiche successive apportate al documento sono tutte di tipo example_change e l'id del documento original_original come chiave. Il cambiamento porterebbe anche un timestamp.

Mantieni un documento con tipo example_current che è il risultato di example_original con tutto example_change "applicato". Un nuovo documento example_change verrà automaticamente applicato a questo documento.

Trovare una versione specifica consiste nel recuperare il documento original_original e applicare le modifiche desiderate (principalmente fino a un determinato timestamp, ma potrebbe anche essere un numero di modifiche).

Devo dire che il mio caso d'uso comporterà un numero limitato di modifiche all'originale. La maggior parte degli aggiornamenti consisterà in nuovi documenti originali. Anche se questo è il mio attuale caso d'uso, sarei interessato anche a problemi che si verificherebbero se fossero apportate numerose modifiche.

Quali pro e contro vedi in questo approccio?

+0

Stai provando a modificare il contenuto del documento o la struttura del documento? – Dokie

+0

Solo il contenuto. I campi non verranno mai cancellati solo aggiunti. – mac

risposta

9

La mia prima preoccupazione è: quando si "ottiene" una determinata versione, è possibile applicare le modifiche all'originale senza modificare il database?

Hai mai bisogno di cancellare qualcosa dalla cronologia? Sei proprio sicuro? Davvero, davvero sicuro? Che ne dici di rami?

Tutto sommato, sembra una strategia complessa. Tieni presente che ho sentito parlare di CouchDB ma non l'ho mai usato. Mi piacerebbe andare per un approccio più semplice:

  1. Quando si crea un documento, si assegna un UUID. Non usare il nome o incontrerai dei problemi durante le operazioni di rinomina. Aggiungi un campo versione che legge "1". Creare un secondo documento che contiene un elenco di documenti con lo stesso UUID o aggiungere un puntatore "padre" al primo documento.

    Avere un "documento di storia" per documento consente una navigazione più veloce della cronologia ma i puntatori principali sono più "sicuri" (dato che non è possibile creare facilmente strutture illegali con essi).

  2. Quando si crea una nuova revisione, riutilizzare l'UUID e assegnare una nuova versione unica. Aggiorna il documento cronologico o il puntatore genitore.

Questa strategia è abbastanza semplice da implementare e consente tutti i tipi di flessibilità in seguito. È possibile cancellare facilmente parti della cronologia, rinominare è semplice e creare rami.

+0

Vedi il tuo punto, grazie per il suggerimento. Non avrò mai bisogno di cancellare qualcosa dalla cronologia, ma alcune modifiche potrebbero essere contrassegnate come "errore" o simili. Il supporto per la ramificazione non sarà necessario. – mac

1

Qual è lo stato commerciale di questi documenti, in particolare legale? Ho lavorato in situazioni in cui la tua proposta non sarebbe appropriata da un business in prospettiva, a causa della necessità di dimostrare che il documento presentato come v.3 è in realtà la versione 3 del documento. L'applicazione dinamica dei delta non taglierebbe la senape di conformità.

Se, come dici tu, le modifiche ai documenti non sono frequenti, non stai risparmiando molto spazio su disco memorizzando delta anziché documenti interi. La memorizzazione di interi documenti consente anche la previsione affidabile del tempo di recupero per qualsiasi documento. Riduce anche la complessità del processo di recupero.

+0

Non penso che questo rappresenterà un problema di conformità, a condizione che uno abbia un registro di controllo per tutti i documenti, inclusi i documenti di modifica. L'approccio è analogo a quello di un contratto originale e successive modifiche. – mac

1

Una strategia per il controllo delle versioni con CouchDB è NON compattare mai il database che contiene i documenti per i quali è necessario conservare una cronologia completa. Potresti ancora compattare altri database. Questa semplice strategia funziona oggi senza problemi con una strategia di risoluzione dei conflitti di modifica.

L'eliminazione di un documento può essere eseguita scrivendo una nuova versione senza contenuto ma una serie di proprietà eliminate.

I rami non possono essere eseguiti in questo modo perché il meccanismo di controllo delle versioni offre un singolo thread di revisioni.

Ora per il possibile futuro di CouchDB:

  • Oggi ogni revisione tiene una copia completa del documento, ma si potrebbe pensare che ottimizzazioni del motore di CouchDB potrebbe un delta Store Day.
  • È anche possibile che in futuro CouchDB offra un'API per impedire la compattazione di determinati tipi di documento. Ciò consentirebbe di mantenere tutti i documenti nello stesso database. Questa sarebbe una patch facile per CouchDB.
  • Questa strategia consente la gestione di filiali di documenti ma considerando la natura di CouchDB come un database di documenti, si tratta di una possibilità ragionevole, ma a lungo termine.
+0

Un'idea interessante, ma non un buon consiglio. Mentre si potrebbe implementare un sistema di versioning molto semplice semplicemente evitando la compattazione, si lavorerebbe contro il database invece di lavorare con esso. Meglio memorizzare ogni versione che si desidera conservare con un _id diverso, in modo che il database sappia che deve essere salvato. –

+0

@NickPerkins, ho specificatamente menzionato per non compattare il "database" che ... Ciò implica che potresti avere uno o più altri database che potresti ancora compattare. Pertanto questa soluzione non funziona contro il database. –

19

Simple Document Versioning with CouchDB

Il controllo delle versioni come allegati approccio descritto in questo articolo dovrebbe soddisfare esigenze di molte persone per il controllo delle versioni.

+2

i collegamenti non sono più attivi, ma [questo] (http://jchris.ic.ht/drl/_design/sofa/_list/post/post-page?startkey=%5B%22Versioning-docs-in-CouchDB % 22% 5D) contengono una panoramica dei 4 metodi descritti –

+0

Credo che questo sia un aggiornamento [collegamento] (https://blog.couchbase.com/how-implement-document-versioning-couchbase) –

+0

@BrianPutt: il collegamento che give sta parlando di CouchBase, che è diverso da CouchDB http://www.couchbase.com/couchbase-vs-couchdb –

Problemi correlati