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).