LA CARDINALIDAD EN BASES DE DATOS: GUÍA PRÁCTICA CON MYSQL
La cardinalidad en bases de datos es uno de los conceptos más importantes al momento de diseñar una base de datos relacional. Se trata de definir cuántos registros de una tabla pueden relacionarse con registros de otra tabla. Entender y aplicar correctamente la cardinalidad permite crear modelos de datos eficientes, evitar redundancia y mantener la integridad referencial.La cardinalidad en MySQL, es fundamental para definir claves foráneas, "FOREIGN KEY", índices y relaciones entre tablas.
¿Para qué sirve la cardinalidad?
- Diseñar correctamente la estructura de la base de datos.
- Definir con precisión las relaciones entre tablas.
- Evitar errores de modelado y datos huérfanos.
- Mantener la integridad y consistencia de la información.
Tipos de Cardinalidad
Existen tres tipos principales de cardinalidad en bases de datos:Uno a Uno 1:1
Un registro de la "Tabla A" se relaciona con un solo registro de la "Tabla B", y viceversa.Ejemplo
Una persona tiene un solo pasaporte y un pasaporte pertenece a una sola persona.CREATE TABLE personas (
id INT PRIMARY KEY AUTO_INCREMENT,
nombre VARCHAR(100)
);
CREATE TABLE pasaportes (
id INT PRIMARY KEY AUTO_INCREMENT,
numero VARCHAR(50) UNIQUE,
persona_id INT UNIQUE, -- Cardinalidad 1:1
FOREIGN KEY (persona_id) REFERENCES personas(id)
);
Uno a Muchos 1:N
Es el más común de todos. Un registro de la "Tabla A" puede relacionarse con muchos registros de la "Tabla B", pero cada registro de la "Tabla B" solo puede pertenecer a un registro de la "Tabla A".Ejemplo
Un cliente puede realizar muchos pedidos pero cada pedido pertenece a un solo cliente.
CREATE TABLE clientes (
id INT PRIMARY KEY AUTO_INCREMENT,
nombre VARCHAR(100)
);
CREATE TABLE pedidos (
id INT PRIMARY KEY AUTO_INCREMENT,
cliente_id INT, -- Cardinalidad 1:N
total DECIMAL(10,2),
fecha DATETIME,
FOREIGN KEY (cliente_id) REFERENCES clientes(id)
);
Muchos a Muchos N:N h3>
Muchos registros de la "Tabla A" pueden relacionarse con muchos registros de la "Tabla B".
Ejemplo
Un producto puede pertenecer a varias categorías y una categoría puede contener muchos productos.
En MySQL se implementa siempre con una tabla intermedia, tabla de unión o tabla pibote:
CREATE TABLE productos (
id INT PRIMARY KEY AUTO_INCREMENT,
nombre VARCHAR(150)
);
CREATE TABLE categorias (
id INT PRIMARY KEY AUTO_INCREMENT,
nombre VARCHAR(100)
);
-- Tabla intermedia (cardinalidad N:N)
CREATE TABLE producto_categoria (
producto_id INT,
categoria_id INT,
PRIMARY KEY (producto_id, categoria_id),
FOREIGN KEY (producto_id) REFERENCES productos(id),
FOREIGN KEY (categoria_id) REFERENCES categorias(id)
);
Ejemplo Práctico
Una tienda en línea:
- Clientes → Pedidos: Relación 1:N
- Productos → Categorías: Relación N:N
- Pedidos → Productos: Relación N:N, a través de una tabla "pedido_productos"
-- Ejemplo de consulta con cardinalidad 1:N
SELECT c.nombre, COUNT(p.id) AS total_pedidos
FROM clientes c
LEFT JOIN pedidos p ON c.id = p.cliente_id
GROUP BY c.id;
Diferencia entre Relación y Cardinalidad
- La relación es el enlace entre dos tablas, mediante claves foráneas.
- La cardinalidad indica cuántos registros pueden participar en esa relación:
- 1:1
- 1:N
- N:N
Mejores Prácticas
- Definir siempre "FOREIGN KEY" con las restricciones adecuadas
- "ON DELETE CASCADE"
- "ON DELETE RESTRICT"
- etc.
- Definir índices en las columnas de cardinalidad alta como cliente_id, producto_id, etc.).
- Evitar relaciones N:N directas; crear siempre una tabla intermedia.
- Documentar la cardinalidad en el modelo entidad-relación.
- Utilizar herramientas como MySQL Workbench para visualizar las relaciones.
CREATE TABLE productos (
id INT PRIMARY KEY AUTO_INCREMENT,
nombre VARCHAR(150)
);
CREATE TABLE categorias (
id INT PRIMARY KEY AUTO_INCREMENT,
nombre VARCHAR(100)
);
-- Tabla intermedia (cardinalidad N:N)
CREATE TABLE producto_categoria (
producto_id INT,
categoria_id INT,
PRIMARY KEY (producto_id, categoria_id),
FOREIGN KEY (producto_id) REFERENCES productos(id),
FOREIGN KEY (categoria_id) REFERENCES categorias(id)
);
-- Ejemplo de consulta con cardinalidad 1:N
SELECT c.nombre, COUNT(p.id) AS total_pedidos
FROM clientes c
LEFT JOIN pedidos p ON c.id = p.cliente_id
GROUP BY c.id;
- 1:1
- 1:N
- N:N
- "ON DELETE CASCADE"
- "ON DELETE RESTRICT"
- etc.