← Todos los temas
Día 3 · Cómo habla el software

Bases de datos: SQL y NoSQL

Bases de datos relacionales y NoSQL: modelo relacional, claves e integridad referencial, SQL, transacciones ACID, las cuatro familias NoSQL, escalado horizontal, teorema CAP, índices y criterios de elección.

Definición

Una base de datos es un conjunto organizado de datos almacenados de forma persistente: sobreviven al cierre de la aplicación y al reinicio del equipo. Se administra mediante un sistema gestor de bases de datos (SGBD o DBMS), el software que se encarga de guardar, consultar, proteger y recuperar esos datos de forma concurrente y segura. PostgreSQL, MySQL, SQLite, MongoDB y Redis son SGBD.

La decisión más importante al diseñar el almacenamiento de una aplicación es el modelo de datos: cómo se estructura la información. Los dos grandes enfoques son el relacional (SQL) y el no relacional (NoSQL).

El modelo relacional

El modelo relacional organiza los datos en tablas (relaciones). Cada tabla tiene columnas con un nombre y un tipo definidos (el esquema) y filas (registros) que cumplen ese esquema.

  • Clave primaria (primary key): columna que identifica de forma única cada fila (id).
  • Clave foránea (foreign key): columna que referencia la clave primaria de otra tabla y expresa la relación entre ambas.
  • Integridad referencial: el SGBD impide referencias inválidas, por ejemplo un pedido asignado a un cliente que no existe.
CREATE TABLE clientes (
  id INTEGER PRIMARY KEY,
  nombre TEXT NOT NULL,
  ciudad TEXT NOT NULL
);

CREATE TABLE pedidos (
  id INTEGER PRIMARY KEY,
  cliente_id INTEGER NOT NULL REFERENCES clientes(id),
  producto TEXT NOT NULL,
  total REAL NOT NULL,
  fecha TEXT NOT NULL
);

El esquema se valida al escribir (schema-on-write): un registro que no cumple los tipos o las restricciones se rechaza. El diseño suele seguir la normalización, que elimina la duplicación separando las entidades en tablas relacionadas: el nombre del cliente se guarda una sola vez y los pedidos lo referencian por su id.

SQL: el lenguaje de consulta

SQL (Structured Query Language) es el lenguaje estándar para definir y consultar bases relacionales. Se divide en definición de estructuras (DDL: CREATE, ALTER, DROP) y manipulación de datos (DML: SELECT, INSERT, UPDATE, DELETE). Es declarativo: se describe qué resultado se quiere y el motor decide cómo obtenerlo.

SELECT clientes.nombre, pedidos.producto, pedidos.total
FROM pedidos
JOIN clientes ON clientes.id = pedidos.cliente_id
WHERE clientes.nombre = 'Ana López';

JOIN combina las filas de ambas tablas a través de la clave foránea; WHERE filtra. Las agregaciones (COUNT, SUM, AVG con GROUP BY) permiten responder preguntas como el total vendido por ciudad en una sola consulta.

Transacciones y propiedades ACID

Una transacción agrupa varias operaciones que deben aplicarse como una unidad. Las bases relacionales garantizan las propiedades ACID:

PropiedadGarantía
AtomicidadSe aplican todas las operaciones de la transacción o ninguna
ConsistenciaLa base pasa de un estado válido a otro, respetando las restricciones
AislamientoLas transacciones concurrentes no ven estados intermedios entre sí
DurabilidadUna transacción confirmada sobrevive a fallas del sistema

Por eso el modelo relacional es la opción habitual para dinero, inventarios y reservas: un cargo no puede quedar registrado sin su abono correspondiente.

Las bases NoSQL

NoSQL («no solo SQL») agrupa los SGBD que no usan el modelo de tablas relacionadas. Surgieron para manejar volúmenes y velocidades de escritura muy altos, datos de estructura variable y distribución en muchos servidores. Hay cuatro familias principales:

FamiliaModeloEjemplosUso típico
DocumentalDocumentos tipo JSON con estructura propiaMongoDB, Firestore, CouchDBPerfiles, catálogos, contenido, mensajes
Clave-valorUn valor opaco asociado a una claveRedis, DynamoDBCaché, sesiones, contadores
Columnar anchaFilas con columnas dinámicas, distribuidas por particiónCassandra, ScyllaDBSeries de tiempo, telemetría, registros masivos
GrafoNodos y relaciones como ciudadanos de primera claseNeo4j, Amazon NeptuneRedes sociales, recomendaciones, detección de fraude

El modelo documental

En una base documental, cada registro es un documento (en MongoDB, BSON: un JSON binario con tipos adicionales como fechas) agrupado en colecciones. Los documentos de una misma colección pueden tener campos distintos; la estructura se interpreta al leer (schema-on-read).

{ "de": "Ana", "tipo": "texto", "texto": "¿Ya viste el partido?" }
{ "de": "Luis", "tipo": "foto", "foto": { "url": "fotos/estadio.jpg", "ancho": 1080 } }
{ "de": "Ana", "tipo": "ubicacion", "ubicacion": { "lat": 19.5438, "lng": -96.9102 } }

La decisión clave de diseño es embeber o referenciar: los datos que se leen juntos se guardan en el mismo documento (una sola lectura, sin JOIN); los que crecen sin límite o se comparten entre muchos documentos se guardan aparte y se referencian por su identificador. MongoDB admite transacciones ACID de varios documentos desde la versión 4.0, aunque el diseño documental busca que la mayoría de las operaciones afecten a un solo documento.

Escalabilidad y el teorema CAP

  • Escalado vertical: un servidor más potente. Simple, con un límite físico y de costo.
  • Escalado horizontal: repartir los datos entre muchos servidores mediante particionado (sharding) y copiarlos mediante replicación. Muchas bases NoSQL nacieron con este escalado integrado; las relacionales lo logran con más trabajo de diseño o con productos distribuidos (CockroachDB, Spanner, extensiones de PostgreSQL).

El teorema CAP establece que, cuando ocurre una partición de red entre nodos, un sistema distribuido debe elegir entre consistencia (todos los nodos responden con el dato más reciente o no responden) y disponibilidad (todos responden, aunque el dato pueda estar desactualizado). Por eso algunos sistemas NoSQL ofrecen consistencia eventual: las réplicas convergen al mismo valor tras un breve intervalo.

Índices

Un índice es una estructura auxiliar, normalmente un árbol B, que permite localizar filas o documentos sin recorrer toda la tabla. Acelera las lecturas por las columnas indexadas a cambio de más espacio y de escrituras algo más lentas, porque cada inserción también actualiza el índice. Se crean sobre los campos usados en filtros, uniones y ordenamientos frecuentes.

Criterios para elegir

CriterioInclina hacia SQLInclina hacia NoSQL
Relaciones entre entidadesMuchas y consultadas en conjuntoPocas; los datos se leen agregados
Estructura de los datosEstable y conocidaVariable o en evolución constante
IntegridadTransacciones entre varias entidades (pagos)Operaciones sobre un solo registro
Volumen y escrituraModerados, escalado vertical suficienteMuy altos, distribución en muchos nodos
ConsultasAd hoc, analíticas, con agregacionesPatrones de acceso conocidos de antemano

En la práctica, muchas arquitecturas combinan ambas (persistencia políglota): PostgreSQL para pedidos y pagos, Redis como caché y un motor documental o de búsqueda para el catálogo.

Práctica: SQL y NoSQL en tu computadora

SQL con SQLite (sin servidor: la base es un archivo):

  1. Descarga DB Browser for SQLite (versión portable) desde sqlitebrowser.org.
  2. New Database → tienda.db, y en la pestaña Execute SQL ejecuta las dos sentencias CREATE TABLE de esta guía.
  3. Inserta datos (INSERT INTO clientes ..., INSERT INTO pedidos ...) y pulsa Write Changes.
  4. Ejecuta la consulta con JOIN y prueba a insertar un pedido con un cliente_id inexistente. En SQLite la integridad referencial se activa con PRAGMA foreign_keys = ON;.

NoSQL con MongoDB:

  1. Descarga MongoDB Community Server (archivo ZIP) y MongoDB Compass desde mongodb.com.
  2. Inicia el servidor: mongod --dbpath C:\datos\mongo --bind_ip 127.0.0.1.
  3. En Compass, conéctate a mongodb://127.0.0.1:27017, crea la base app_chat y la colección mensajes, e inserta documentos con campos distintos.
  4. Filtra con { "tipo": "foto" } en la barra de consulta y revisa la pestaña Schema para ver cómo Compass infiere la estructura.

Preguntas frecuentes

¿Qué diferencia hay entre SQL y NoSQL?

Las bases SQL (relacionales) guardan los datos en tablas con columnas fijas y relaciones entre ellas, y se consultan con el lenguaje SQL. Las bases NoSQL usan otros modelos, como documentos, clave-valor o grafos, con esquemas más flexibles.

¿Cuándo conviene usar una base de datos SQL?

Cuando los datos tienen una estructura clara, hay relaciones entre ellos y se necesitan transacciones confiables (propiedades ACID): pagos, inventarios, pedidos o cuentas de usuario.

¿Cuándo conviene usar una base de datos NoSQL?

Cuando la forma de los datos cambia seguido, se leen como documentos completos o hay que repartir grandes volúmenes entre muchos servidores: catálogos, perfiles, registros de eventos o contenido.

¿MongoDB es SQL o NoSQL?

MongoDB es una base NoSQL de tipo documental: guarda cada registro como un documento parecido a JSON. PostgreSQL, MySQL y SQLite son bases SQL.

Referencias

En el reel lo explicamos así

SQL es un archivero con carpetas todas iguales y etiquetadas. NoSQL es un cajón donde cada nota puede tener su propio formato.

Glosario: del inglés al español

Databasebase de datos
SQLlenguaje para consultar tablas
NoSQL«no solo SQL»: documentos flexibles
Queryconsulta
Tabletabla (filas y columnas)