En los artículos anteriores aprendió acerca de los fundamentos básicos de las bases de datos, y además vio cómo establecer relaciones uno a uno y uno a muchos entre una colección de entidades. Continuando con las restricciones o las cardinalidades que puede haber entre distintas entidades, es momento de hablar acerca de las relaciones muchos a muchos. En algunas situaciones es posible indicar que un curso puede tener inscritos varios estudiantes y un estudiante puede estar inscrito en varios cursos. Entonces, la idea de este artículo es comprender a nivel teórico y a nivel de modelado en CAP cómo es posible establecer una relación muchos a muchos.
Cloud Application Programming Model – Relaciones muchos a muchos (N:N)
Este tipo de relación se establece cuando varios registros de una tabla se asocian a varios registros de otra tabla. Sin embargo, para poder abarcar este escenario es indispensable crear una tabla intermedia en donde cada entidad apunta a dicha tabla intermedia como si fuera una relación de uno a muchos. Por otra parte, dentro de la misma estarán presentes los ID de las dos entidades que estarán relacionadas de muchos a muchos. En la Figura 1.1 puede ver un Modelo Entidad Relación en donde puede apreciar una entidad Courses (Cursos) relacionada con otra entidad llamada Students (Estudiantes) y otra tabla intermedia llamada Inscriptions (Inscripciones). Dicha tabla contiene su identificador único (ID) así como el ID de la entidad Courses y Students.
Figura 1.1
En el Modelo Entidad Relación, se puede ver que un curso puede tener inscritos varios estudiantes y un estudiante puede estar inscrito en varios cursos. Como tanto los cursos y estudiantes pueden tener varios registros, es necesario hacer el registro en una tabla intermedia que tenga ambos registros. Para tener una mayor comprensión del mismo, vea la Figura 1.2.
Figura 1.2
Como puede ver en la Figura 1.2 la entidad Courses tiene 12 cursos disponibles, mientras que por otra parte hay una entidad llamada Students que tiene 28 estudiantes, los cuales cada uno se deben inscribir en los 12 cursos habilitados. Entonces, lo que se debe hacer en este caso es asociar los 12 ID de los cursos con el ID del estudiante para que de esta manera se de por entendido que el estudiante: “Juan Pérez“ está inscrito en los 12 cursos y así sucesivamente con el resto de los estudiantes, y no es necesario que esté inscrito en los 12 cursos, se puede hacer el registro con la cantidad de cursos deseados.
Ahora, ¿cómo podemos escribir estas entidades en CAP?
Ejemplo Demostrativo
Lo primero que debe realizar es definir las dos entidades sin ninguna relación entre ellas, quedando el código de la siguiente manera, recuerde que debe crear un archivo llamado schema.cds dentro de la carpeta db.
De momento, no existe ninguna relación entre las entidades Courses y Students por lo que es necesario incorporar una tercera entidad (“Inscriptions“) que tendrá el registro de ambos, y cada una apuntará a dicha tabla intermedia con una relación de uno a muchos. Para ello, vea el siguiente código de cómo debería quedar:
Una vez listas las entidades con sus relaciones específicas, es necesario que realice las proyecciones de las tres entidades. Para ello cree dentro de la carpeta srv un archivo llamado: service.cds y copie el siguiente código:
Como resultado final debería tener las siguientes vistas:
Vista previa:
View: Courses
View: Students
Entity: Inscriptions
Como puede ver en las imágenes previas, cada entidad tiene por sí misma sus datos, pero al navegar de la entidad Courses a la entidad Inscriptions es posible ver cuáles son los estudiantes que están inscritos en dicho curso, y viceversa de la entidad Students es posible navegar hacia la entidad Inscriptions para ver en cuántos cursos está inscrito el estudiante.
Courses to Inscriptions
Students to Inscriptions
Las relaciones muchos a muchos se definen cuando, por ejemplo, una entidad Autores puede estar relacionada con una entidad Libros. Analógicamente, es posible decir que un Libro puede tener varios Autores y cada Autor puede estar presente en varios Libros. En el ejemplo mostrado se logró establecer una relación con las entidades: Courses y Students, la tabla intermedia entre ambas entidades fue: “Inscriptions“. Sin embargo, para este tipo de relación fue necesario colocar los ID de la entidad Courses y Students dentro de Inscriptions para saber que en qué curso está inscrito un estudiante y cuántos estudiantes tienen inscrito un curso. Ahora, esto realmente no es suficiente si no se hace una navegación con el Association to many Inscriptions tanto en Courses como en Students, ya que es necesario desglosar por curso y por estudiante qué registros tienen. Por último, para poder hacer lo que es la navegación, siempre es necesario hacer uso del parámetro self para considerar todas las claves primarias de una entidad.