CouchDB

Apache CouchDB
Información sobre la plantilla
Parte de la familia Apache
Couchdb.png
DesarrolladorDamien Katz
GéneroRDBMS
LicenciaApache License, Version 2.0
Sitio web
CouchDB

Apache CouchDB. Es una base de datos orientada a documentos que se pueden consultar utilizando JavaScript en una forma MapReduce. CouchDB también ofrece replicación incremental con detección de conflictos bi-direccional y resolución.

Características

CouchDB ofrece una API JSON API que se puede acceder desde cualquier entorno que permite a las peticiones HTTP. Existen miles de librerías de terceros clientes que hacen que este sea aún más fácil a partir de su lenguaje de programación de su elección. CouchDB incorporado en la consola Web de administraciónse dirige directamente a la base de datos mediante solicitudes HTTP emitidas desde el navegador.

CouchDB está escrito en Erlang, un robusto ideal funcional lenguaje de programación concurrente para a construcción de sistemas distribuidos. Erlang permite un diseño flexible que es fácilmente escalable y extensible.

Base de datos documental sin schema

CouchDB guarda los datos en forma de documentos. Todo lo que almacenamos es un documento sin schema, lo cual permite guardar juntos documentos con distintos campos dentro de la misma Base de Datos. los documentos se almacenan en JSON, un formato ligero, sencillo y cómodo de usar desde cualquier lenguaje. Ejemplo de típico documento de CouchDB:

{
   "_id" : "234a41170621c326ec63382f846d5764",
   "_rev" : "1-480277b989ff06c4fa87dfd0366677b6",
   "tipo" : "articulo",
   "titulo" : "Esto es una prueba",
   "cuerpo" : "Soy el contenido de un artículo de   prueba",  
   "tags" : ["cine", "comedia"]
 }

El _id sirve para que CouchDB lo distinga de otros documentos y vale para poder recuperarlo posteriormente. Es un string que puede contener lo que queramos aunque si no ponemos nada CouchDB generará un UUID. El uso del UUID permite tener un id único UNIVERSALMENTE, lo cual es útil en el tema de la replicación. El campo _rev es especial y sirve para que CouchDB controle la versión del documento. Cada vez que se guarde un cambio en un documento cambia el número de revisión (se incrementa el 1 de antes del – y el resto del número cambia). Esto es útil porque cada vez que se intente guardar un documento se pasa el número de la versión que se va a modificar, de forma que si CouchDB ve que se está guardando un cambio sobre una revisión antigua, da error y no permite continuar. En el resto de los campos se puede usar expresiones JSON válidas, como en el ejemplo donde se tiene el atributo tags que es un array de strings. Podría ser un diccionario:

({“clave1″: “valor1″, “clave2″:”valor2″}),un número (2), etc…

Al trabajar sin Schema el sistema se adapta a los cambios en la estructura de los documentos que son necesarios almacenar. De esta forma el usuario puede despreocuparse de lo que se va introduciendo en la base de datos.

Consultable al estilo MapReduce

CouchDB no ofrece un lenguaje tipo SQL para realizar consultas sino que ofrece un sistema basado en MapReduce para poder obtener los datos. Este sistema se compone de una parte Map y una parte Reduce.

Map y Reduce

  • Map: es una función que se ejecuta para cada documento. Esta función recibe como parámetro el propio documento y puede devolver pares de clave-valor. Una función puede devolver 0, 1 ó varios de estos pares para un único documento de entrada. A primera vista esto puede parecer muy ineficiente, pero la función sólo se ejecuta una vez para cada documento y va almacenando los resultados en un índice que relaciona claves y valores de forma que en posteriores consultas se ataque sobre este índice. Por supuesto, si alguno de los documentos de la Base de Datos se modifica, se vuelve a rehacer el índice (pero sólo para los documentos modificados)

ejemplo:

function(doc) {  
   for (var i in doc.tags)  
      emit(doc.tags[i],   doc);  
 }

las funciones Map (y las Reduce) se definen en Javascript. CouchDB ofrece una arquitectura pluggable mediante la cual se puede crear estas en cualquier lenguaje sea Python, Ruby y otros.

Esta función devuelve como clave cada uno de los tags y como valor el propio documento. De esta forma ejecutada sobre el doc de ejemplo daría 2 filas: una para “cine” y otra para “comedia” ambas teniendo como valor el propio documento. Después sobre este conjunto de resultados se puede filtrar por clave o bien por un par de claves inicio y fin. De esta forma si se quiere saber todos los artículos que son de cine filtraríamos aquellos que tienen la clave “cine”. las claves pueden ser cualquier tipo de datos soportado por JSON como arrays, números, diccionarios… lo cual puede ser útil para realizar consultas más avanzadas.

  • Reduce: A grandes rasgos esta agrupa los resultados del Map para obtener un número. De esta forma si la parte Map anterior fuera asi:
function(doc) {  
   for (var i in doc.tags)  
      emit(doc.tags[i],   1);
   }
<pre>  
Definicion de una funcion reduce:
<pre>        
 function(keys, values) {  
   return sum(values);  
 }

La función Reduce recibe como entrada todas las claves y todos los valores. Con la función sum, proporcionada por CouchDB, se van acumulando los 1 que devuelve la función map de forma que como resultado de esta se obtienen varias filas con cada uno de los tags como clave y el número de documentos que tiene este tag como valor. En la nomenclatura de CouchDB un par de funciones MapReduce se llama view (no siendo obligatorio definir la parte reduce).

Accesible por REST

REST permite acceder a los datos de una forma muy sencilla a través de URLs. Por ejemplo para recuperar los documento con id 6e1295ed6c29495e54cc05947f18c8af de la Base de Datos "albums" se accedería a la siguiente URL que devuelve el documento JSON correspondiente:

http://localhost:5984/albums/6e1295ed6c29495e54cc05947f18c8af

Del mismo modo si se quiere acceder a una view hay que ir a la URL De forma similar si se quiere acceder a una view como la que se comentaba cuando explicábamos el Map y recuperar algún resultado iremos a la URL:

http://localhost:5984/blog/_design/doc/_view/tag?key=”cine”

Esta URL quiere decir que se esta accediendo a la Base de Datos llama blog, para recuperar un design document (donde se guardan las views dentro de la Base de Datos) llamado doc y dentro de este a la view llamada tag. Después dentro de la view si se desea recuperar el resultado identificado por la clave cine. En esta URL se obtiene un resultado similar a este:

     
 {  
   "total_rows":   4,
   "offset":   0,
   "rows":[   {
      "id":"9280b03239ca11af9cfedf66b021ae88",
      "key":"cine",
      "value":{
         "_id":"9280b03239ca11af9cfedf66b021ae88",
         "_rev":"1-0289d70fe05850345fd4e9118934a99b",
         "tags":["cine","comedia"]
        }
     }, {
  
      "id":"a92d03ff82289c259c9012f5bfeb639c",
        "key":"cine",
        "value":   {
           "_id":"a92d03ff82289c259c9012f5bfeb639c",
          "_rev":"2-97377eef95764a4dbf107d8142187f53",
          "tags":["cine","drama"]
        }
     }
   ]}

En key y value están los resultados esperados: el tag y el documento que lo contiene. Aparte CouchDB incluye el id del documento que ha dado lugar a ese resultado (el que entra como parámetro en la función Map). Además se devuelve el número total de filas devueltas y el offset del resultado. En vez del parámetro key se le puede pasar a nuestra vista un par de parámetros startkey y endkey para obtener un rango de los resultados que nos interese (p.ej. en una view que devolviera como clave un string representando una fecha).

Replicación integrada

Una funcionalidad relativamente exótica que permite que las Bases de Datos de datos sincronicen sus datos de una forma muy sencilla (una simple llama REST la activa) con otra Base de Datos remota o local. De este modo se tiene de una forma sencilla una o más réplicas de la BD para implementar arquitecturas de alta disponibilidad o de balanceo de carga. De forma similar, el atributo _rev anteriormente comentado nos permite que CouchDB detecte casos en los que un mismo documento ha sido modificado en varias bases de datos a la vez (cada documento tendria un _rev diferente).

Transacciones escalable para aplicaciones Web en la nube

NoSQL Nube almacenes de datos proporcionan la escalabilidad y características de alta disponibilidad para aplicaciones web, pero al mismo tiempo que sacrificar la coherencia de datos. Sin embargo, muchas aplicaciones no pueden permitirse ninguna incoherencia de datos. CloudTPS es un gestor de transacciones escalable que garantiza las propiedades ACID completa de multi-elemento de operaciones emitidas por las aplicaciones web, incluso en la presencia de fallas en el servidor y las particiones de red. Ponemos en práctica este enfoque en la parte superior de las dos principales familias de las capas de datos escalables: Bigtable y SimpleDB. La evaluación del desempeño en la parte superior de HBase (una versión de código abierto de Bigtable) en nuestro grupo local y Amazon SimpleDB en la nube de Amazon muestra que nuestro sistema de escalas de forma lineal al menos hasta 40 nodos en nuestras agrupaciones locales y 80 nodos en la nube de Amazon.

APIs para acceso a couchdb

Existen APIs en varios lenguajes para el acceso a las bases de datos CouchDB por ejemplo:JavaScript, Erlang, .Net, Java, perl, PHP,Python, Ruby, Lua

Descarga del SoftWare

Fuentes