5
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

Consultas SQL a Relaciones Reflexivas.docx

Embed Size (px)

Citation preview

Page 1: Consultas SQL a Relaciones Reflexivas.docx

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

Page 2: Consultas SQL a Relaciones Reflexivas.docx

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 NombreApellidosSueldoNSSSupervisor

111111Miguel Sánchez 65.000null222222Pablo Sánchez 55.000111111333333Carmen García 45.000111111444444Luis López 35.000333333555555Pedro Pérez 35.000222222666666Maria Martínez 35.000444444777777Laura López 30.000444444888888José Pérez 30.000555555999999Juan Gómez 25.000666666

Tabla 1

Tabla AMIGOS

NSSAmigo_ANSSAmigo_B

111111 222222111111 333333111111 777777111111 555555222222 333333222222 999999222222 444444222222 777777333333 777777999999 222222999999 555555444444 555555555555 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.

Page 3: Consultas SQL a Relaciones Reflexivas.docx

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

Page 4: Consultas SQL a Relaciones Reflexivas.docx

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'