Skip to content

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érminoTambién llamadoQué es
TablaRelación, entidadConjunto de datos de un mismo tipo (clientes, productos)
ColumnaCampo, atributoUna característica con un tipo de dato fijo (nombre, precio)
FilaRegistro, tuplaUn elemento concreto (el cliente Ana López)
CeldaValorLa intersección de una fila y una columna
EsquemaSchemaLa 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:

  1. Única: no se repite.
  2. No nula: siempre tiene valor.
  3. 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 (id 1, 2, 3...).
Natural (ej. email)Sustituta (ej. id)
SignificadoSíNo
Puede cambiarSí (la gente cambia de correo)Nunca
TamañoTexto largoEntero 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                                                        FK

La 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_idproducto_idcantidad
111
142
221

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_unitario guarda 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

idnombreemailciudadfecha_registro
1Ana Lópezana@correo.comCiudad de México2024-01-15
2Carlos Ruizcarlos@correo.comGuadalajara2024-02-03
3María Pérezmaria@correo.comMonterrey2024-02-20
4Jorge Díazjorge@correo.comCiudad de México2024-03-11
5Lucía Gómezlucia@correo.comPuebla2024-04-02

productos

idnombrecategoria_idpreciostock
1Audífonos Bluetooth1899.0025
2Teclado mecánico11250.0010
3Monitor 24 pulgadas13499.005
4Libro Aprende SQL2349.0040
5Cien años de soledad2289.0030
6Lámpara de escritorio3459.0015
7Taza térmica3199.0050
8Cable USB-CNULL99.00100

pedidos

idcliente_idfechaestado
112024-05-02entregado
222024-05-10entregado
312024-06-01enviado
432024-06-15pendiente
542024-06-20cancelado

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:

  1. Subraya los sustantivos importantes: "Los clientes hacen pedidos de productos que pertenecen a categorías". Cada uno es candidato a tabla.
  2. Lista sus características: un producto tiene nombre, precio, stock. Serán columnas.
  3. Elige la PK de cada tabla: casi siempre un id.
  4. 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).
  5. 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 ​

  1. En la tabla productos, ¿cuál es la PK y cuál es la FK? ¿A qué tabla apunta la FK?
  2. ¿Por qué email no es una buena clave primaria para clientes, aunque sea único?
  3. 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.
  4. Según los datos de ejemplo, ¿qué cliente tiene más pedidos? ¿Qué pedidos tienen estado distinto de "entregado"?
Ver solución
  1. PK: productos.id. FK: productos.categoria_id, que apunta a categorias.id.
  2. 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 id como PK y email como UNIQUE.
  3. 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.

  1. 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, pedidos y detalle_pedido.

Academia Web — aprende, copia y construye.