Lección 2 de 313 min
NoSQL: MongoDB, Redis y DynamoDB
Documentos, pares clave-valor y diseño a partir de los patrones de acceso.
El carrito de la compra de cada visitante, que caduca a la media hora. El ranking de un juego que cambia cien veces por segundo. Una ficha de producto en la que cada categoría tiene atributos distintos. Todo eso cabe en una base de datos relacional, pero no siempre de la forma más cómoda ni más rápida.
«NoSQL» (que hoy se lee «not only SQL») agrupa bases de datos que renuncian al modelo de tablas para ganar otra cosa: flexibilidad, velocidad o escala casi ilimitada. No es una tecnología, sino una familia: documentos, clave-valor, columnas anchas, grafos. En esta lección ves tres representantes muy distintos (MongoDB, Redis y DynamoDB) y la idea que cambia al diseñar para ellas: empezar por las preguntas, no por las entidades.
Documentos y clave-valor
MongoDB guarda documentos: objetos con campos anidados, como un JSON. Redis y DynamoDB son de tipo clave-valor: das una clave y obtienes su valor, muy deprisa. Redis lo hace en memoria, en un servidor que administras tú o tu proveedor; DynamoDB, como servicio totalmente gestionado de AWS.
MongoDB
Documentos flexibles con forma de JSON, agrupados en colecciones.
- Modelo:
- Documentos
- Formato:
- BSON
- Licencia:
- SSPL
MongoDB guarda documentos en colecciones. Internamente usa BSON, un JSON binario con tipos adicionales como fechas, ObjectId o decimales exactos. El esquema es flexible: dos documentos de la misma colección pueden tener campos distintos, y puedes incrustar datos relacionados, como las líneas de un pedido dentro del pedido, para leerlo todo de una vez sin uniones.
Las consultas se escriben como objetos de filtro, y los análisis, con el pipeline de agregación: una lista de etapas que transforman los documentos paso a paso ($match filtra, $group agrupa, $sort ordena, $lookup une con otra colección). Admite índices simples, compuestos, sobre arrays, de texto y geográficos, transacciones con varios documentos, replicación y sharding integrados.
Úsalo cuando
Para datos jerárquicos que se leen juntos (catálogos, perfiles, contenidos) y esquemas que cambian a menudo mientras el producto evoluciona.
Ten en cuenta
Esquema flexible no significa sin esquema: si no lo valida nadie, tu código acaba lidiando con diez variantes del mismo documento. Usa la validación con $jsonSchema. No incrustes listas que crecen sin límite, como los comentarios de un post viral: cada documento tiene un tamaño máximo de 16 MB.
// Un pedido con sus líneas incrustadas: se lee de una vez
db.pedidos.insertOne({
cliente: { id: 7, nombre: "Ana" },
lineas: [
{ producto: "Teclado", unidades: 1, precio: 4990 }, // en céntimos
{ producto: "Monitor", unidades: 2, precio: 15900 },
],
estado: "pagado",
creado: new Date(),
});
db.pedidos.createIndex({ "cliente.id": 1, creado: -1 });
// Facturación por cliente de los pedidos pagados
db.pedidos.aggregate([
{ $match: { estado: "pagado" } },
{ $unwind: "$lineas" },
{ $group: { _id: "$cliente.id", total: { $sum: { $multiply: ["$lineas.unidades", "$lineas.precio"] } } } },
{ $sort: { total: -1 } },
]);Redis
Estructuras de datos en memoria, con respuestas en fracciones de milisegundo.
- Modelo:
- Clave-valor en memoria
- Persistencia:
- RDB y AOF
- Fork:
- Valkey
Redis guarda pares clave-valor en memoria, pero el valor no es solo un texto: es una estructura de datos. Strings, que también sirven de contadores atómicos con INCR; hashes, objetos de campos y valores; listas, que funcionan como colas; sets, conjuntos sin repetidos; y sorted sets, elementos ordenados por una puntuación, perfectos para rankings. Como todo está en RAM, las operaciones son rapidísimas.
Cada clave puede tener un TTL (tiempo de vida) y desaparecer sola al caducar, lo que lo hace ideal para cachés y sesiones. Para no perderlo todo al reiniciar, ofrece dos formas de persistencia: RDB, instantáneas periódicas, y AOF, un registro de cada escritura; puedes combinarlas o desactivarlas si solo lo usas como caché.
En 2024 Redis dejó de publicarse con su licencia libre original y, como respuesta, la Linux Foundation impulsó Valkey, un fork compatible con los comandos de Redis. Desde entonces los dos proyectos siguen caminos propios, así que, si usas un servicio gestionado, comprueba cuál de los dos tienes detrás. Verás Redis como caché a fondo en el módulo de caché y mensajería.
Úsalo cuando
Para cachés, sesiones, contadores, límites de peticiones, rankings, colas sencillas y cualquier dato pequeño que se lee muchísimo.
Ten en cuenta
Todo tiene que caber en memoria, que es cara: decide qué hacer cuando se llene (las políticas de expulsión). Con RDB puedes perder lo escrito desde la última instantánea. Úsalo como base de datos principal solo si entiendes y aceptas su durabilidad.
# String con caducidad: una sesión que expira en 30 minutos
SET sesion:9f2c "usuario:7" EX 1800
# Hash: un objeto con campos
HSET usuario:7 nombre "Ana" ciudad "Valencia"
HGET usuario:7 nombre
# Contador atómico
INCR visitas:post:58
# Lista como cola de tareas
LPUSH cola:correos "bienvenida:7"
RPOP cola:correos
# Sorted set: los tres primeros del ranking
ZADD ranking 1500 "ana" 1320 "luis" 990 "marta"
ZRANGE ranking 0 2 REV WITHSCORESDynamoDB
La base de datos clave-valor de AWS, sin servidores y a cualquier escala.
- Proveedor:
- AWS
- Claves:
- Partición y ordenación
- Capacidad:
- Bajo demanda o aprovisionada
DynamoDB es un servicio totalmente gestionado de AWS: no hay servidores que administrar ni conexiones que agotar, y ofrece latencias bajas y estables tenga la tabla mil elementos o mil millones. Cada elemento se identifica por su clave primaria, que puede ser solo una clave de partición o una clave de partición más una clave de ordenación.
La clave de partición decide en qué partición física se guarda el elemento; la de ordenación ordena los elementos dentro de esa partición y permite consultar rangos, como «los pedidos de este cliente en noviembre». Leer por clave (GetItem, Query) es rápido y barato; un Scan recorre la tabla entera. Los índices secundarios globales (GSI) permiten consultar por otras claves.
Es habitual el diseño de tabla única (single-table design): guardar varios tipos de entidad en la misma tabla con claves genéricas, como PK = CLIENTE#7 y SK = PEDIDO#2026-11-02, para que una sola consulta traiga un cliente y sus pedidos. En capacidad eliges entre bajo demanda, pagas por petición, sin planificar, y aprovisionada, reservas capacidad de lectura y escritura, más barata con tráfico estable.
Úsalo cuando
Para aplicaciones serverless en AWS, tráfico enorme o muy variable y patrones de acceso conocidos de antemano, como carritos, sesiones o historiales.
Ten en cuenta
Si una pregunta no encaja con tus claves o índices, solo te queda un Scan, lento y caro. Una clave de partición que concentra el tráfico, como la fecha de hoy, crea una partición caliente. Cada elemento admite como máximo 400 KB.
import { DynamoDBClient } from "@aws-sdk/client-dynamodb";
import { DynamoDBDocumentClient, QueryCommand } from "@aws-sdk/lib-dynamodb";
const db = DynamoDBDocumentClient.from(new DynamoDBClient({}));
// Los pedidos del cliente 7 en noviembre de 2026, en una sola consulta
const { Items } = await db.send(new QueryCommand({
TableName: "Tienda",
KeyConditionExpression: "PK = :pk AND begins_with(SK, :sk)",
ExpressionAttributeValues: {
":pk": "CLIENTE#7",
":sk": "PEDIDO#2026-11",
},
}));Diseñar para NoSQL
Modelar según los patrones de acceso
Primero listas las preguntas que hará la app; después diseñas las claves.
En una base relacional modelas las entidades y sus relaciones, normalizas, y casi cualquier consulta futura se resuelve con un JOIN. En NoSQL, sobre todo en DynamoDB y en buena medida en MongoDB, se trabaja al revés: empiezas por la lista de patrones de acceso, las preguntas concretas que hará tu app, y diseñas claves, índices y documentos para que cada una se responda con una sola lectura.
Eso suele implicar duplicar datos a propósito, por ejemplo guardar el nombre del cliente dentro de cada pedido: es la desnormalización, que verás en la próxima lección. Lo que ganas es que cada lectura sea directa y predecible, tenga la tabla el tamaño que tenga.
Úsalo cuando
Antes de crear la primera tabla de DynamoDB o la primera colección de MongoDB que vaya a crecer mucho.
Ten en cuenta
Un patrón de acceso nuevo que no previste puede exigir un índice nuevo o migrar datos. Y las consultas libres para analizar los datos son difíciles: para eso se exportan a un sistema de análisis.
Patrón de acceso Cómo se resuelve
------------------------------- ------------------------------------------
Ver el perfil del cliente 7 GetItem PK = CLIENTE#7, SK = PERFIL
Sus pedidos, del más reciente Query PK = CLIENTE#7, SK empieza por PEDIDO#
Un pedido por su número Query en el GSI1 GSI1PK = PEDIDO#381
Pedidos pendientes de envío Query en el GSI2 GSI2PK = ESTADO#pendienteBases de datos multimodelo
Una sola base de datos que trabaja con varios modelos de datos.
Las fronteras entre familias se han difuminado. PostgreSQL guarda e indexa documentos con JSONB; MongoDB ofrece transacciones con varios documentos y uniones con $lookup; Redis añade módulos y funciones para documentos JSON o búsquedas. Una base de datos multimodelo es la que combina varios de estos modelos en un mismo motor.
La consecuencia práctica: a menudo no necesitas una base de datos distinta para cada tipo de dato. Una sola bien elegida cubre varios casos y te ahorra operar, respaldar y vigilar más piezas.
Úsalo cuando
Cuando una parte pequeña de tus datos no encaja con el modelo principal, como unos cuantos documentos semiestructurados en una app relacional.
Ten en cuenta
Hacer de todo no es hacerlo todo igual de bien. Si una carga se convierte en la principal, como millones de documentos o una caché con muchísimo tráfico, una base de datos especializada puede rendir mejor.
CREATE TABLE eventos (id BIGSERIAL PRIMARY KEY, datos JSONB NOT NULL);
INSERT INTO eventos (datos)
VALUES ('{"tipo": "clic", "pagina": "/inicio", "dispositivo": {"so": "Android"}}');
-- Clics por sistema operativo, leyendo dentro del JSON
SELECT datos->'dispositivo'->>'so' AS so, count(*)
FROM eventos
WHERE datos->>'tipo' = 'clic'
GROUP BY so;Nota
Una buena forma de empezar es escribir en una tabla los patrones de acceso, con cuántas veces por segundo se usará cada uno. Esa lista te dice qué base de datos encaja mejor y cómo diseñar sus claves.
Interactivo
Cinco bases de datos cara a cara
Activa o desactiva opciones para compararlas cara a cara.
| Característica | PostgreSQL | MongoDB | Redis |
|---|---|---|---|
| Modelo | Relacional, con JSONB | Documentos BSON | Clave-valor en memoria, con estructuras |
| Consultas | SQL completo, con JOIN | Filtros y pipeline de agregación | Por clave, con comandos para cada estructura |
| Esquema | Estricto, con JSONB para lo flexible | Flexible, con validación opcional | Sin esquema |
| Transacciones | ACID completas | Atómicas por documento; también con varios documentos | Cada comando es atómico; MULTI agrupa varios |
| Escalado | Vertical y réplicas de lectura; sharding con extensiones | Réplicas y sharding integrados | Réplicas y Redis Cluster |
| Encaja con | Uso general, datos relacionados, geodatos | Catálogos, contenidos, esquemas que cambian | Caché, sesiones, contadores, rankings |
Ponlo en práctica
Saber qué es cada cosa es la mitad del trabajo. La otra mitad es reconocer cuándo usarla.
Interactivo
¿Qué usarías?
Lee cada situación y elige la opción que mejor la resuelve. Fallar aquí no cuenta: es para practicar.
Las sesiones de tu web se consultan en cada petición, tienen que responder en menos de un milisegundo y deben desaparecer solas tras 30 minutos sin actividad.
Para recordar
- «NoSQL» agrupa modelos muy distintos: documentos como MongoDB, clave-valor en memoria como Redis y clave-valor gestionada como DynamoDB.
- MongoDB guarda documentos BSON flexibles: incrusta lo que se lee junto y usa el pipeline de agregación para analizar.
- Redis vive en memoria y ofrece estructuras de datos con caducidad: ideal para caché, sesiones, contadores y rankings.
- En DynamoDB todo gira en torno a las claves de partición y de ordenación: primero listas los patrones de acceso y después diseñas las claves.
- Las fronteras se difuminan: PostgreSQL guarda documentos con
JSONBy muchas bases NoSQL ya ofrecen transacciones.
Comprueba lo aprendido
Cuestionario
Responde las 5 preguntas para completar la lección.
1.En DynamoDB, ¿para qué sirve la clave de ordenación (sort key)?
2.Usas Redis con instantáneas RDB cada pocos minutos y la máquina se apaga de golpe. ¿Qué puede ocurrir?
3.¿Cuándo conviene incrustar datos dentro de un documento de MongoDB en lugar de guardarlos en otra colección?
4.En DynamoDB necesitas buscar pedidos por un atributo que no forma parte de ninguna clave ni índice. ¿Qué ocurre?
5.¿Qué hace
SET sesion:9f2c "usuario:7" EX 1800en Redis?