CouchDB: Una pequeña introducción (Parte I)

Tagged:

¿Qué es CouchDB?

 

CouchDB es un motor de base de datos basado en documentos.

Esto quiere decir que, al contrario que las bases de datos tradicionales, CouchDB no utiliza tablas. La filosofía de CouchDB se basa en imitar la realidad, almacenando todo el conocimiento relacionado en un único documento. En la vida real, cuando tomamos los datos de una persona, tendemos a escribir todos los datos relacionados lo más cerca posible. Por ejemplo, en una tarjeta de presentación tenemos  nombre, teléfono, dirección y correo electrónico en un único trozo de papel, en vez de guardar un directorio de nombres, otro de teléfonos y otro de direcciones relacionados entre sí.

Otra característica que CouchDB copia de la realidad es la flexibilidad de los documentos. En el mundo real, cuando tomamos anotaciones, no lo hacemos siempre de la misma manera. Volviendo al ejemplo de la tarjeta de presentación, no siempre dejamos un hueco para un segundo teléfono, ni reservamos espacio para un segundo nombre. Simplemente, escribimos los datos que consideramos relevantes para cada tarjeta. CouchDB sigue este modelo, dejando que cada documento tenga su propia estructura.

Entrando en la parte más técnica, los documentos en CouchDB se almacenan en JSON. Con ello conseguimos una rápida transformación de los documentos a objetos en los lenguajes de programación, a la vez que se pueden entender fácilmente por cualquier persona.

Por ejemplo, para representar la tarjeta de presentación de John Doe podríamos tener el siguiente documento:

 

{

        "Nombre": "John Doe",

        "Teléfono": ["123-123-321"],

        "Dirección": "Cl. Void, 12",

        "E-mail": "john@doe.org"

      }

 

Y en la misma base de datos podríamos tener la tarjeta de presentación de Jane Doe en la misma base de datos sin necesidad de hacer nada para indicar que no sigue el mismo esquema:

 

{

        "Nombre": "Jane Doe",

        "Telefono": [ "456-789-465", "999-876-543" ],

        "Dirección": "Cl. Void, 21",

        "Skype": "JaneDoe"

     }

 

Independientemente de la estructura que elijamos, CouchDB establece dos campos para cada documento. El campo "_id" que almacena un identificador único para cada documento y el campo "_rev" que nos permite identificar entre todas las revisiones del mismo documento.

 

CouchDB es una base de datos distribuida y tolerante a fallos.

Es decir, podemos tener nuestra base de datos replicada por toda la red, teniendo copias de la misma en diferentes sitios. Cada copia de nuestra base de datos puede ser modificada indistintamente y se pueden sincronizar  automágicamente. En caso de producirse un conflicto irresoluble, existen mecanimos para evitar la perdida de datos.

Imaginemos que tenemos la información de John en nuestra base de datos en el trabajo y que además la tenemos replicada en una base de datos que tenemos almacenada en casa. John nos llama a casa y nos informa que se va a vivir con Jane, así que actualizamos su dirección en nuestra base de datos. Al día siguiente llegamos al trabajo y recordamos que John se ha mudado a casa de Jane, así que sincronizamos los datos con nuestra base de datos de casa y automágicamente nuestra base de datos del trabajo contiene la nueva dirección de John.

Casualmente, ese día mientras trabajamos en la contabilidad, cometemos un error y modificamos la tarjeta de visita de John borrando todos los datos almacenados en ella sobreescribiendolos con datos de la contabilidad. Al mismo tiempo que cometíamos este error, alguien en casa, actualiza el número de teléfono de John. Cuando tratemos de sincronizar las bases de datos tendremos un conflicto, ya que la base de datos no sabrá cual de las dos versiones es la correcta.

 

Para resolver  esta situación CouchDB establece un mecanismo de protección, guardando las dos versiones y declarándolas como "En conflicto" hasta que el usuario decida cual de las dos es la versión correcta. Hasta ese momento, ante cualquier consulta, el documento que se mostrará el documento cuya ruta de acceso sea más larga.

Hay que tener en cuenta que cuando se produce un conflicto y se establecen dos versiones del documento, aunque estás estén marcadas como "En conflicto", siguen siendo documentos normales. Por lo tanto en caso de replicar una base de datos a una tercera máquina, también replicaríamos el conflicto.

Otro detalle importante a tener en cuenta en la replicación de bases de datos con CouchDB es que antes de hacer una replicación, CouchDB compacta las bases de datos, eliminando cualquier revisión anterior de los documentos que no se encuentren en conflicto. Esto es importante a la hora de plantear sistemas de control de versiones, ya que aunque CouchDB mantenga una revisión de los documentos, en cualquier momento la podemos perder por una replicación o una compactación de la base de datos.

 

CouchDB es una base de datos con un API RESTful.

Para poder acceder a los datos en CouchDB, tanto para consultarlos, modificarlos o eliminarlos. CouchDB suministra un API REST por HTTP. Esta API nos permite usar los comandos HTTP COPY, DELETE, GET, MOVE, POST y PUT para modificar documentos, bases de datos y vistas. Por ejemplo, para crear la tarjeta de identificación de John, nos bastaría con enviar el comando PUT indicando el identificador del documento (_id) en la URL y la estructura JSON del documento, como la que vimos anteriormente,  en la sección de datos.

 

A continuación...

En la siguiente entrega explicaré como funciona el sistema de vistas de CouchDB y como hacer consultas avanzadas. Si tienen alguna duda, pregunta o sugerencia, dejen un comentario.