1. Qué es
Una base de datos relacional guarda información en tablas, y las tablas se conectan entre sí.
Una tabla tiene tres reglas que una hoja de cálculo no cumple:
- Filas y columnas, con encabezados.
- Cada columna tiene un solo tipo de dato. Si
precioes numérico, no puedes escribir "consultar" en una celda. - Cada encabezado es distinto. No hay dos columnas llamadas igual.
2. Por qué no una hoja de cálculo
Imagina que llevas los pedidos de tu negocio en Excel. Una fila por pedido:
| pedido | cliente | teléfono | ciudad | producto | cantidad |
|---|---|---|---|---|---|
| 1001 | Panadería Sol | 555-1234 | Lima | Café | 10 |
| 1002 | Panadería Sol | 555-1234 | Lima | Azúcar | 5 |
| 1003 | Panadería Sol | 555-9999 | Lima | Café | 8 |
Tres problemas, y los tres son el mismo:
- El teléfono está repetido tres veces. Si cambia, hay que cambiarlo en todas — y en la fila 1003 ya se te escapó una.
- No sabes cuál es el correcto. ¿555-1234 o 555-9999? La hoja no tiene forma de decírtelo.
- Si borras los pedidos, pierdes el teléfono. El dato del cliente vivía dentro del pedido.
El modelo relacional resuelve los tres de un golpe: cada cosa se guarda una sola vez, en su propia tabla.
clientes pedidos
+----+----------------+------+ +------+----+------------+
| id | nombre | tel | | id | id_cliente | fecha |
+----+----------------+------+ +------+----+------------+
| 7 | Panadería Sol | 555… |◄───| 1001 | 7 | 2026-03-01 |
+----+----------------+------+ | 1002 | 7 | 2026-03-02 |
+------+----+------------+
El teléfono existe una vez. Los pedidos no lo guardan: guardan a quién apuntan.
3. Las tres piezas del vocabulario
3.1 Clave primaria (PRIMARY KEY)
La columna que identifica a cada fila sin ambigüedad. No se repite y no puede estar vacía.
En Northwind, customers.customer_id es la clave primaria de los clientes.
3.2 Clave foránea (FOREIGN KEY)
Una columna que apunta a la clave primaria de otra tabla. orders.customer_id apunta a customers.customer_id.
Y aquí está la parte que importa: el motor la hace cumplir. Si intentas registrar un pedido de un cliente que no existe, lo rechaza:
INSERT INTO orders (customer_id, employee_id, order_date)
VALUES ('ZZZZZ', 1, '1997-01-01');
ERROR: insert or update on table "orders" violates foreign key constraint
No es una advertencia. Es una negativa. Tu base no puede quedar en un estado incoherente.
Esto distingue a una base de datos relacional de un almacén analítico como BigQuery, donde las claves foráneas son solo documentación y nadie las comprueba. Ver
produccion-vs-analisis-oltp-y-olap.
3.3 Cardinalidad
Cuántas filas de una tabla se corresponden con cuántas de la otra.
| Tipo | Ejemplo en Northwind |
|---|---|
| Uno a muchos | Un cliente tiene muchos pedidos |
| Muchos a muchos | Un pedido lleva muchos productos, y un producto aparece en muchos pedidos |
El "muchos a muchos" no se puede guardar directo — hace falta una tabla en medio. En Northwind es order_details, y por eso existe.
4. Ejemplos sobre Northwind
Cuántos pedidos tiene cada cliente — un "uno a muchos" en acción:
SELECT c.company_name, count(o.order_id) AS pedidos
FROM customers c
LEFT JOIN orders o USING (customer_id)
GROUP BY c.company_name
ORDER BY pedidos DESC
LIMIT 3;
company_name | pedidos
--------------------+---------
Save-a-lot Markets | 31
Ernst Handel | 30
QUICK-Stop | 28
Y la tabla del medio, order_details, que resuelve el "muchos a muchos":
SELECT order_id, count(*) AS lineas
FROM order_details
GROUP BY order_id
ORDER BY lineas DESC
LIMIT 3;
order_id | lineas
----------+--------
11077 | 25
10657 | 6
El pedido 11077 tiene 25 productos distintos. Sin order_details, esos 25 no cabrían en una fila de orders.
5. Errores comunes
- Creer que "relacional" significa "las tablas se relacionan". Significa que los datos se guardan como relaciones (tablas). Que se conecten es consecuencia, no definición.
- Meter varios valores en una celda.
"Café, Azúcar, Harina"en una columna es exactamente lo que el modelo relacional viene a evitar. Eso son tres filas. - Confundir clave primaria con "la primera columna". Es la que identifica, esté donde esté. En
order_detailsson dos columnas juntas:order_idyproduct_id.
6. Ejercicios
- Sin ejecutar nada: si un cliente cambia de teléfono, ¿cuántas filas hay que modificar en Northwind? ¿Y en la hoja de cálculo del punto 2?
- Lista las claves primarias de las 12 tablas. Pista:
information_schema.table_constraintsunida coninformation_schema.key_column_usage. - ¿Qué tabla tiene una clave primaria formada por dos columnas? ¿Por qué tiene sentido que sea así?
- Encuentra en Northwind otra relación "muchos a muchos" distinta de la de pedidos y productos.
7. Pregunta de negocio
El gerente quiere saber si hay clientes registrados que nunca hayan comprado nada, para llamarlos.
No te digo qué columnas ni qué tablas. Piensa primero qué significa "nunca compró" en términos de las dos tablas.