¡Haz clic para puntuar esta entrada!
(Votos: 1 Promedio: 5)
Relación N:M (muchos a muchos) en SQL: explicación y ejemplo práctico

Tiempo de lectura estimado: 4 minutos

Portada » Relación N:M (muchos a muchos) en SQL: explicación y ejemplo práctico
Anuncios
Publicidad

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

Relación N:M (muchos a muchos) en SQL

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:

¡Haz clic para puntuar esta entrada!
(Votos: 1 Promedio: 5)

Deja una respuesta

¡Haz clic para puntuar esta entrada!
(Votos: 1 Promedio: 5)
error: Content is protected !!
Hablemos de informática
Resumen de privacidad

Esta web utiliza cookies para que podamos ofrecerte la mejor experiencia de usuario posible. La información de las cookies se almacena en tu navegador y realiza funciones tales como reconocerte cuando vuelves a nuestra web o ayudar a nuestro equipo a comprender qué secciones de la web encuentras más interesantes y útiles.