Diferencia entre revisiones de «CouchDB»

(Etiqueta: nuestro-nuestra)
(Etiqueta: nuestro-nuestra)
 
(No se muestran 17 ediciones intermedias de 5 usuarios)
Línea 1: Línea 1:
 
{{Ficha Software
 
{{Ficha Software
 
|nombre=Apache CouchDB
 
|nombre=Apache CouchDB
|familia=
+
|familia= Apache
 
|imagen=Couchdb.png
 
|imagen=Couchdb.png
|tamaño=
+
|tamaño=  
|descripción= Base de Datos NoSQL
+
|descripción= [[Base de Datos]] [[NoSQL]]
 
|imagen2=
 
|imagen2=
 
|tamaño2=
 
|tamaño2=
 
|descripción2=
 
|descripción2=
|creador=Damien Katz
+
|creador=
|desarrollador=
+
|desarrollador= Damien Katz
 
|diseñador=
 
|diseñador=
 
|modelo de desarrollo=
 
|modelo de desarrollo=
Línea 18: Línea 18:
 
|sistemas operativos=
 
|sistemas operativos=
 
|idioma=
 
|idioma=
|licencia=[[Apache License, Version 2.0]]
+
|licencia=[[Apache]] License, Version 2.0
 
|premios=
 
|premios=
|web=http://couchdb.apache.org/
+
|web= [http://couchdb.apache.org/ 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.
'''Apache CouchDB''' es una base de datos orientada a documentos que se pueden consultare indexados utilizando [[JavaScript]] en una forma [[MapReduce]]. CouchDB también ofrece replicación incremental con detección de conflictos bi-direccional y resolución.
 
  
==Que ofrece CouchDB==
+
==Características==
CouchDB ofrece una estancia tranquila [[JSON API]]que se puede acceder desde cualquier entorno que permite a las peticiones [[HTTP]]. Hay 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 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 Web|navegador]].
  
''' CouchDB'''  está escrito en [[Erlang]], un robusto ideal funcional lenguaje de programación concurrente para la construcción de sistemas distribuidos. [[Erlang]] permite un diseño flexible que es fácilmente escalabley extensible.
+
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==
 
==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 nos permite guardar juntos documentos con distintos campos dentro de la misma [[Base de Datos]].
+
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:
+
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:
{
+
<pre>
 
+
{
 
   "_id" : "234a41170621c326ec63382f846d5764",
 
   "_id" : "234a41170621c326ec63382f846d5764",
 
 
 
   "_rev" : "1-480277b989ff06c4fa87dfd0366677b6",
 
   "_rev" : "1-480277b989ff06c4fa87dfd0366677b6",
 
 
 
   "tipo" : "articulo",
 
   "tipo" : "articulo",
 
 
 
   "titulo" : "Esto es una prueba",
 
   "titulo" : "Esto es una prueba",
 
+
   "cuerpo" : "Soy el contenido de un artículo de  prueba",
   "cuerpo" : "Soy el contenido de un artículo de  prueba",
 
 
 
 
   "tags" : ["cine", "comedia"]
 
   "tags" : ["cine", "comedia"]
 +
}
 +
</pre>
 
    
 
    
}
+
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 _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.
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 numero de la versión que vamos a modificar, de forma que si CouchDB ve que estamos 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:
El resto de los campos se puede usar expresiones JSON válidas, como en el ejemplo donde tenemos el atributo tags que es un array de strings. Podría ser un diccionario ({“clave1″: “valor1″, “clave2″:”valor2″}),un número (2), etc…
+
<pre>
Al trabajar sin [[schema]] el sistema se adapta a los cambios en la estructura de los documentos que es necesario almacenar. De esta forma el usuario puede despreocuparse de lo que se va introduciendo en la base de datos.
+
({“clave1″: “valor1″, “clave2″:”valor2″}),un número (2), etc…
 +
</pre>
 +
 
 +
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==
 
==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: 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. Un función puede devolver 0, 1 ó varios de estos pares para un único documento de entrada. A primera vista esto puede parece 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 nuestra BD se modifica, se vuelve a rehacer el índice (pero sólo para los documentos modificados)
+
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:
 
ejemplo:
function(doc) {
+
<pre>
 
+
function(doc) {
   for (var i in doc.tags)
+
   for (var i in doc.tags)
 
+
       emit(doc.tags[i],  doc);
       emit(doc.tags[i],  doc);
 
 
 
 
  }
 
  }
   
+
</pre>   
las funciones Map (y las Reduce) se definen en [[Javascript]]. CouchDB ofrece una arquitectura [[pluggable]] mediante la cual podemos crear estas en nuestro lenguaje favorito ([[Python]], [[Ruby]]…).
+
las funciones Map (y las Reduce) se definen en [[Javascript]].
Esta función devuelve como clave cada uno de los tags y como valor el propio documento. De esta forma ejecutada sobre nuestro doc de ejemplo daría 2 filas: una para “cine” y otra para “comedia” ambas teniendo como valor el propio documento.
+
CouchDB ofrece una arquitectura pluggable mediante la cual se puede crear estas en cualquier lenguaje sea [[Python]], [[Ruby]] y otros.
Después sobre este conjunto de resultados podemos filtrar por clave o bien por un par de claves inicio y fin. De esta forma si queremos sabe todos los artículos que son de cine filtraríamos aquellos que tienen la clave “cine”.  
+
 
 +
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.
 
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:      
+
*'''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:
   
+
<pre>
function(doc) {
+
function(doc) {
 
+
   for (var i in doc.tags)
   for (var i in doc.tags)
 
 
 
 
       emit(doc.tags[i],  1);
 
       emit(doc.tags[i],  1);
 
+
  }
  }
+
<pre>  
   
+
Definicion de una funcion reduce:
definicion de una funcion reduce:
+
<pre>       
       
+
  function(keys, values) {
  function(keys, values) {
+
   return sum(values);
 
 
   return sum(values);
 
 
 
 
  }
 
  }
   
+
</pre>
La función Reduce recibe como entrada todas las claves y todos los valores. Con la funcion sum, proporcionada por CouchDB, vamos acumulando los 1 que devuelve la función map de forma que como resultado de esta obtenemos varias filas con cada uno de los tags como clave y el número de documentos que tienen este tag como valor.
+
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).
+
En la nomenclatura de CouchDB un par de funciones MapReduce se llama view (no siendo obligatorio definir la parte reduce).
  
 
==Accesible por REST==
 
==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 nuestra BD albums accederíamos a esta URL que nos devuelve el documento JSON correspondiente:
+
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:
 
+
<pre>
 
http://localhost:5984/albums/6e1295ed6c29495e54cc05947f18c8af
 
http://localhost:5984/albums/6e1295ed6c29495e54cc05947f18c8af
 +
</pre>
  
De forma similar si se quiere acceder a una view como la que comentábamos cuando explicábamos el Map y recuperar algún resultado iremos a la URL:
+
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:
 +
<pre>
 
http://localhost:5984/blog/_design/doc/_view/tag?key=”cine”
 
http://localhost:5984/blog/_design/doc/_view/tag?key=”cine”
 
+
</pre>
Esta [[URL]] quiere decir que estamos accediendo a la BD llama blog, para recuperar un design document (donde se guardan las views dentro de la BD) llamado doc y dentro de este a la view llamada tag. Después como comentábamos antes, dentro de la view queremos recuperar el resultado identificado por la clave cine (es interesante ver como hay que pasarla entre ” ” ya que la clave es un string, uno de los tipos válidos de JSON).
+
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 obtendríamos un resultado similar a este:
+
En esta [[URL]] se obtiene un resultado similar a este:
   
+
<pre>   
  {
+
  {
 
 
 
   "total_rows":  4,
 
   "total_rows":  4,
 
 
 
   "offset":  0,
 
   "offset":  0,
 
 
 
   "rows":[  {
 
   "rows":[  {
 
 
 
       "id":"9280b03239ca11af9cfedf66b021ae88",
 
       "id":"9280b03239ca11af9cfedf66b021ae88",
 
 
 
       "key":"cine",
 
       "key":"cine",
 
 
 
       "value":{
 
       "value":{
 
 
 
         "_id":"9280b03239ca11af9cfedf66b021ae88",
 
         "_id":"9280b03239ca11af9cfedf66b021ae88",
 
 
 
         "_rev":"1-0289d70fe05850345fd4e9118934a99b",
 
         "_rev":"1-0289d70fe05850345fd4e9118934a99b",
 
 
 
         "tags":["cine","comedia"]
 
         "tags":["cine","comedia"]
 
+
        }
      }
+
    }, {
 
 
  }, {
 
 
    
 
    
 
       "id":"a92d03ff82289c259c9012f5bfeb639c",
 
       "id":"a92d03ff82289c259c9012f5bfeb639c",
 
+
        "key":"cine",
      "key":"cine",
+
        "value":  {
 
+
          "_id":"a92d03ff82289c259c9012f5bfeb639c",
      "value":  {
+
          "_rev":"2-97377eef95764a4dbf107d8142187f53",
 
+
          "tags":["cine","drama"]
        "_id":"a92d03ff82289c259c9012f5bfeb639c",
+
        }
 
+
    }
        "_rev":"2-97377eef95764a4dbf107d8142187f53",
+
   ]}
 
+
</pre>
        "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 key y value estan los resultado 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 numero 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).
 
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==
 
==Replicación integrada==
  
Una funcionalidad relativamente exótica que permite que las BD de datos sincronice sus datos de una forma muy sencilla (una simple llama [[REST]] la activa) con otra BD remota o local. De este modo se tiene de una forma sencilla una o mas réplicas de la BD para implementar arquitecturas de alta disponibilidad o de balanceo de carga.
+
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)  
+
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).
CloudTPS:
 
  
 
==Transacciones escalable para aplicaciones Web en la nube==
 
==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.
+
[[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]]
  
== Url para Descargar el SoftWare ==
+
== Descarga del SoftWare ==
  
http://couchdb.apache.org/downloads.html
+
* [http://couchdb.apache.org/downloads.html CouchDB]
  
 
== Fuentes  ==
 
== Fuentes  ==
http://www.4tic.com/blog/2011/06/29/couchdb-una-base-de-datos-diferente-2/
 
http://softlibre.barrapunto.com/article.pl?sid=09/11/29/1420207
 
http://couchdb.apache.org/
 
  
 +
*[http://www.4tic.com/blog/2011/06/29/couchdb-una-base-de-datos-diferente-2/ CouchDB: una base de datos diferete]
 +
*[http://softlibre.barrapunto.com/article.pl?sid=09/11/29/1420207 Barrapunto.com]
 +
*[http://couchdb.apache.org/ CouchDB]
 +
*[http://wiki.apache.org/couchdb/Related_Projects CouchDB Wiki]
 
[[Category:Software]] [[Category:Bases_de_datos]] [[Category:Software_para_Linux]]
 
[[Category:Software]] [[Category:Bases_de_datos]] [[Category:Software_para_Linux]]

última versión al 16:05 22 oct 2012

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