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:
- 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.
- Documentales (basadas en documentos): CouchDb, MongoDB y IBM Lotus.
- Grafos: Neo4j y AllegroGraph
- Clave-Valor: Cassandra, BigTable y Dynamo.
- Tablulares: HBase y BigTable.
-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.
Existen diferentes tipos de bases de datos NoSQL, estos son los tipos principales:
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:
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}
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
El proximo post, vamos a ver un ejemplo real de como trabajar en MongoDb, en este caso explicare 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).