You are on page 1of 4

Traduccin de relaciones conceptuales reflexivas a modelo relacional

Relaciones reflexivas
En el modelo Entidad-Relacin, es posible especificar conjuntos de relaciones que conectan entidades pertenecientes a la misma coleccin de entidades. A esas relaciones se les suele denominar relaciones reflexivas. Por ejemplo, podemos representar con relaciones reflexivas la relacin jerrquica de jefes y subordinados mediante dos relaciones definidas sobre la coleccin de entidades EMPLEADOS, como se muestra en la siguiente figura.

Figura 1 La relacin 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 relacin de amistad es completamente simtrica (aunque esto en la realidad no siempre es as). Por otro lado, la relacin jefe de es de tipo uno a muchos, y por tanto tiene estructura de rbol (o bien de un conjunto de rboles, un bosque).

Traduccin
Para realizar la traduccin hay que proceder como si de una relacin 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 quedara:
EMPLEADOS (NSS, sueldo, nombre, apellido, NSSSupervisor) AMIGOS (NSSAmigo_A, NSSAmigo_B)

Recuperacin de las relaciones

Para recuperar las relaciones reflexivas una vez traducidas a tablas relacionales, es necesario hacer auto-joins (self-joins). Para entender la mecnica, vamos a ver un ejemplo concreto. Tabla EMPLEADOS NSS Nombre Apellidos Sueldo NSSSupervisor 111111 Miguel Snchez 65.000 null 222222 Pablo Snchez 55.000 111111 333333 Carmen Garca 45.000 111111 444444 Luis Lpez 35.000 333333 555555 Pedro Prez 35.000 222222 666666 Maria Martnez 35.000 444444 777777 Laura Lpez 30.000 444444 888888 Jos Prez 30.000 555555 999999 Juan Gmez 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 Recuperacin de la relacin uno a muchos Si queremos obtener una lista de los empleados y la informacin asociada de sus jefes, tendremos que hacer un auto-join en el que la condicin de combinacin compara la clave ajena que indica el supervisor con la informacin 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 informacin 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 adems una tupla adicional:
'111111', 'Miguel', 'Sanchez', 65.0, null, null

Recuperacin de la relacin muchos a muchos Ntese que en la tabla AMIGOS, no hay informacin 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'

You might also like