Consultas SQL a Relaciones Reflexivas.docx

Traducción de relaciones conceptuales reflexivas a modelo relacional Relaciones reflexivas En el modelo Entidad-Relación

Views 132 Downloads 2 File size 263KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

Traducción de relaciones conceptuales reflexivas a modelo relacional Relaciones reflexivas En el modelo Entidad-Relación, es posible especificar conjuntos de relaciones que conectan entidades pertenecientes a la misma colección de entidades. A esas relaciones se les suele denominar “relaciones reflexivas”. Por ejemplo, podemos representar con relaciones reflexivas la relación jerárquica de jefes y subordinados mediante dos relaciones definidas sobre la colección de entidades EMPLEADOS, como se muestra en la siguiente figura.

Figura 1 La relación amigos es de tipo “muchos a muchos”, de modo que las entidades pueden imaginarse como un “grafo” de relaciones. En este caso consideramos que la relación de amistad es completamente simétrica (aunque esto en la realidad no siempre es así). Por otro lado, la relación jefe de es de tipo “uno a muchos”, y por tanto tiene estructura de árbol (o bien de un conjunto de árboles, un bosque).

Traducción Para realizar la traducción hay que proceder como si de una relación entre dos entidades se tratara. De esta manera, en nuestro ejemplo se tienen dos relaciones, de cardinalidades 1:n y n:m, por lo que el modelo relacional quedaría: EMPLEADOS (NSS, sueldo, nombre, apellido, NSSSupervisor) AMIGOS (NSSAmigo_A, NSSAmigo_B)

Recuperación de las relaciones

Para recuperar las relaciones reflexivas una vez traducidas a tablas relacionales, es necesario hacer auto-joins (self-joins). Para entender la mecánica, vamos a ver un ejemplo concreto. Tabla EMPLEADOS NSS Nombre Apellidos Sueldo NSSSupervisor 111111 Miguel Sánchez 65.000 null 222222 Pablo Sánchez 55.000 111111 333333 Carmen García 45.000 111111 444444 Luis López 35.000 333333 555555 Pedro Pérez 35.000 222222 666666 Maria Martínez 35.000 444444 777777 Laura López 30.000 444444 888888 José Pérez 30.000 555555 999999 Juan Gómez 25.000 666666 Tabla 1 Tabla AMIGOS NSSAmigo_A NSSAmigo_B 111111 222222 111111 333333 111111 777777 111111 555555 222222 333333 222222 999999 222222 444444 222222 777777 333333 777777 999999 222222 999999 555555 444444 555555 555555 999999 Tabla 2 Recuperación de la relación “uno a muchos” Si queremos obtener una lista de los empleados y la información asociada de sus jefes, tendremos que hacer un auto-join en el que la condición de combinación compara la clave ajena que indica el supervisor con la información original.

El resultado producido es el siguiente:

'222222', 'Pablo', 'Sanchez', 55.0, 'Miguel', 'Sanchez' '333333', 'Carmen', 'Garcia', 45.0, 'Miguel', 'Sanchez' '444444', 'Luis', 'Lopez', 35.0, 'Carmen', 'Garcia' '555555', 'Pedro', 'Perez', 35.0, 'Pablo', 'Sanchez' '666666', 'Maria', 'Martinez', 35.0, 'Luis', 'Lopez' '777777', 'Laura', 'Lopez', 30.0, 'Luis', 'Lopez' '888888', 'Jose', 'Perez', 30.0, 'Pedro', 'Perez' '999999', 'Juan', 'Gomez', 25.0, 'Maria', 'Martinez'

La sentencia anterior corresponde a un INNER JOIN. Lo que no se ha recuperado son los empleados sin Si queremos que las tuplas de la tabla de la “izquierda” siempre aparezcan en el resultado, hay que hacer un LEFT JOIN, de modo que nos aseguramos que obtenemos información de todos los emplados. SELECT E1.NSS, E1.nombre, E1.apellidos, E1.sueldo, E2.nombre as jefe_nom, E2.apellidos as jefe_app FROM empleados AS E1 LEFT JOIN empleados AS E2 ON E1.NSSSup = E2.NSS

Esa sintaxis es equivalente a LEFT OUTER JOIN. Como resultado, se generará además una tupla adicional: '111111', 'Miguel', 'Sanchez', 65.0, null, null

Recuperación de la relación “muchos a muchos” Nótese que en la tabla AMIGOS, no hay información repetida, es decir, si tenemos la tupla (X, Y) no tenemos la(Y,X). Para obtener los amigos tenemos que hacer un doble join. SELECT E1.nombre, E1.apellidos, E2.nombre, E2.apellidos FROM amigos AS A, EMPLEADOS AS E1, EMPLEADOS AS E2 WHERE A.NSSAmigo_A = E1.NSS and A.NSSAmigo_B = E2.NSS

El resultado de la consulta es el siguiente:

'Miguel', 'Sanchez', 'Pablo', 'Sanchez' 'Miguel', 'Sanchez', 'Carmen', 'Garcia' 'Miguel', 'Sanchez', 'Pedro', 'Perez' 'Miguel', 'Sanchez', 'Laura', 'Lopez' 'Pablo', 'Sanchez', 'Carmen', 'Garcia' 'Pablo', 'Sanchez', 'Luis', 'Lopez' 'Pablo', 'Sanchez', 'Laura', 'Lopez' 'Pablo', 'Sanchez', 'Juan', 'Gomez' 'Carmen', 'Garcia', 'Laura', 'Lopez' 'Luis', 'Lopez', 'Pedro', 'Perez' 'Pedro', 'Perez', 'Juan', 'Gomez'