DevPath · Aprende a programar ESPTEN

Diseño, normalización y modificación de datos

Diseño relacional: claves y relaciones

De entidades a tablas

Diseñar una base de datos relacional consiste en identificar las entidades del dominio (clientes, pedidos, productos...) y convertir cada una en una tabla, decidiendo sus columnas, sus tipos de datos y cómo se relacionan.

Clave primaria (PK)

La clave primaria (primary key) identifica de forma única cada fila de una tabla. No puede repetirse ni ser nula.

CREATE TABLE clientes (
  id INTEGER PRIMARY KEY,   -- identifica a cada cliente sin ambigüedad
  nombre TEXT NOT NULL,
  email TEXT UNIQUE
);

Una buena PK es estable y sin significado de negocio (un id numérico suele ser mejor que el email o el DNI, que pueden cambiar).

Clave foránea (FK)

Una clave foránea (foreign key) es una columna que apunta a la clave primaria de otra tabla. Sirve para conectar tablas y para que la base de datos garantice la integridad referencial: no podrás crear un pedido de un cliente que no existe.

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

Tipos de datos

Cada columna tiene un tipo que define qué valores admite. En SQLite los tipos más usados son:

Tipo Para qué
INTEGER números enteros (ids, cantidades)
REAL números con decimales (precios, totales)
TEXT cadenas de texto (nombres, emails)
BLOB datos binarios

Elegir bien el tipo evita errores y mejora el rendimiento y la validación.

Tipos de relación

1:1 (uno a uno)

Cada fila de A se corresponde con como mucho una fila de B y viceversa. Por ejemplo, usuario y perfil_extendido. Se modela poniendo una FK con restricción UNIQUE en una de las tablas.

1:N (uno a muchos)

La relación más habitual: una fila de A se relaciona con muchas de B, pero cada fila de B con una sola de A. Un cliente tiene muchos pedidos; cada pedido pertenece a un cliente. Se modela con una FK en el lado "muchos" (pedidos.cliente_id).

N:M (muchos a muchos)

Muchas filas de A se relacionan con muchas de B. Por ejemplo, pedidos y productos: un pedido contiene varios productos y un producto aparece en varios pedidos. No se puede representar con una sola FK: se necesita una tabla intermedia (también llamada tabla puente o de unión) que tiene una FK a cada lado.

CREATE TABLE linea_pedido (
  pedido_id INTEGER,
  producto_id INTEGER,
  cantidad INTEGER NOT NULL,
  PRIMARY KEY (pedido_id, producto_id),       -- clave compuesta
  FOREIGN KEY (pedido_id) REFERENCES pedidos(id),
  FOREIGN KEY (producto_id) REFERENCES productos(id)
);

Regla práctica: toda relación N:M se resuelve con una tabla intermedia que contiene las dos FK (y a menudo datos propios de la relación, como la cantidad).

Pon esto en práctica

DevPath es un curso práctico: aquí lees la teoría; en la app la pones en práctica con ejercicios que se ejecutan de verdad, sin conexión.

Empezar gratis en la app →
Normalización: 1NF, 2NF y 3NF →