¿Qué es NoSQL?

Durante los últimos años las bases de datos relacionales han dado soporte a la gran mayoría de las aplicaciones. Con los años se han ido mejorando, normalizandolas en todo lo posible, escalandolas según crece la demanda y utilizando sistemas de persistencia. Pero últimamente, con la aparición de grandes aplicaciones online, como Facebook, Twitter o LinkedIn, se plantea problemas de escalabilidad y rendimientos de las bases de datos relacionales con miles de usuarios concurrentes y con millones de consultas diarias, entonces surge el termino NoSQL, pero ¿qué quiere decir?.

Cuando hablamos de NoSQL no nos referimos únicamente a un tipo de bases de datos sino a diferentes soluciones dadas para almacenar datos cuando las bases de datos relacionales nos generan problemas. Las bases de datos NoSQL son sistemas de almacenamiento de información que no cumplen con el esquema entidad-relación, no imponen una estructura de datos en forma de tablas y relaciones entre ellas , en ese sentido son más flexibles, ya que suelen permitir almacenar información en otros formatos como clave-valor (similar a tablas Hash), Mapeo de Columnas, Documentos o Grafos.

Hasta ahora los problemas de rendimiento en estas aplicaciones se han intentado solucionar mediante escalabilidad vertical, esto es, añadir más recursos a un solo nodo en particular dentro de un sistema, tal como el añadir memoria o un disco duro más rápido a un servidor. Entonces se pensó que la solución puede ser la escalabilidad horizontal (agregar más nodos a un sistema), pero las actuales bases de datos relacionales no se adaptan del todo correctamente a este modelo.

Además de la carencia de un esquema predeterminado, la principal característica de las bases de datos NoSQL es que están pensadas para manipular enormes cantidades de información de manera muy rápida. Para ello suelen almacenar toda la información que pueden en memoria (utilizando el disco como una mera herramienta de persistencia), y están preparadas para escalar horizontalmente sin perder rendimiento. Suelen funcionar bastante bien en hardware de bajo coste, y permiten el escalado horizontal añadiendo nuevas máquinas en caliente (sin necesidad de reinicio del sistema).

Las bases de datos NoSQL parten de la base en la que las “tablas” no existen como tal, sino que la información se almacena de forma distinta, generalmente como clave-valor, como una tabla en la que las columnas son dinámicas, pueden cambiar sin perder la agrupación de la información, así es que puedo tener ‘Personas’ con mas atributos que otras, puedo cambiar la estructura de mi información dinámicamente sin tener que re-diseñar todo de nuevo.

De entre todas las implementaciones de bases de datos NoSQL, hay muchas que no utilizan el lenguaje de consultas SQL (por ejemplo, MongoDB usa JSON), pero hay algunas que siguen usándolo, como por ejemplo BigTable (GQL), que lo ha transformado manteniendo su estructura básica.

Características

  • Consistencia Eventual: 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. Esta flexibilidad hace que la consistencia se dé, eventualmente, cuando no se hayan modificado los datos durante un periodo de tiempo. Esto se conoce también como BASE (Basically Available Soft-state Eventual Consistency, o coherencia eventual flexible básicamente disponible).
  • Estructura distribuida: Generalmente se distribuyen los datos mediante mecanismos de tablas de hash distribuidas.
  • Escalabilidad horizontal: Consite en la posibilidad de aumentar el rendimiento del sistema simplemente añadiendo más nodos, sin necesidad en muchos casos de realizar ninguna otra operación más que indicar al sistema cuáles son los nodos disponibles. Muchos sistemas NoSQL permiten utilizar consultas del tipo Map-Reduce, las cuales pueden ejecutarse en todos los nodos a la vez (cada uno operando sobre una porción de los datos) y reunir luego los resultados antes de devolverlos.
  • Tolerancia a fallos y Redundancia.
  • No generan cuellos de botella: el problema de fondo de los sistemas SQL, es que deben de transcribir cada sentencia para poder ser ejecutada y, cada sentencia compleja requiere, además de un nivel de ejecución más concreto para poderse llevar a cabo, por lo que constituye un punto de entrada común, único y conflictivo en base a rendimiento.
  • Solo lo estrictamente necesario: son sistemas simples que no tienen un sistema de consulta complejo ni con capacidad declarativa para en una sola línea realizar una cantidad interna de operaciones desorbitada.
  • Estructura dinámica: La primera característica significa que los datos no tienen una definición de atributos fija, es decir: Cada registro puede contener una información con diferente forma cada vez, pudiendo así almacenar sólo los atributos que interesen en cada uno de ellos, facilitando el polimorfismo de datos bajo una misma colección de información. También se pueden almacenar estructuras de datos complejas en un sólo documento, como por ejemplo almacenar la información sobre una publicación de un blog (título, cuerpo de texto, autor, etc) junto a los comentarios y etiquetas vertidos sobre el mismo, todo en un único registro. Hacerlo así aumenta la claridad (al tener todos los datos relacionados en un mismo bloque de información) y el rendimiento (no hay que hacer un JOIN para obtener los datos relacionados, pues éstos se encuentran directamente en el mismo documento).

Tipos
En general hay 5 tipos de bases de datos NoSQL, dependiendo de como almacenan la información:

  • Key-Value: clave-valor es la forma mas típica, como un HashMap donde cada elemento esta identificado por una llave única, lo que permite la recuperación de la información de manera muy rápida. Normalmente el valor se alamcenar como un objeto BLOB. De esta forma el tipo de contenido no es importante para la base de datos, solo la clave y el valor que tiene asociado. Son muy eficientes para lecturas y escrituras, además de que pueden escalar fácilmente particionando los valores de acuerdo a su clave; por ejemplo aquellos cuya clave está entre 1 y 1000 van a un server, los de 1001 a 2000 a otro, etc. Muchas de ellas están basadas en la publicación de Google acerca de su BigTable y de Amazon. Dentro de estas bases de datos podemos encontrar a BigTable de Google, SimpleDB de Amazon, Cassandra, Hadoop, Riak, Voldemort y MemcacheDB entre otras.
  • Basada en Documentos: estas almacenan la información como un documento (generalmente con una estructura simple como JSON o XML) y con una clave única. Es similar a las bases de datos Key-value, pero con la diferencia que el valor es un fichero que puede ser entendido. Si el servidor entiende los datos, puede hacer operaciones con ellos. De hecho varias de las implementaciones de este tipo de bases de datos permiten consultas muy avanzadas sobre los datos, e incluso establecer relaciones entre ellos, aunque siguen sin permitir joins. Podemos encontrar a MongoDB y CouchDB entre las mas importantes de este tipo.
  • Orientadas a Grafos: Hay otras bases de datos que almacenan la información como grafos donde las relaciones entre los nodos son lo mas importante. Son muy útiles para representar información de redes sociales. De hecho, las relaciones también pueden tener atributos y puedes hacer consultas directas a relaciones, en vez de a los nodos. Además, al estar almacenadas de esta forma, es mucho más eficiente navegar entre relaciones que en un modelo relacional. Obviamente, este tipo de bases de datos sólo son aprovechables si la información en cuestión se puede representar fácilmente como una red.Encontramos a neo4j entre otras.
  • Orientadas a Columnas: guardan los valores en columnas en lugar de filas. Con este cambio ganamos mucha velocidad en lecturas, ya que si se requiere consultar un número reducido de columnas, es muy rápido hacerlo pero no es eficiente para realizar escrituras. Por ello este tipo de soluciones es usado en aplicaciones con un índice bajo de escrituras pero muchas lecturas. Por ejemplo, Cassandra.

Conclusión
Definitivamente, con el término NoSQL nos referimos a una multitud de bases de datos que intentan solventar las limitaciones que el modelo relacional se encuentra en entornos de almacenamiento masivo de datos, y concretamente en las que tiene en el momento de escalar, donde es necesario disponer de servidores muy potentes y de balanceo de carga.

Estas bases de datos no significa que el modelo relacional desaparezca, pero sí que en determinados entornos donde hemos de escalar rápidamente, es una solución muy buena, en especial por el altísimo rendimiento que ofrecen. No en vano, hoy en día se utilizan ya muchísimo no sólo como almacenamiento primario, sino también como sistema de persistencia para guardar cachés, analíticas de uso, y otros datos para los que lo primordial es la velocidad.

Esto implica que tendremos que realizar un estudio de nuestro sistema, aplicación y datos y ver cuales de todas las posibilidades que se nos proporcionan es la mejor para nuestra aplicación. Incluso podemos utilizar una base de datos relacional para almacenar los usuarios registrados y una base de datos NoSQL para almacenar la información de un blog.