Cita: como hago el modelado de saber que libro tienen cada alumno?
A estas alturas de las explicaciones tu duda resulta un poco extraña... porque es el mismo caso de Profesor - Comision - Profesor_comision, sólo que con algunas extensiones adicionales.
A nivel de consulta, si cada registro contiene un único ID de alumno y un único ID de un libro, es un INNER JOIN múltiple, ¿no te parece?
Respeta este esquema, que aplica a cualquier cantidad de tablas:
Código SQL:
Ver originalSELECT ... (campos a mostrar)
FROM tabla1
INNER JOIN tabla2 ON tabla1.id=tabla2.id
INNER JOIN tabla3 ON tabla2.id2=tabla3.id2
...
WHERE where_conditions;
Ahora bien, hay todavía algunos detalles a afinar para que tu modelo se acerque a algo útil.
Veamos: tienes dos entidades denominadas Alumnos y Libros, que se relacionan por una regla de negocio que expresa: "Un alumno puede tomar en préstamo N libros por un tiempo", y su inversa "N libros pueden ser prestados a N alumnos durante X tiempo".
Hay una tercera regla que expresa "Un mismo libro sólo puede prestarse a un único alumno en el mismo período". Esta última es una regla funcional, no de estructura de datos.
De estas simples reglas surgen dos tablas y una relación:
- Alumno (entidad)
- Libro (entidad)
- Alumno - Libro (relacion N:N).
Ahora bien, como una relación N:N genera obligatoriamente una tabla relacional, surge de ella una tercera tabla: Prestamo.
Esta tercera tabla sabemos que tiene un identificador doble para cada registro: un ID de alumno y un ID de libro. Pero el modelado correcto nos indica que un mismo libro puede ser prestado al mismo alumno N veces en distintos tiempos, entonces necesitamos algo que nos discrimine de qué prestamos estamos hablando, y hasta cuando, lo que puede hacerse con un campo DATETIME para el inicio del préstamo y que forme parte de la PK, y otro para el fin (devolución) del préstamo, que sea nulable.
En este contexto, ¿como identificas qué libros tiene hoy en préstamo un alumno?.
Simple: Realizas un INNER JOIN entre las tres tablas, con la condicion que el campo de devolución sea NULL, ya que aun no se ha devuelto.
¿Se va entendiendo?
Ahora bien, a diferencia del caso anterior, la tabla relacionar queda algo diferente:
Código SQL:
Ver originalCREATE TABLE Prestamo(
id_alumno INT NOT NULL,
id_libro INT NOT NULL,
fechaDesde DATETIME NOT NULL,
fechaHasta DATETIME NULL,
PRIMARY KEY (id_alumno,id_libro, fechaDesde),
FOREIGN KEY (id_alumno) REFERENCES alumno(id_alumno),
FOREIGN KEY (id_comision) REFERENCES libro(id_libro),
);
Ahora bien, como en este caso tenemos un discriminante de fecha y hora, y podría ser que se produzcan inserciones de registros inconsistentes, se debe realizar validaciones previas antes de cualquier INSERT a la tabla, para asegurar que no se esté insertando el mismo libro y alumno con diferente hora, sin que previamente haya sido devuelto el ejemplar previamente.
Eso es un detalle de desarrollo que hay que tener en cuenta.
Espero que se entienda la idea.