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:
| Propiedad | Garantía |
|---|---|
| Atomicidad | Se aplican todas las operaciones de la transacción o ninguna |
| Consistencia | La base pasa de un estado válido a otro, respetando las restricciones |
| Aislamiento | Las transacciones concurrentes no ven estados intermedios entre sí |
| Durabilidad | Una 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:
| Familia | Modelo | Ejemplos | Uso típico |
|---|---|---|---|
| Documental | Documentos tipo JSON con estructura propia | MongoDB, Firestore, CouchDB | Perfiles, catálogos, contenido, mensajes |
| Clave-valor | Un valor opaco asociado a una clave | Redis, DynamoDB | Caché, sesiones, contadores |
| Columnar ancha | Filas con columnas dinámicas, distribuidas por partición | Cassandra, ScyllaDB | Series de tiempo, telemetría, registros masivos |
| Grafo | Nodos y relaciones como ciudadanos de primera clase | Neo4j, Amazon Neptune | Redes 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
| Criterio | Inclina hacia SQL | Inclina hacia NoSQL |
|---|---|---|
| Relaciones entre entidades | Muchas y consultadas en conjunto | Pocas; los datos se leen agregados |
| Estructura de los datos | Estable y conocida | Variable o en evolución constante |
| Integridad | Transacciones entre varias entidades (pagos) | Operaciones sobre un solo registro |
| Volumen y escritura | Moderados, escalado vertical suficiente | Muy altos, distribución en muchos nodos |
| Consultas | Ad hoc, analíticas, con agregaciones | Patrones 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):
- Descarga DB Browser for SQLite (versión portable) desde sqlitebrowser.org.
- New Database →
tienda.db, y en la pestaña Execute SQL ejecuta las dos sentenciasCREATE TABLEde esta guía. - Inserta datos (
INSERT INTO clientes ...,INSERT INTO pedidos ...) y pulsa Write Changes. - Ejecuta la consulta con
JOINy prueba a insertar un pedido con uncliente_idinexistente. En SQLite la integridad referencial se activa conPRAGMA foreign_keys = ON;.
NoSQL con MongoDB:
- Descarga MongoDB Community Server (archivo ZIP) y MongoDB Compass desde mongodb.com.
- Inicia el servidor:
mongod --dbpath C:\datos\mongo --bind_ip 127.0.0.1. - En Compass, conéctate a
mongodb://127.0.0.1:27017, crea la baseapp_chaty la colecciónmensajes, e inserta documentos con campos distintos. - 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
- Documentación de SQLite, incluida la sección de claves foráneas.
- Documentación de PostgreSQL: transacciones y niveles de aislamiento.
- MongoDB: modelado de datos.
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
| Database | base de datos |
|---|---|
| SQL | lenguaje para consultar tablas |
| NoSQL | «no solo SQL»: documentos flexibles |
| Query | consulta |
| Table | tabla (filas y columnas) |