En esta sección: |
La relación de varios a varios se usa de forma menos habitual. Cada instancia de un segmento puede estar relacionada a una o varias instancias de un segundo segmento, mientras que cada instancia del segundo puede estar relacionada, a su vez, a una o varias del primero. Es posible implementar esta relación directamente entre dos tablas relacionales, e indirectamente, entre dos segmentos de otros tipos de orígenes de datos.
Puede haber una relación directa, de varios a varios, entre dos tablas relacionales. La tabla STUDENT contiene una fila por cada alumno matriculado en una universidad, mientras que TABLE incluye una por cada asignatura. Cada estudiante puede tener varias asignaturas y puede haber muchos estudiantes que tengan una misma asignatura.
La relación de varios a varios aparece reflejada en el siguiente diagrama.
Cuando la relación M:M se observa desde la perspectiva de dos tablas, parece que se trata de una relación 1:M. Un estudiante tiene muchas asignaturas (1:M desde la perspectiva de STUDENT), o una asignatura con muchos estudiantes (1:M desde el punto de vista de CLASSES). Este tipo de relación aparece explicado en el siguiente diagrama.
Al generar informes a partir de las tablas, o al actualizarlas, la relación M:M siempre será observada desde el punto de vista de una de las tablas (es decir, que observa una relación 1:M). Para seleccionar la perspectiva de tabla que desea utilizar, conviértala en el segmento principal (host) en el archivo máster o el comando JOIN. Describa el join en el archivo máster o comando JOIN como si se tratara de una relación estándar, de uno a varios.
Puede utilizar el comando JOIN para describir la relación desde la perspectiva de la tabla STUDENT:
JOIN STUDENT_ID IN STUDENT TO ALL STUDENT_ID IN CLASSES
Para describir la relación desde la perspectiva de la tabla CLASS:
JOIN COURSE_CODE IN CLASSES TO ALL COURSE_CODE IN STUDENT
Algunos orígenes de datos no relacionales no pueden representar una relación de varios a varios directamente. Sin embargo, sí pueden hacerlo de manera indirecta y se puede describir como tal.
Considere los segmentos EMPINFO, en el origen de datos EMPLOYEE, y CLASSES, en el origen hipotético SCHOOL. Cada instancia de EMPINFO describe a un empleado, mientras que cada instancia de CLASSES describe un curso. Cada empleado puede empleado puede asistir a muchos cursos, y muchos empleados pueden asistir a un curso, así que la relación es de varios a varios. Este tipo de relación aparece explicado en el siguiente diagrama.
Sin embargo, puesto que algunos tipos de orígenes de datos no pueden representar esta relación de modo directo, es necesario introducir un segmento intermedio, llamado ENROLLED. Este segmento nuevo contiene las claves de ambos segmentos originales, EMP_ID y CLASS_CODE, que representan la relación entre éstos. Rompe la relación M:M en dos relaciones 1:M. Cada instancia de EMPINFO puede estar relacionada a varias instancias de ENROLLED (cada empleado puede matricularse en varios cursos), mientras que cada instancia de CLASSES puede estar relacionada a varias de ENROLLED (puede haber muchos empleados en un mismo curso).
Estas relaciones aparecen ilustradas en el siguiente diagrama.
El próximo paso es convertir el segmento intermedio en uno de los secundarios de los dos segmentos originales. Puede diseñar el origen de datos SCHOOL para que CLASSES sea la raíz y ENROLLED, el secundario de CLASSES. Tenga en cuenta que, cuando ENROLLED se trataba de un segmento suelto, contenía, explícitamente, las claves (EMP_ID and CLASS_CODE) de los dos segmentos originales. Aunque como parte del origen de datos SCHOOL, CLASS_CODE aparece de forma implícita, debido a su relación de principal-secundario con CLASSES, y por tanto puede eliminarse. A continuación, puede unir EMPINFO y ENROLLED.
Este tipo de join aparece explicado en el siguiente diagrama.
Cuando la relación M:M, original, se observa desde esta perspectiva, parece que se trata de una relación 1:M:1. Es decir, que hay un empleado (EMPINFO) matriculado varias veces (ENROLLED), y cada matrícula corresponde a un curso (CLASSES).
Al generar informes a partir de la nueva estructura, o al actualizarla, la relación siempre será observada desde la perspectiva de uno de los segmentos originales (en este caso, EMPINFO o CLASSES). Para definir la perspectiva de segmento utilizada, convierta al segmento en el elemento principal del join. Describa el join utilizando el comando JOIN o, en el caso de un origen de datos de FOCUS, en el archivo máster. Si convierte el segmento intermedio, en este caso, ENROLLED, en el segmento secundario (referencia cruzada) del join, la relación queda implementada como una estándar, de uno a varios. Si lo convierte en el segmento principal (host), la relación se implementa como un join estándar, de uno a uno.
Por ejemplo, puede usar el comando JOIN para describir la relación desde la perspectiva del segmento CLASSES, convirtiendo a ENROLLED en el host del join:
JOIN EMP_ID IN ENROLLED TO EMP_ID IN EMPINFO
La nueva estructura aparece ilustrada en este diagrama.
Los orígenes de datos de FOCUS, de ejemplo, EMPLOYEE y EDUCFILE, presentan otra ilustración de un join definido en el archivo máster. Aquí, ATTNDSEG es el segmento intermedio entre EMPINFO y COURSEG.
WebFOCUS |