Tiempo de lectura estimado: 4 minutos
Table of Contents
Relación N:M (muchos a muchos) en SQL: explicación y ejemplo práctico
En el diseño de bases de datos relacionales, una relación N:M (muchos a muchos) ocurre cuando múltiples registros de una tabla pueden estar asociados con múltiples registros de otra tabla.
A diferencia de las relaciones uno a uno (1:1) o uno a muchos (1:N), las relaciones N:M requieren siempre una tabla intermedia que actúe como puente entre las dos entidades principales.
¿Qué es una relación N:M en SQL?
Una relación de muchos a muchos en SQL significa que:
- Un registro de la tabla A puede estar vinculado con varios registros de la tabla B.
- A su vez, un registro de la tabla B puede estar relacionado con múltiples registros de la tabla A.
👉 Ejemplo real:
- Una persona puede trabajar en varios puestos de trabajo.
- Un puesto de trabajo puede ser ocupado por varias personas.
Para modelar esta relación, se necesita una tercera tabla intermedia, que almacene las claves foráneas de ambas tablas principales y los atributos propios de la relación (fechas, estado, etc.).
Ejemplo de relación N:M en SQL
A continuación, un ejemplo paso a paso de cómo crear esta relación en MySQL:
-- Crear la base de datos CREATE DATABASE IF NOT EXISTS Empresa; USE Empresa; -- Eliminar tablas si ya existen DROP TABLE IF EXISTS Persona_Puesto; DROP TABLE IF EXISTS Puesto_Trabajo; DROP TABLE IF EXISTS Persona; -- Tabla Persona CREATE TABLE IF NOT EXISTS Persona ( ID INT PRIMARY KEY AUTO_INCREMENT, Nombre VARCHAR(100) NOT NULL, Apellido VARCHAR(100) NOT NULL ); -- Tabla Puesto_Trabajo CREATE TABLE IF NOT EXISTS Puesto_Trabajo ( ID INT PRIMARY KEY AUTO_INCREMENT, Nombre_Puesto VARCHAR(100) NOT NULL ); -- Tabla intermedia para la relación N:M CREATE TABLE IF NOT EXISTS Persona_Puesto ( ID_Persona INT, ID_Puesto INT, Fecha_Inicio DATE NOT NULL, -- Fecha de inicio en el puesto Fecha_Fin DATE NULL, -- Puede ser NULL si aún ocupa el puesto PRIMARY KEY (ID_Persona, ID_Puesto), -- Clave primaria compuesta FOREIGN KEY (ID_Persona) REFERENCES Persona(ID) ON DELETE CASCADE, FOREIGN KEY (ID_Puesto) REFERENCES Puesto_Trabajo(ID) ON DELETE CASCADE ); -- Insertar datos de prueba en Persona INSERT INTO Persona (Nombre, Apellido) VALUES ('Juan', 'Pérez'); INSERT INTO Persona (Nombre, Apellido) VALUES ('María', 'García'); -- Insertar datos de prueba en Puesto_Trabajo INSERT INTO Puesto_Trabajo (Nombre_Puesto) VALUES ('Desarrollador'); INSERT INTO Puesto_Trabajo (Nombre_Puesto) VALUES ('Administrador'); -- Insertar relaciones en la tabla intermedia INSERT INTO Persona_Puesto (ID_Persona, ID_Puesto, Fecha_Inicio) VALUES (1, 1, '2024-03-01'), -- Juan -> Desarrollador (1, 2, '2024-03-05'), -- Juan -> Administrador (2, 1, '2024-03-10'); -- María -> Desarrollador




Ventajas de modelar una relación N:M con tabla intermedia
✅ Se evita la duplicación de datos.
✅ Permite añadir atributos propios a la relación (ejemplo: fecha de inicio, estado, comentarios).
✅ Garantiza integridad referencial mediante claves foráneas.
✅ Facilita consultas SQL más claras y flexibles con JOIN
.
Consultas SQL con relación N:M
Una vez creadas las tablas, podemos hacer consultas combinadas:
👉 Obtener todos los puestos de trabajo de Juan Pérez:
SELECT P.Nombre, P.Apellido, PT.Nombre_Puesto, PP.Fecha_Inicio
FROM Persona P
JOIN Persona_Puesto PP ON P.ID = PP.ID_Persona
JOIN Puesto_Trabajo PT ON PT.ID = PP.ID_Puesto
WHERE P.Nombre = 'Juan' AND P.Apellido = 'Pérez';
👉 Ver qué personas ocupan el puesto de Desarrollador:
SELECT PT.Nombre_Puesto, P.Nombre, P.Apellido, PP.Fecha_Inicio
FROM Puesto_Trabajo PT
JOIN Persona_Puesto PP ON PT.ID = PP.ID_Puesto
JOIN Persona P ON P.ID = PP.ID_Persona
WHERE PT.Nombre_Puesto = 'Desarrollador';
📹 Demostración en vídeo
En mi canal encontrarás el tutorial en vídeo donde muestro paso a paso cómo implementar y consultar una relación N:M en SQL.
Si te ha gustado el contenido, no olvides compartirlo y suscribirte para más artículos y guías sobre bases de datos relacionales. 🚀
Preguntas frecuentes (FAQ) sobre la relación N:M en SQL
1. ¿Se puede representar una relación N:M sin tabla intermedia?
No. Siempre se necesita una tabla intermedia con claves foráneas que actúe como puente.
2. ¿Qué diferencia hay entre una relación 1:N y N:M?
- En una relación 1:N, un registro de una tabla está relacionado con muchos de otra, pero no al revés.
- En una relación N:M, ambos lados pueden tener múltiples asociaciones.
3. ¿Se pueden agregar atributos en la tabla intermedia?
Sí, y es lo más recomendable. Por ejemplo, en nuestro caso agregamos Fecha_Inicio y Fecha_Fin para registrar el historial laboral.
4. ¿Qué ocurre si elimino un registro en una tabla principal?
Gracias a la opción ON DELETE CASCADE, si borras un registro en Persona
o Puesto_Trabajo
, sus relaciones en la tabla intermedia Persona_Puesto
también se eliminan automáticamente.
5. ¿Dónde se aplica una relación N:M en la vida real?
Ejemplos comunes:
- Estudiantes y asignaturas.
- Clientes y productos (en un carrito de compras).
- Actores y películas.
- Profesores y cursos.
Seguir leyendo: