Las bases de datos convencionales son de tipo relacional, es decir, constan de listas tabulares de datos (también conocidas como "relaciones de datos", de ahí el verdadero origen de su nombre), que se relacionan entre sí para almacenar de la forma más eficiente posible la información. Se consultan usando SQL (Structured Query Language), un lenguaje estructurado para gestionar la información.
En los últimos años, Internet ha crecido de forma espectacular dando lugar a nuevos tipos de aplicaciones que necesitan gestionar cantidades enormes de datos, que deben ser introducidos y extraídos rápidamente y que deben poder escalar/crecer de manera sencilla y barata. En estos sistemas importa más la flexibilidad, la velocidad y la capacidad de escalado horizontal que otras cuestiones tradicionalmente cruciales como la consistencia o disponer de una estructura perfectamente definida para los datos. Es más, las tradicionales características ACID de las bases de datos relacionales no son una premisa para los nuevos gestores de información.
Por todo ello existe una tendencia imparable hacia la definición y uso de un nuevo tipo de bases de datos de tipo documental, que en lugar de registrar relaciones de datos almacenan documentos con estructuras arbitrarias y cumplen con las premisas expuestas anteriormente. Sus principales características definitorias son, por un lado, la enorme flexibilidad que brindan en los esquemas de datos a la hora de almacenar la información y su simplicidad de uso, pero también su altísimo rendimiento y escalabilidad, la facilidad de mantenimiento y la capacidad de funcionar sin puntos de fallo pues pueden recuperarse aunque se caiga cualquiera de sus nodos.
Además, la forma de consultarlas y extraer y resumir información es completamente distinta a lo que estamos acostumbrados con SQL, por eso a este tipo de datos documentales se les denomina también bases de datos no-relacionales, documentales o más comúnmente Bases de datos NoSQL (de Not Only SQL).
OJO: Se suele confundir el concepto NoSQL con el de base de datos documental. En realidad éstas últimas son una categoría concreta dentro de las bases de datos NoSQL que también incluyen almacenes de pares clave-valor (como Dynamo o MotionDb), servidores de estructuras de datos (como Redis), almacenes de N-Tuplas (como Apache River) o almacenes de filas (como Cassandra o BigTable, desarrollada por Google), entre otros tipos. Conviene no confundirlas.
Escalabilidad
La escalabilidad de un sistema informático se define como la capacidad de un sistema para expandirse según las necesidades que se deriven del uso que se le va a dar. De este modo, por ejemplo, una aplicación web es escalable si es posible atender a un número cada vez mayor de usuarios sin necesidad de cambiar la aplicación. Fundamentalmente existen dos maneras de escalar:
- Escalado vertical: implica añadir más recursos al sistema actual para que pueda atender más solicitudes. Así se le añaden más procesadores o memoria a un servidor o se añade más espacio de almacenamiento. El escalado vertical tiene un límite claro y llega un punto en el que la aplicación necesita ser rediseñada para poder escalar más. En inglés a este tipo de escalado se le denomina "Scale Up".
- Escalado horizontal: en este caso el escalado se consigue simplemente añadiendo más nodos al sistema, por ejemplo, poniendo otra máquina en paralelo a funcionar. Este tipo de escalado es más sencillo y no tiene límite, pero implica que las aplicaciones estén adaptadas para poder hacerlo, pues implican coordinación, replicación, etc... Se denomina comúnmente como "Scale Out".
Los sistemas NoSQL son sistemas de almacenamiento de información ágiles, de gran rendimiento, distribuidos y, en casi todos los casos, escalables horizontalmente.
Esto último es muy importante porque permiten manejar eficientemente volúmenes de datos muy grandes y además escalar a voluntad con una gran simplicidad, lo cual los hace muy atractivos para aplicaciones que puedan llegar a crecer mucho. Por ello son muy utilizados por todas las grandes empresas de Internet, juegos, apps masivas para móviles, etc...
El teorema de Brewer o teorema CAP
Eric Brewer, un profesor de la Universidad de Berkeley, formuló un teorema acerca de las tres dimensiones de los sistemas distribuidos (de almacenamiento de datos en este caso), que son:
- Consistencia (Consistency): implica que la información permanece coherente y consistente después de cualquier operación sobre los datos, de modo que cualquier usuario que acceda a los mismos verá la misma información.
- Disponibilidad (Availability): significa que toda la información del sistema de almacenamiento de datos distribuido está siempre disponible.
- Tolerancia de las Particiones (Partition Tolerance): se refiere a que las diferentes partes del sistema distribuido (los nodos) continuarán funcionando normalmente aunque la comunicación entre ellos se vea interrumpida o no sea confiable.
Según el teorema no es posible cumplir con las tres dimensiones a la vez. Hay que elegir dos de ellas, y de las 3 parejas resultantes se generan diferentes tipos de sistemas distribuidos de almacenamiento:
- C y A: Son sistemas en los que si falla la comunicación entre sus nodos el conjunto no puede trabajar.
- C y P: en estos, si algo ocurre parte de la información no estará disponible, pero seguirán funcionando y la información disponible será consistente.
- A y P: durante un fallo de uno de los nodos (o falta de comunicación) la información estará disponible pero puede que no sea consistente.
Gracias a estas parejas podemos clasificar los sistemas de almacenamiento de datos y conocer a qué categoría pertenece cada uno de los sistemas más populares, sabiendo en cada caso qué características nos pueden proporcionar y si se adaptan a nuestras necesidades. La mejor forma de verlo es de manera gráfica:
Como vemos, MongoDB está situado en la categoría C+P, es decir, que ofrece consistencia y tolerancia a caídas en sus nodos, pero puede que alguna información quede entonces no disponible.
Es importante saber ubicar nuestro gestor de datos (u otro sistema) dentro de estos conjuntos ya que ello nos permitirá tomar decisiones sobre arquitectura que más tarde pueden ser críticas para nuestra aplicación.
MongoDB
MongoDB es un gestor de datos NoSQL distribuido de tipo documental que almacena documentos en un formato similar a JSON (para ser más exactos internamente usa BSON). Está escrita en C++ y es multi-plataforma, Open Source y gratuito.
El proyecto nació a finales del año 2007 como un proyecto interno de una empresa llamada 10Gen para usarlo en una aplicación de Internet que estaban desarrollando, pero en 2009 decidieron liberarlo como Open Source y dedicarse íntegramente a él, ofreciendo soporte comercial y servicios relacionados.
Su nombre proviene de la palabra en inglés Humongous, que significa literalmente "algo realmente grande", y se refiere a su capacidad de gestionar cantidades enormes de datos.
Sus principales características son:
- Basado en el motor V8 de Google Chrome para JavaScript. Facilidad de aprendizaje por basarse en este lenguaje.
- Almacenamiento flexible basado en JSON sin necesidad de definir esquemas previamente.
- Soporte para creación de índices a partir de cualquier atributo, lo que facilita mucho su uso para porque no es necesario definir procesos Map-Reduce.
- Alto rendimiento para consultas y actualizaciones.
- Consultas flexibles basadas en documentos.
- Alta capacidad de crecimiento, replicación y escalabilidad: puedes escalar horizontalmente simplemente añadiendo máquinas baratas sin ver afectado el rendimiento ni complicar la gestión.
- Soporte para almacenamiento independiente de archivos de cualquier tamaño basado en GridFS.
- Soporte para tareas Map-Reduce si es necesario.
Aplicaciones de MongoDB
Este tipo de bases de datos no sustituyen a las bases de datos tradicionales, como SQL Server, Oracle o MySQL, sino que las complementan para ciertos tipos de aplicaciones especializadas. Las bases de datos documentales como MongoDB se utilizan para multitud de tareas, pero fundamentalmente cuando necesitamos flexibilidad en la definición de los datos, sencillez a la hora de acceder a éstos, gran rendimiento y posibilidad de crecer muy rápido.
Es adecuada para crear aplicaciones de Internet que registren muchos datos o que simplemente queramos crear de manera muy flexible, pero también para sistemas muy grandes como registradores de datos de sensores, que pueden llegar a recibir decenas o cientos de miles de lecturas de datos por segundo, pasando por gestores de datos de ventas, infraestructura de almacenamiento para redes sociales, juegos masivos online, gestores de contenidos, aplicaciones de análisis de datos y reporting...
Actualmente lo utilizan para empresas como eBay, Foursquare, SourceForge, The New York Times, The Guardian, SAP, o el propio CERN en su gran colisionador de hadrones, pero también muchas empresas pequeñas que quieren poder desarrollar de manera ágil, barata, sencilla y sin miedo a poder crecer más adelante.
Al estar basada en JavaScript se lleva especialmente bien con todo tipo de aplicaciones web, especialmente las más modernas Single Page Applications.
En general MongoDB puede utilizarse para casi cualquier cosa para la que utilizarías SQL Server o MySQL, pero sin la rigidez que presentan este tipo de bases de datos.
En este interesante enlace (en inglés) encontrarás una lista exhaustiva de aplicaciones típicas de las bases de datos NoSQL en general.
A lo largo de las próximas semanas -fundamentalmente a través de vídeos- vamos a ir viendo los fundamentos de trabajo con MongoDB: su instalación en varios sistemas operativos, sus conceptos básicos importantes y uso básico desde algún lenguaje, como C#.
¡No te lo pierdas!
Viñeta del lateral por Geek&Poke.