1.1. ¿Qué es NoSQL?
NoSQL o "No solamente SQL" (Not Only SQL) es un término acuñado por Carlo Strozzi en 1998 y nuevamente retomado por Eric Evans en 2009 y se refiere a un conjunto de bases de datos que se diferencian en gran parte de las bases de datos convencionales, en características tanto de uso como de implementación; estos tipos de bases de datos no usan SQL o al menos no como lenguaje predeterminado para realizar las consultas. Las bases de datos NoSQL, no soportan totalmente ACID, esto lo explica el teorema del profesor Eric Brewer, Teorema CAP (2000), donde menciona:
Es imposible para un sistema distribuido garantizar simultáneamente las siguientes tres características:
Consistency (Consistencia): todos los nodos ven la misma data al mismo tiempo.
Availability (Disponibilidad): una garantía de que todos los requerimientos recibirán una respuesta de que el requerimiento fue exitoso o fallido.
Partition Tolerance (Tolerancia a la Partición): el sistema continúa operando a pesar de la pérdida arbitraria de mensajes, o la falla de parte del sistema.
En primera instancia es una desventaja, pero gracias a esto permite que los motores de bases de datos no relacionales escalen fácilmente de manera horizontal. Para subsanar el problema de ACID, nuevamente el profesor Brewer ideó BASE (Basically Available, Soft-state, Eventually consistent) que lo conforman los siguientes puntos:
Disponibilidad básica: para cada solicitud se garantiza una respuesta, satisfactoria o falla de ejecución.
Estado "Soft": El estado del sistema puede cambiar con el tiempo, a veces sin cualquier entrada.
Consistencia Eventual: La base de datos puede ser en un momento inconsistente pero será consistente con el tiempo.
El lenguaje SQL no es un lenguaje predominante entre los distintos tipos de bases de datos no relacionales, por lo general cada motor tiene su propio lenguaje de consultas. Cabe destacar que la información no se almacena con un esquema fijo (pero si usando almacenamiento estructurado), aun que si existe un esquema que el DBA o el desarrollador propone con anterioridad de manera virtual, es decir, no se crea en el motor antes de utilizar la base de datos sino al almacenar el primer valor.