¿Por qué NoSQL?
Las bases de datos relacionales (RDBMS) dominan desde los años 80, y con razón: esquema claro, SQL potente y transacciones confiables. Pero el Big Data trajo requisitos que no encajan bien en ese modelo:
- Escalamiento horizontal: repartir datos entre cientos de nodos baratos, no un servidor gigante.
- Esquemas flexibles: datos semi-estructurados (JSON, logs) que cambian de forma constante.
- Volumen y velocidad extremos: millones de escrituras por segundo.
NoSQL (“Not Only SQL”) no es una tecnología única sino una familia de modelos de datos que sacrifican parte de la rigidez relacional a cambio de escalabilidad y flexibilidad. Hay cuatro modelos principales.
Los cuatro modelos NoSQL
1. Clave-valor
El modelo más simple: un diccionario gigante distribuido. Cada dato se guarda bajo una clave única y la base de datos no interpreta el valor (es un blob opaco). Ejemplo representativo: Redis (también DynamoDB, Memcached).
- Ideal para: cachés, sesiones de usuario, contadores, colas simples.
- Límite: solo puedes buscar por clave; no hay consultas por contenido.
2. Documentos
Los valores son documentos estructurados (normalmente JSON/BSON) con esquema flexible: cada documento puede tener campos distintos. Ejemplo: MongoDB (también CouchDB, Firestore).
- Ideal para: catálogos, perfiles de usuario, contenido, APIs — cualquier entidad que se lee y escribe como unidad.
- Límite: las uniones (joins) entre colecciones son costosas; se modela por agregado, no por normalización.
3. Columnar (familias de columnas)
Los datos se organizan en familias de columnas dispersas: cada fila puede tener columnas distintas y se almacenan juntas las columnas que se consultan juntas. Ejemplos: Cassandra, HBase (inspiradas en BigTable de Google).
- Ideal para: series temporales, telemetría, escrituras masivas, datasets con billones de filas.
- Límite: el modelo de consultas es rígido; hay que diseñar las tablas pensando en las consultas desde el inicio.
4. Grafos
Los datos son nodos y relaciones con propiedades, optimizados para recorrer conexiones. Ejemplo: Neo4j (también Amazon Neptune).
- Ideal para: redes sociales, detección de fraude, motores de recomendación, redes de conocimiento.
- Límite: no brilla en agregaciones masivas sobre datos tabulares; es especialista en recorridos.
graph TD NOSQL["Bases de datos NoSQL"] NOSQL --> KV["Clave-valor<br/>Redis, DynamoDB"] NOSQL --> DOC["Documentos<br/>MongoDB, Firestore"] NOSQL --> COL["Columnar<br/>Cassandra, HBase"] NOSQL --> GRA["Grafos<br/>Neo4j"] KV --> KV1["usuario:1234 → datos de sesión"] DOC --> DOC1["JSON: nombre, email, pedidos..."] COL --> COL1["Fila → familias de columnas"] GRA --> GRA1["(Ana) -SIGUE_A→ (Luis)"]
NoSQL vs. RDBMS
| Criterio | RDBMS (PostgreSQL, MySQL) | NoSQL |
|---|---|---|
| Modelo | Tablas normalizadas, relaciones | Depende: clave-valor, documento, columnas, grafo |
| Esquema | Fijo, definido antes de escribir | Flexible o inexistente (schema on write ligero) |
| Escalamiento | Principalmente vertical | Horizontal por diseño (sharding nativo) |
| Consultas | SQL con joins arbitrarios | Por clave o por agregado; joins limitados |
| Transacciones | ACID completas | Normalmente BASE (consistencia eventual) |
| Caso ideal | Datos relacionales, integridad crítica | Volumen masivo, esquemas cambiantes, alta disponibilidad |
No es “NoSQL reemplaza a SQL”. En arquitecturas reales conviven: el RDBMS guarda la verdad transaccional (pagos, inventario) y los sistemas NoSQL manejan el volumen y la velocidad (logs, sesiones, recomendaciones). Esto se conoce como persistencia políglota.
ACID vs. BASE
Las RDBMS garantizan ACID:
- Atomicidad: una transacción se completa entera o no ocurre.
- Consistencia: cada transacción lleva la base de un estado válido a otro.
- Islamiento: transacciones concurrentes no se interfieren.
- Durabilidad: lo confirmado sobrevive a fallos.
Los sistemas NoSQL distribuidos suelen ofrecer BASE, un juego de palabras deliberado:
- Basically Available: el sistema responde siempre, aunque sea con datos parciales o desactualizados.
- Soft state: el estado puede cambiar con el tiempo aun sin escrituras nuevas (por la propagación de réplicas).
- Eventual consistency: si dejas de escribir, todas las réplicas terminarán convergiendo al mismo valor.
La razón profunda de esta renuncia la veremos en la próxima lección con el teorema CAP: en un sistema distribuido, ante una partición de red, no puedes tener a la vez consistencia estricta y disponibilidad total.
Ejercicio: CRUD estilo documento en Python
🧪 Ejercicio
Mini base de datos de documentos
Implementa las cuatro operaciones CRUD sobre una 'colección' de documentos (una lista de diccionarios): `crear(coleccion, doc)` añade un documento con un id autoincremental, `leer(coleccion, id)` devuelve el documento con ese id, `actualizar(coleccion, id, cambios)` fusiona los cambios en el documento, y `eliminar(coleccion, id)` lo quita. Pruébalas con una colección de usuarios.
🔍 Usa un contador global o el máximo id existente + 1 para el autoincremental. Para actualizar, dict.update() fusiona los cambios.
coleccion = []
siguiente_id = 1
def crear(coleccion, doc):
global siguiente_id
doc = dict(doc)
doc["_id"] = siguiente_id
siguiente_id += 1
coleccion.append(doc)
return doc["_id"]
def leer(coleccion, id):
for doc in coleccion:
if doc["_id"] == id:
return doc
return None
def actualizar(coleccion, id, cambios):
doc = leer(coleccion, id)
if doc is None:
return False
doc.update(cambios)
return True
def eliminar(coleccion, id):
doc = leer(coleccion, id)
if doc is None:
return False
coleccion.remove(doc)
return True
uid = crear(coleccion, {"nombre": "Ana", "email": "ana@uni.edu"})
crear(coleccion, {"nombre": "Luis", "carrera": "Computación"})
actualizar(coleccion, uid, {"carrera": "Estadística"})
print(leer(coleccion, uid))
eliminar(coleccion, uid)
print(leer(coleccion, uid)) # NoneComprueba lo aprendido
Comprueba que lo pillaste
Una aplicación necesita guardar perfiles de usuario donde cada perfil puede tener campos distintos (algunos tienen teléfono, otros redes sociales, otros nada extra). ¿Qué modelo NoSQL encaja mejor?
Las bases de documentos (como MongoDB) guardan entidades completas como JSON con esquema flexible: cada documento puede tener campos distintos, ideal para perfiles heterogéneos.
Comprueba que lo pillaste
¿Cuál es la principal ventaja de un modelo de grafos como Neo4j frente a una base relacional?
En un grafo, las relaciones son ciudadanos de primera clase: recorrer 'amigos de amigos' es un traversal directo. En SQL eso exige joins recursivos costosos.
Comprueba que lo pillaste
¿Qué significa la 'E' de BASE?
BASE = Basically Available, Soft state, Eventual consistency. La consistencia eventual promete que, sin nuevas escrituras, todas las réplicas terminarán coincidiendo.
Resumen
- NoSQL es una familia de modelos pensada para escalamiento horizontal y esquemas flexibles, no un reemplazo universal de SQL.
- Los cuatro modelos: clave-valor (Redis: caché/sesiones), documentos (MongoDB: entidades JSON flexibles), columnar (Cassandra/HBase: escritura masiva y series temporales), grafos (Neo4j: datos conectados).
- Frente a las RDBMS: se gana escalabilidad y flexibilidad, se pierden joins arbitrarios y transacciones estrictas.
- ACID (transacciones estrictas) vs. BASE (disponibilidad básica, estado blando, consistencia eventual).
- La persistencia políglota combina ambos mundos en una misma arquitectura.
📚 Lecturas y fuentes
| Recurso | Tipo | Por qué leerlo |
|---|---|---|
| NoSQL (Wikipedia en español) | Artículo | Lee la introducción y la tabla de “Tipos de bases de datos NoSQL”: repaso rápido de los cuatro modelos con más ejemplos de sistemas. |
| MongoDB — Data Modeling | Docs | Solo “Embedded Data Models” vs. “Normalized Data Models”: el cambio mental de modelar por agregado en lugar de normalizar (en inglés). |
| Bigtable: A Distributed Storage System for Structured Data (Google, OSDI 2006) | Paper | Origen del modelo columnar (Cassandra y HBase salen de aquí). Lee la sección 2 “Data Model”, págs. 2-3; el resto es implementación (en inglés). |
| Dynamo: Amazon’s Highly Available Key-value Store (SOSP 2007) | Paper | El paper fundacional del clave-valor distribuido y de BASE. Lee la sección 4.1-4.4 (particionado, replicación y versiones) antes de la próxima lección (en inglés). |