2012-03-16 8 views
11

He leído un poco sobre CouchDB y estoy realmente intrigado por el hecho de que es "solo de anexar". I puede ser mal entendido, pero como yo lo entiendo, funciona un poco como esto: se añade¿Se puede acceder a los datos antiguos en CouchDB?

  • datos en tiempo de t0 con el PP diciendo que un usuario con el nombre de identificación de 1 es "Cedrik Martin"

  • una consulta que pregunta "¿cuál es el nombre del usuario con ID 1?" vuelve "Cedrik Martin"

  • en el momento t1 se hace una actualización de la narración DB: "Usuario con el nombre de ID de 1 es Cedric Martin" (cambiando la 'k' a una 'c')

  • una consulta pidiendo nuevamente "¿cuál es el nombre del usuario con ID 1" ahora vuelve "Cedric Martin"

Es un ejemplo tonto, pero es porque me gustaría entender algo fundamental sobre CouchDB.

Visto que la actualización se ha realizado utilizando un apéndice al final de la base de datos, ¿es posible consultar la base de datos "como estaba en el tiempo t0", sin hacer nada especial?

¿Puedo preguntarle a CouchDB "¿Cuál era el nombre del usuario con ID 1 en el momento t0?"?

EDITAR la primera respuesta es muy interesante y así tengo una pregunta más precisa: el tiempo que no estoy "compactación" un CouchDB, me puede escribir consultas que son de alguna manera "referencialmente transparente" (es decir, van a siempre producen el mismo resultado)? Por ejemplo, si consulto "documento d en la revisión r", ¿tengo la garantía de obtener siempre la misma respuesta siempre que no compacte la base de datos?

+0

Quizás este enlace es útil para usted. http://wiki.apache.org/couchdb/HTTP_Document_API#Accessing_Previous_Revisions –

Respuesta

26

Quizás el error más común cometido con CouchDB sea creer que proporciona un sistema de control de versiones para sus datos. No es asi.

La compactación elimina todas las revisiones no últimas de todos los documentos y la replicación solo replica las últimas revisiones de cualquier documento. Si necesita versiones históricas, debe conservarlas en su última revisión usando cualquier esquema que le parezca bueno.

"_rev" es, como se señaló, un nombre desafortunado, pero no se ha sugerido ninguna otra palabra que sea más clara. "_mvcc" y "_mcvv_token" han sido sugeridos anteriormente. El problema con ambos es que cualquier descripción de lo que está ocurriendo allí incluirá inevitablemente las "versiones anteriores que permanecen en el disco hasta la compactación", lo que aún implicará que se trata de un sistema de control de versiones del usuario.

Para responder a la pregunta "¿Puedo preguntar CouchDB" ¿Cuál era el nombre del usuario con ID 1 en el momento t0? "?", La respuesta corta es "NO". La respuesta larga es "SÍ, pero luego no funcionará", que es solo otra forma de decir "NO". :)

+0

muchas gracias por estas informaciones, ¡es muy interesante! –

1

t0 (t1 ...) está en couchdb llamado "revisión". Cada vez que cambia un documento, aumenta el número de revisión. Las revisiones antiguas de los documentos se almacenan hasta que ya no desee tener revisiones antiguas, y le dice a la base de datos "compacta". mirada en "Acceso a las revisiones anteriores" en http://wiki.apache.org/couchdb/HTTP_Document_API

+0

+1 ... eso es * muy * interesante. Edité mi pregunta un poco más: básicamente, me gustaría saber si las consultas pueden ser referencialmente transparentes (cuando se especifica una revisión específica). –

3

respuesta a la segunda pregunta: SÍ.

Los datos modificados siempre se agregan al árbol con un número de revisión más alto. la misma rev nunca cambia.

Para su información:

La revisión (1-abcdef) ist construido de esa manera: 1 = Número de versión (aquí: primera versión), segundo es un hash sobre el documento de contenido (no estoy seguro, si hay algo más de "sal" allí) ... por lo que el mismo contenido doc producirá siempre el mismo número de revisión (con la misma configuración de couchdb) incluso en otras máquinas, cuando en el mismo cambio de nivel (1-, 2-, 3-)

Otra forma es: si usted necesita para mantener las versiones anteriores, puede almacenar documentos en un documento mayor:

{ 
id:"docHistoryContainer_5374", 
"doc_id":"5374", 
"versions":[ 
    {"v":1, 
    "date":[2012,03,15], 
    "doc":{ .... doc_content v1....} 
    }, 
    {"v":2, 
    "date":[2012,03,16], 
    "doc":{ .... doc_content v2....} 
    } 
] 
} 

luego, puede solicitar por las revisiones:

Ver "byRev":

for (var curRev in doc.versions) { 
    map([doc.doc_id,doc.versions[curRev].v],doc.versions[curRev]); 
} 

llamada:

/byRev startkey = [ "5374"] & endkey = [ "5374", {}]

resultado:?

{id: "docHistoryContainer_5374", clave = [ 5374,1] value = {... doc_content v1 ....}} {id: "docHistoryContainer_5374", clave = [5374,2] value = {... doc_content v2 ....}}

Additionaly Ahora puede escribir también una función de mapa que confirme la fecha en la clave, para que pueda solicite revisiones en un rango de fechas

+0

geez pero eso es totalmente enorme!Por lo tanto, siempre que no utilice compactos y siempre que consulte en un rango de fechas "menor o igual" a la fecha actual, ¿está garantizado que sus consultas son referencialmente transparentes? (al menos en el concepto de una base de datos específica) ¡Es una característica increíble, creo! Tiene el potencial de hacer que sea mucho, mucho más fácil "recrear el estado" (por ejemplo, cuando se rastrea/depura). Y simplemente, bueno, mucho más fácil razonar acerca del programa en general. Eso definitivamente me ** interesado ** ** en CouchDB:) +1 a ambas respuestas:) –

+0

lo siento ... la consulta de la fecha está solo en la segunda versión ... no se puede escribir un mapa que busque el contenido de la versión anterior. Solo puede "pedir" un documento específico para sus revisiones y luego recuperar el contenido de esta revisión, pero no consultar – okurow

4

Como ya se dijo, es técnicamente posible y no debe contar con ello. No se trata solo de la compactación, sino también de la replicación, una de las mayores fortalezas de CouchDB. Pero sí, si nunca compactas y si no lo haces, podrás recuperar todas las versiones anteriores de todos los documentos. Creo que no funcionará con las consultas, sin embargo, no pueden funcionar con versiones anteriores.

Básicamente, llamarlo "rev" fue el mayor error en el diseño de CouchDB, debería haber sido llamado "mvcc_token" o algo así - realmente solo implementa MVCC, no está destinado a ser usado para versionar.

Cuestiones relacionadas