¿Cómo modelas una relación muchos a muchos, por ejemplo alumnos y cursos?
Opciones
- Guardando una lista de ids de cursos en una columna de la tabla de alumnos
- Creando una tabla de unión con dos foreign keys, como
enrollments(Opción correcta) - Duplicando la tabla de alumnos por cada curso
- No se puede modelar en una base de datos relacional
Respuesta
Creando una tabla de unión enrollments(student_id, course_id) con dos foreign keys
Por qué
Un alumno cursa muchos cursos y un curso tiene muchos alumnos. Una columna relacional no puede guardar una lista, así que creas una tercera tabla en medio.
enrollments(student_id, course_id, enrolled_at): cada fila enlaza un alumno con un curso. La pareja (student_id, course_id) suele ser su primary key, lo que evita duplicados.
La tabla de unión también puede guardar datos de la relación (fecha, nota).
CREATE TABLE enrollments (
student_id INT REFERENCES students(id),
course_id INT REFERENCES courses(id),
enrolled_at DATE,
PRIMARY KEY (student_id, course_id)
);Recuerda
Muchos a muchos = tabla de unión con dos foreign keys.