Tema
Tablas, filas y claves
En una base de datos relacional todo vive en tablas. En esta lección aprenderás el vocabulario esencial (tabla, fila, columna, clave primaria, clave foránea) y conocerás el esquema de la tienda en línea que usaremos durante todo el curso.
Concepto
Tabla, fila y columna
Piensa en una tabla como una hoja de cálculo con reglas:
txt
columnas (atributos)
┌──────────┬───────────────┬──────────────────┐
│ id │ nombre │ ciudad │ ← encabezado
├──────────┼───────────────┼──────────────────┤
fila ───► │ 1 │ Ana López │ Ciudad de México │
(registro) │ 2 │ Carlos Ruiz │ Guadalajara │
│ 3 │ María Pérez │ Monterrey │
└──────────┴───────────────┴──────────────────┘
tabla: clientes| Término | También llamado | Qué es |
|---|---|---|
| Tabla | Relación, entidad | Conjunto de datos de un mismo tipo (clientes, productos) |
| Columna | Campo, atributo | Una característica con un tipo de dato fijo (nombre, precio) |
| Fila | Registro, tupla | Un elemento concreto (el cliente Ana López) |
| Celda | Valor | La intersección de una fila y una columna |
| Esquema | Schema | La estructura: qué tablas existen y qué columnas tienen |
A diferencia de Excel:
- Cada columna tiene un tipo (no puedes guardar "hola" en una columna de números).
- El orden de las filas no está garantizado: si quieres un orden, lo pides con
ORDER BY. - Cada fila debe poder identificarse de forma única.
Clave primaria (PRIMARY KEY)
La clave primaria (PK) es la columna (o combinación de columnas) que identifica de forma única cada fila. Es como la CURP de una persona: no hay dos iguales y nunca está vacía.
Reglas de una PK:
- Única: no se repite.
- No nula: siempre tiene valor.
- Estable: idealmente nunca cambia.
sql
CREATE TABLE categorias (
id INT PRIMARY KEY, -- clave primaria
nombre VARCHAR(50) NOT NULL
);Claves naturales vs. sustitutas
- Clave natural: un dato real que ya es único (CURP, RFC, ISBN de un libro, correo).
- Clave sustituta (surrogate): un número sin significado generado por la BD (
id1, 2, 3...).
| Natural (ej. email) | Sustituta (ej. id) | |
|---|---|---|
| Significado | Sí | No |
| Puede cambiar | Sí (la gente cambia de correo) | Nunca |
| Tamaño | Texto largo | Entero pequeño, rápido |
| Recomendación | Úsala como UNIQUE | Úsala como PK |
Buena práctica
Usa un id numérico (o UUID) como clave primaria y marca los datos naturales únicos (email, RFC, SKU) con una restricción UNIQUE. Tienes lo mejor de ambos mundos.
Clave foránea (FOREIGN KEY)
Una clave foránea (FK) es una columna que apunta a la clave primaria de otra tabla. Así se crean las relaciones.
txt
categorias productos
┌────┬─────────────┐ ┌────┬──────────────────────┬──────────────┐
│ id │ nombre │ │ id │ nombre │ categoria_id │
├────┼─────────────┤ ├────┼──────────────────────┼──────────────┤
│ 1 │ Electrónica │◄────────────│ 1 │ Audífonos Bluetooth │ 1 │
│ 2 │ Libros │◄──────┐ │ 2 │ Teclado mecánico │ 1 │
│ 3 │ Hogar │ └─────│ 4 │ Libro Aprende SQL │ 2 │
└────┴─────────────┘ └────┴──────────────────────┴──────────────┘
PK FKLa FK garantiza integridad referencial: la BD no te dejará asignar a un producto la categoría 99 si esa categoría no existe.
Clave compuesta
A veces una sola columna no basta para identificar una fila. En detalle_pedido, un mismo producto aparece en muchos pedidos y un pedido tiene muchos productos, pero la combinación (pedido_id, producto_id) es única:
| pedido_id | producto_id | cantidad |
|---|---|---|
| 1 | 1 | 1 |
| 1 | 4 | 2 |
| 2 | 2 | 1 |
Esa combinación es una clave primaria compuesta.
Ejemplo: el esquema de la tienda
Este es el esquema que usaremos en todo el curso. Memorízalo un poco: lo verás en cada lección.
txt
┌──────────────┐ ┌──────────────────┐ ┌──────────────┐
│ categorias │ │ productos │ │ clientes │
├──────────────┤ ├──────────────────┤ ├──────────────┤
│ PK id │◄──┐ │ PK id │ │ PK id │
│ nombre │ └────│ FK categoria_id │ │ nombre │
└──────────────┘ │ nombre │ │ email (U) │
│ precio │ │ ciudad │
│ stock │ │ fecha_reg.│
└────────▲─────────┘ └──────▲───────┘
│ │
┌────────┴─────────┐ ┌──────┴───────┐
│ detalle_pedido │ │ pedidos │
├──────────────────┤ ├──────────────┤
│ PK,FK pedido_id │───────►│ PK id │
│ PK,FK producto_id│ │ FK cliente_id│
│ cantidad │ │ fecha │
│ precio_unit. │ │ estado │
└──────────────────┘ └──────────────┘Cómo leerlo:
- Una categoría tiene muchos productos (relación 1 a N). Un producto puede no tener categoría.
- Un cliente hace muchos pedidos (1 a N).
- Un pedido contiene muchos productos y un producto aparece en muchos pedidos (N a M). Esa relación se resuelve con la tabla intermedia detalle_pedido.
detalle_pedido.precio_unitarioguarda el precio al momento de la compra (si mañana sube el precio del producto, los pedidos viejos no cambian).
Los datos de ejemplo se verán así (los insertaremos en la lección 5):
clientes
| id | nombre | ciudad | fecha_registro | |
|---|---|---|---|---|
| 1 | Ana López | ana@correo.com | Ciudad de México | 2024-01-15 |
| 2 | Carlos Ruiz | carlos@correo.com | Guadalajara | 2024-02-03 |
| 3 | María Pérez | maria@correo.com | Monterrey | 2024-02-20 |
| 4 | Jorge Díaz | jorge@correo.com | Ciudad de México | 2024-03-11 |
| 5 | Lucía Gómez | lucia@correo.com | Puebla | 2024-04-02 |
productos
| id | nombre | categoria_id | precio | stock |
|---|---|---|---|---|
| 1 | Audífonos Bluetooth | 1 | 899.00 | 25 |
| 2 | Teclado mecánico | 1 | 1250.00 | 10 |
| 3 | Monitor 24 pulgadas | 1 | 3499.00 | 5 |
| 4 | Libro Aprende SQL | 2 | 349.00 | 40 |
| 5 | Cien años de soledad | 2 | 289.00 | 30 |
| 6 | Lámpara de escritorio | 3 | 459.00 | 15 |
| 7 | Taza térmica | 3 | 199.00 | 50 |
| 8 | Cable USB-C | NULL | 99.00 | 100 |
pedidos
| id | cliente_id | fecha | estado |
|---|---|---|---|
| 1 | 1 | 2024-05-02 | entregado |
| 2 | 2 | 2024-05-10 | entregado |
| 3 | 1 | 2024-06-01 | enviado |
| 4 | 3 | 2024-06-15 | pendiente |
| 5 | 4 | 2024-06-20 | cancelado |
Detalles a notar (los usaremos más adelante): Lucía no tiene pedidos, la categoría Deportes (id 4) no tiene productos y el Cable USB-C no tiene categoría.
Paso a paso: cómo identificar tablas y claves
Cuando un cliente te describa su negocio, sigue estos pasos:
- Subraya los sustantivos importantes: "Los clientes hacen pedidos de productos que pertenecen a categorías". Cada uno es candidato a tabla.
- Lista sus características: un producto tiene nombre, precio, stock. Serán columnas.
- Elige la PK de cada tabla: casi siempre un
id. - Busca los verbos que conectan sustantivos: "un cliente hace pedidos". Pregunta: ¿cuántos de un lado por cada uno del otro?
- 1 a N → la FK va en el lado "muchos" (
pedidos.cliente_id). - N a M → crea una tabla intermedia (
detalle_pedido).
- 1 a N → la FK va en el lado "muchos" (
- Marca lo que debe ser único (email) y lo obligatorio (nombre).
Profundizarás en esto en Diseño: E-R y normalización.
Error común
Guardar listas en una sola celda, por ejemplo una columna productos con el texto "1,4,7". Eso imposibilita buscar, sumar o validar. Si algo puede tener varios valores, va en otra tabla con una fila por valor.
Error común
Repetir datos en varias tablas (el nombre y email del cliente dentro de cada pedido). Si el cliente cambia de correo tendrás que actualizarlo en cientos de filas y tarde o temprano quedarán inconsistentes. Guarda solo el cliente_id.
Ejercicios
- En la tabla
productos, ¿cuál es la PK y cuál es la FK? ¿A qué tabla apunta la FK? - ¿Por qué
emailno es una buena clave primaria paraclientes, aunque sea único? - Una biblioteca tiene libros, socios y préstamos (un socio pide un libro en una fecha y lo devuelve en otra). Diseña las tablas en texto: columnas, PK y FK.
- Según los datos de ejemplo, ¿qué cliente tiene más pedidos? ¿Qué pedidos tienen estado distinto de "entregado"?
Ver solución
- PK:
productos.id. FK:productos.categoria_id, que apunta acategorias.id. - Porque puede cambiar (la persona cambia de correo) y es un texto largo; actualizar una PK obliga a actualizar todas las FK que la referencian. Es mejor un
idcomo PK yemailcomoUNIQUE. - Una posible solución:
txt
libros (PK id, titulo, autor, isbn UNIQUE, anio)
socios (PK id, nombre, email UNIQUE, telefono)
prestamos (PK id, FK libro_id → libros.id, FK socio_id → socios.id,
fecha_prestamo, fecha_devolucion NULL)fecha_devolucion es opcional porque mientras el libro no se devuelve está vacía.
- Ana López (id 1) tiene 2 pedidos (1 y 3). Los pedidos no entregados son el 3 (enviado), el 4 (pendiente) y el 5 (cancelado).
Resumen
- Una tabla tiene columnas (atributos con tipo) y filas (registros).
- La clave primaria identifica cada fila: única, no nula y estable. Usa un
id. - La clave foránea apunta a la PK de otra tabla y crea relaciones confiables.
- Una clave compuesta usa varias columnas (como
pedido_id + producto_id). - Nuestro esquema:
categorias,productos,clientes,pedidosydetalle_pedido.