Introducción a las bases de datos NoSQL: MongoDB

Escrito por: J.P. Aulet el 09 Nov 2011 - Tags: , , , , , ,

NoSQL (del inglés ‘Not Only SQL‘) es una filosofía de sistemas de gestión de bases de datos que modifican por completo el modelo clásico de bases de datos relacionales (en inglés, RDBMS o ‘Relational Database Management System‘). Esta nueva forma de trabajar responde a otra forma de organización de los datos que permiten una menor rigidez de los datos y formas novedosas de trabajo. Las características comunes entre las implementaciones de bases de datos distribuidas no relacionales o NoSQL son las siguientes:

  • Consistencia: No se implementan mecanismos rígidos de consistencia como los presentes en las bases de datos relacionales, donde la confirmación de un cambio implica una comunicación del mismo a todos los nodos que lo repliquen. Las bases de datos NoSQL son ACID, esto significa que una transacción cumple lo siguiente:
    • Atomicidad: es la propiedad que asegura que la operación se ha realizado o no, y por lo tanto ante un fallo del sistema no puede quedar a medias.
    • Consistencia: es la propiedad que asegura que sólo se empieza aquello que se puede acabar. Por lo tanto se ejecutan aquellas operaciones que no van a romper la reglas y directrices de integridad de la base de datos.
    • Aislamiento: es la propiedad que asegura que una operación no puede afectar a otras. Esto asegura que la realización de dos transacciones sobre la misma información sean independientes y no generen ningún tipo de error.
    • Durabilidad: es la propiedad que asegura que una vez realizada la operación, ésta persistirá y no se podrá deshacer aunque falle el sistema.
  • Estructura distribuida: Generalmente se distribuyen los datos mediante mecanismos de tablas de hash distribuidas como las redes P2P.
  • Escalabilidad Horizontal: La implementación típica se realiza en muchos nodos de capacidad de procesado limitado, en vez de utilizar grandes ‘mainframes‘.
  • Tolerancia a fallos (debido a la estructura ACID), redundancia y sin cuellos de botella.

Existen diferentes tipos de bases de datos NoSQL, estos son los tipos principales:

  • Documentales (basadas en documentos): CouchDb, MongoDB y IBM Lotus.
  • Grafos: Neo4j y AllegroGraph
  • Clave-Valor: Cassandra, BigTable y Dynamo.
  • Tablulares: HBase y BigTable.

En nuestro caso nos centraremos en MongoDb.

MongoDB

La estructura principal y fundamental que debemos recordar es la siguiente (con el equivalente a una BBDD con filosofia SQL), ordenada jerárquicamente:

nosql databases Introducción a las bases de datos NoSQL: MongoDB

Bases de Datos NoSQL

- Server //Servidor
  - Database //Base de Datos
    - Collection (table)  //Tabla
       - Document (BSON; like a row)  //Fila
          - Fields (columns)  //Columna

.

Y las características principales a recordar son:
  • Las consultas son a nivel de ‘collection‘ (sin joins)
  • Los índices se generan en las ‘collection
  • Los documentos tienen una ID única
  • La ‘atomicidad’ es a nivel de ‘document‘.

MongoDB ofrece además una serie de métodos y herramientas novedosos para hacer consultas (querying) y operaciones de una forma muy senzilla y muy optimizado. Estos son:

Consultas:

• Permite consultas dinámicas (código JavaScript o objetos)
• 'Map/Reduce' (funciones JavaScript)
• Creación de indices secundarios (B-tree, R-tree, etc.)

Operaciones:

• Replicación
• Master/Slave
• Herramientas útiles: mongo shell, mongostat, mongo{dump,restore,export,import}

Ahora vamos a ver un ejemplo real de como trabajar en MongoDb, en nuestro caso explicaremos como trabajar con MongoDB con el lenguaje de programación PHP, que incluye esta base de datos como una librería nativa (PHP Mongo Native Driver).

La mayoria de frameworks por PHP soportan esta BBDD e incluyen librerias para trabajar con ella, aquí un listado:

CakePHP, Codeigniter, Doctrine, Drupal, Kohana, Lithium, Memcached, Symfony 2, Yii y Zend Framework

Introducción a MongoDB + PHP:

Establecimiento de una conexión

Para conectarse a mongo y seleccionar una base de datos se utiliza, por ejemplo:

$connection = new Mongo (); / / se conecta a localhost: 27017
$connection = new Mongo (“sindikos.com”); / / conectarse a un host remoto (puerto por defecto)
$connection = new Mongo (“sindikos.com: 65432″); / / conectarse a un host remoto en un puerto
$db = $connection-> selectDB (“db”); // Trabajar con ‘db’
$db = $connection-> selectDB (“otradb”); //Cambio de BBDD a ‘otradb’

Si la base de datos solicitada no existe, se creará al seleccionarla, debemos tener cuidado pues con la ortografía o podemos crear nuevas bases de datos.

Obtención de una colección

Para obtener una colección específica, utilice el selectCollection () de comandos. Al igual que el comando selectDB (), esto crea la colección si no existe ya.

$coleccion = $db-> selectCollection (“articulos”);

Inserción de un documento

Las matrices son el objeto básico que se puede guardar en una colección en la base de datos. Por ejemplo:

$doc = array (“nombre” => “articulo”,
“type” => “Publicada”,
“autor” => “J.P.Aulet”,
“version” => 1,
“texto” => “El texto del artículo”,
“info” => (object) array (“x” => 203,”Y” => 102),
“publicada” => array (“08/11/2011″, “23:00″, “PM”)
);

Esto crea un documento con los datos especificados, debemos tenga en cuenta que puede tener matrices anidadas y objetos como parte de los datos. Para añadir este nuevo documento, solo debemos hacer lo siguiente:

$colection->insert($doc);

O de forma más compacta con:

$bbdd = new Mongo();
$colection = $bbdd->selectDB(“db”)->selectCollection(“articulos”);
$colection->insert($doc);

Encontrar el primer documento en una colección con FindOne ()

Para ver el documento insertado en la anterior sentencia, podemos hacer un findOne(), que devuelve un solo valor:

$res = $colección->findOne ();
var_dump ($res);

Al hacer esto visualizará el anterior documento, y podrá ver que el campo _id ha sido añadido automáticamente por MongoDB.

Usando el cursor:

Si queremos consultar todos los documentos, MongoDB ofrece un cursor que permite iterar sobre el conjunto de documentos, se invoca al llamar la función find() . Así que para consultar todos los documentos (primero debemos añadir más) e imprimirlos podemos hacer lo siguiente:

$cursor = $ colección->find ();
foreach ($cursor como $id => $valor) {
echo “$ id”;
var_dump ($ valor);
}

Obtención de un documento único con una consulta

Podemos crear una consulta para pasar al método find() para obtener un subconjunto de los documentos de nuestra colección. Por ejemplo, si queremos encontrar el documento por el cual el valor de la “i” de campo tiene el valor ’71′, haríamos lo siguiente:

$query = array (“i” => 71);
$ cursor = $colección->find($query);
while ($cursor-> hasNext ()) {
var_dump ($ cursor-> getNext());
}

Fijarnos que podemos usar la función hasNext() o getNext() para iterar sobre el conjunto de documentos devueltos por find(). Hasta aquí este pequeño tutorial de MongoDB. En los últimos tiempos la tecnología NoSQL está en auge, sobretodo por el cambio a esta tecnología de varios de los grandes gigantes de Internet, como son Facebook, Amazon, Google, Foursquares o Yahoo, que han despertado la curiosidad de la comunidad de desarrolladores. Algunos pensarán que no les interesa, pero siempre es útil conocer todas las tecnologías y soluciones disponibles, otros sólo verán que ventajas. Para saber si realmente necesitamos MongoDB, lee las siguientes recomendaciones:

Recomendaciones:

1. Evaluar su situación

Las bases de datos NoSQL fueron diseñadas para tareas muy específicos, por ejemplo MongoDB fue diseñada para ser un motor de búsqueda sobre aplicaciones en nube (‘cloud computing’), Cassandra para búsquedas en Facebook y Memcached para el almacenamiento de caches de LiveJournal. Esto quiere decir que primero debemos definir claramente los requisitos funcionales, y luego buscar la mejor solución, NoSQL o no. Si la escalabilidad es un requisito esta será la mejor opción, si el requisito funcional es la ejecución de consultas complejas, no.

2. Sea realista con sus requerimientos de escalabilidad

NoSQL no es apropiado para todas las aplicaciones y proyectos. Los casos típicos de uso son con aplicaciones de Internet con un gran tráfico y muchos datos (hablamos de gigabytes o petabytes). Pocas aplicaciones tienen este tipo de requisitos, por otra parte, las aplicaciones más pequeñas se benefician de los menores requisitos de las base de datos NoSQL (menor infraestructura, facil replicación, creación de bases de datos automáticas, etc.) pero debe evaluar si se es capaz de sostener la elección NoSQL: por ejemplo, encontrar expertos en NoSQL será más difícil.

3. Comprobar el rendimiento, documentación y apoyo de comunidad ‘open source’

Las soluciones NoSQL estan empezando a madurar y a agrupar un buen numero de desarrolladores, por lo que debemos consultar su vitalidad, soporte y documentación disponibles por cada base de datos y también comprovar el rendimiento efectivo de esa solución por nuestro requerimento.

Documentación:

MongoDB.com : http://www.mongodb.com

Wikipedia.com : http://en.wikipedia.org/wiki/NoSQL

MongoDB: The Definitive Guide ‘Powerful and Scalable Data Storage’ , o’Reilly: http://shop.oreilly.com/product/0636920001096.do

Scale.com : http://scale.af83.com/pdf/scale_1_EN.pdf

Nosql.es : http://www.nosql.es/blog/nosql/que-es-nosql.html

Comments Off

  • Favio Náquira

    excelente articulo, gracias por las aclaraciones ^^

blog comments powered by Disqus