Está en la página 1de 9

1 Campeonato de futbol

Sean los siguientes esquemas sobre un campeonato de futbol:

Equipo(codEquipo, nombre, RUT DT)


DT(RUT DT, nombre, apellido)
Jugador(RUT, nombre, apellido, codEquipo, suspendido)
Partido(codLocal, codVisita, golesLocal, golesVisita)
Use algebra relacional para responder:

1. La lista de los equipos y sus directores tecnicos (con nombre y apel-


lido).

2. Los nombres de los equipos que han ganado al menos una vez.

3. Los directores tecnicos de los equipos que tienen 3 o mas jugadores


suspendidos.

4. Los jugadores suspendidos cuyos equipos han jugado solo 3 veces.

5. El equipo que ha jugado contra todos los demas.

6. El partido en el que ha habido la mayor diferencia de goles.

Solucion:

1. Primero renombro Equipos

Equipo(codEquipo, nombreEquipo, RU T DT ) ← Equipo(codEquipo, nombre, RU T DT )

Luego cruzo el resultado con DT dejando solo los que tiene el mismo
RUT DT (esto se puede hacer en un paso con la operacion Reunion
Natural)
Equipo y DT ← Equipo ? DT
Finalmente quito todos los atributos que no son necesarios usando
proyeccion:

Resultado ← π(nombreEquipo,nombre,apellido) Equipo y DT

2. Primero busco los partidos en que ha salido un ganador de local:

GL ← σgolesLocal>golesV isita P artido

1
Luego busco los partidos en que ha ganado la visita:

GV ← σgolesV isita>golesLocal P artido

Luego extraigo solo los atributos de codigos de equipos para cada uno
y los renombro en una nueva tabla (notar que voy renombrando sobre
los mismos nombres de relaciones :P )

GL(codEquipo) ← πcodLocal GL

GV (codEquipo) ← πcodLocal GV
Luego junto los dos en una misma relacion:

G ← GL ∪ GV

Recordar que todo el algebra relacional es conjuntista y por ende los


resultados son conjuntos en los que NO hay elementos repetidos, es
por ello que no es necesario eliminar las repeticiones de equipos que
han ganado mas de una vez, estos se iran solos al momento que se hizo
la proyeccion sobre los codigos de equipo y al momento de la union
entre ganadores de local y ganadores de visita.

3. Primero extraigo todos los jugadores que estan suspendidos (atributo


suspedido==1)
S ← σsuspendido=1 Jugador
Ahora cruzo los jugadores suspendidos S con Equipos y elimino el
atributo superfluo codEquipo que aparecera dos veces (de nuevo, me-
diante reunion natural). Ahora para hacer esto necesito un atributo
que se repita en ambos con el mismo nombre, entonces primero voy a
renombrar el atributo nombre de los suspendidos por nombreJugador

S(RU T , nombreJugador, apellido, codEquipo, suspendido) ← S(RU T , nombre, apellido, codE

Ahora si entonces hago la reunion natural:

SE ← S o
n Equipo

Ahora cuento cuantos jugadores hay por cada equipo usando la funcion
agregada Count sobre codEquipo (la funcion Count cuenta cuantas
tuplas hay para un atributo que se agrega o reune)

SEC(codEquipo, numeroSuspendidos) ←< codEquipo > = < RU T, Count >

2
Ahora solo me quedo con los equipos que tienen mas de 3 jugadores
suspendidos:
SEC ← σnumeroSuspendidos>=3 SEC
Ahora quito la columna numeroSuspendidos

SEC(codEquipo) ← SEC

Finalmente tengo que encontrar los nombres de los directores tecnicos


asociados a la tabla de equipos que contiene SEC. Para eso uso la
consulta uno reemplazando SEC donde corresponda por Equipo.

4. Primero obtengo los jugadores suspendidos:

S ← σsuspendido=1 Jugador

Luego obtengo los equipos que han jugado *solo* de local y cuento la
cantidad de partidos:

L(codLocal, numeroP artidos) ←< codLocal > = < codV isitaCOU N T >

Ahora los que han jugado *solo* de visita y cuento la cantidad de


partidos:

V (codV isita, numeroP artidos) ←< codV isita > = < codLocalCOU N T >

Ahora renombre el atributo codLocal y codVisita para normalizar

L(codEquipo, numeroP artidos) ← L

V (codEquipo, numeroP artidos) ← V


Ahora los junto en una sola tabla

LV ← L ∪ V

Ahora sumo los partidos jugados de local y visita agrupados por cod-
Equipo

P J(codEquipo, numeroP artidosT otales) ←< codEquipo > = < numeroP artidosSU M A >

Ahora me quedo solo con los que tienen numeroPartidosTotales=3

P J ← σnumeroP artidosT otales=3

3
Ahora le quito el atributo numeroPartidosTotales

E ← πcodEquipo P J

Finalmente hago una reunion natural con los jugadores que estaban
suspendidos
JSE ← S o nE
Por ultimo una tabla que contenga solo los nombres de los jugadores:

JSE ← π<nombre,apellido> JSE

5. Primero creo una tabla que tiene un atributo que indica el equipo y un
atributo que indica el equipo con el que se ha enfrentado. Para ello,
cruzo la tabla equipos con la tabla equipos para obtener un todos con
todos:
Equipo1(codEquipoBase) ← πcodEquipo Equipo
T CT ← Equipo1 o
n Equipo
Notar que por el momento no me interesa ninguna restriccion asi que
esta tabla contiene mas informacion de la que necesito. Luego, cruzo
esta tabla con la tabla Partido si y solo si el partido se jugo realmente,
es decir, si codLocal = codEquipoBase y codV isita = codEquipo ó
codLocal = codEquipo y codV isita = codEquipoBase (en cualquiera
de estos dos casos quiere decir que esos equipos se han enfrentado)

T CT ← πcodEquipoBase,codEquipo (T CT o
ncond P artido)
Donde cond = (codLocal = codEquipoBase∧codV isita = codEquipo)∨
(codLocal = codEquipo ∧ codV isita = codEquipoBase)
Ahora hago una division entre esta tabla y la tabla equipos, de esta
forma me arrojara todos los equipos de la tabla TCT que tienen en
codEquipo a todos los equipos de la tabla equipos (la que por supuesto
contiene todos los equipos). Para ello previamente debo proyectar la
tabla equipos:
Equipo ← πcodEquipo (Equipo)
T CT R ← T CT ÷ Equipo
Ahora busco el nombre si es que lo piden (esto lo voy hacer en una
operacion anidada: primero proyecto TCTR para obtener solo los cod-
EquipoBase, luego los renombro para hacer el reunion natural, luego

4
hago el reunion natural y finalmente proyecto para obtener solo los
nombres :P)

πnombre ((E(codEquipo) ← πcodEquipoBase (T CT R)) ? Equipo)

6. Primero obtengo la diferencia de goles:

DG(codLocal, codV isita, dif G) ←< codLocal, codV isita > = < golesLocal−golesV isita >

Ahora obtenemos el maximo

DG(codLocal, codV isita, dif G) ←< codLocal, codV isita > =M AXIM Odif G

2 Arriendo de propiedades
Considerando el siguiente esquema:
Arrendatario(RUT, nombre, apellido)
Arrienda((RUT), idCasa, deuda)
Telefonos(RUT, fono)
Duen~no(RUT, nombre, apellido)
Casa(idCasa, RUT, numero, calle, comuna)
Con la informacion, responda:

1. Los arrendatarios de la casa que queda en Carrera 1024, Santiago.

2. La deuda total que tienen los arrendatarios con Maria Perez

3. La deuda total para cada dueño

4. El numero de casas de cada dueño

5. El total de telefonos de cada arrendador.

6. El promedio de arrendatarios por casa.

7. Los arrendatarios que tienen al menos 3 casas.

8. Los dueños que tienen deudores en todas sus casas.

9. El arrendatario que posee mas casas

Solucion:

5
1. Primero busco el idCasa de la casa que queda en Carrera 1024:

C(idCasa) ← πidCasa (σcalle=‘‘Carrera’’∧ numero=1024 (Casa))

Luego busco el RUT de quien arrienda esa casa:

R(RU T , idCasa) ← πRUT,idCasa (σidCasa=C.idCasa (Arrienda))

Finalmente busco LOS arrendatarios (supongo que pueden haber var-


ios arrendatarios) :

πnombre, apellido (R ? Arrienda)

2. Primero busco el RU T de Maria Perez

R(RUT) ← σnombre=Maria∧apellido=Perez (Dueno)

Luego busco TODAS las casas que arrienda

C(idCasa) ← πidCasa (σRUT=R.RUT (Casa))

Luego busco todos los que arriendan alguna de las casas que estan en
las casas que arrienda Maria Perez

A ← C ? Arrienda

Finalmente sumo todas las deudas (ojo que como me piden todas no
tengo que agrupar)

DT ← = < SUMA deuda > (A)

3. Primero obtengo todos los dueños:

D(RUTD, idCasa) ← π(RUT, idCasa) (Dueno ? (Casa))

Luego obtengo todas las deudas (notar que previamente renombre el


RU T de los duenños.)

DD(RUTD, RUT, idCasa, deuda) ← π(RU T D,idCasa,deuda) (D?Arrienda)

Finalmente sumo las deudas, ahora SI tengo que agrupar por duenño.

DD(RUTD, deuda) ←< RUTD > = < SUMA deuda > (Arrienda)

6
4. Primero obtengo las casas y los dueños:

CD ← π(RUT, idCasa) (Casa ? Dueno)

Luego cuento el numero de casas agrupando por dueño:

N C ←< RUT > = < CUENTA idCasa >

5. Parecida a la anterior. Primero creo una relacion que tenga el arren-


datario y telefono (notar que pueden haber varias tuplas con distintos
telefonos para un mismo arrendatario)

T A ← πRUT, fono (T elef onos ? Arrienda)

Luego cuento agrupando por RUT

T C ←< RUT > = < CUENTA fono > (T A)

6. Primero limpio la relacion Arrienda

CA ← πRUT, idCasa (Arrienda)

Luego agrupo por cada casa y cuento la cantidad de arrendatarios:

N AC(idCasa,numeroArrendatarios) ←< (idCasa) > = < CUENTA RUTCA >

Ahora guardo la cantidad de casas que hay:

CC(numeroCasas) ← = < CUENTA idCasa(Casa) >

Ahora sumo la cantidad de arrendatarios de NAC:

CT A(suma) ← = < SUMA numeroArrendatarios > (N AC)

Ahora creo una tabla que tenga el numero de casas totales y la suma
de los arrendatarios:

CCCT A ← CT A o
n CC

Ahora divido la suma de los arrendatarios por la cantidad de casas


que hay:

R ← = < suma/numeroCasas > (CCCT A)

7
7. Primero obtengo una relacion con arrendatarios y casas si es que el
arrendatario tiene casa

AC ← πRUT, idCasa (Arrendatario n Casa)


o

Luego cuento la cantidad de casas de los arrendatarios agrupando por


arrendatarios:

CA(RU T, cuentaCasas) ←< RUT > = < CUENTA idCasa(AC) >

Luego me quedo con los que tienen mas de 3 casas

C3 ← σ(cuentaCasas≥3) (CA)

8. Veremos el problema al reves: dueños que tienen deudores en todas las


casas = dueños que no tienen casas sin deudores. Entonces primero
las tuplas de arrienda que no tienen deudas:

CSD(idCasa) ← πidCasa (σdeuda=0 (Arrienda))

Ahora los dueños de dichas casas (dueños de casas que no tienen deu-
das):
DCSD ← πRUT (CSD ? Casa)
Ahora, los dueños que no estan en este conjunto entonces son los que
tienen deudores en todas las casas o tambien quienes no tienen casas
sin deudores (sin deudas):

R ← D − DCSD

Donde D viene dado por

D ← πRUT (Duenos)

9.

8
3 Problema de transporte
Una empresa rural de transporte de pasajeros tiene una base de datos de in-
formacion acerca de los recorridos de sus buses. Un recorrido es una secuen-
cia de paradas que comienzan en un terminal. El numero de paradas varia de
un recorrido a otro pero hay al menos una parada. El modelo relacional con-
siste del siguiente diagrama:
Salida(NumRecorrido, idLocalidad)
Parada(NumRecorrido, idLocalidad, TiempoLlegada)
Donde NumRecorrido e idLocalidad identifican completamente un recor-
rido y una localidad. El atributo TiempoLlegada indica cuanto tarda en
promedio en llegar un bus a la localidad desde su salida. Ahora conteste:

1. ?Cual es el recorrido mas largo segun numero de localidades?. Cual es


el recorrido mas largo segun tiempo tomado?

2. Indique los recorridos con ciclos, ie, aquellos recorridos en que se visita
una localidad mas de una vez.

3. Indique la parada central de cada recorrido (si un recorrido tiene cinco


paradas, interesa la tercera parada. Y si tiene seis, tambien interesa
la tercera).
1

1
Los acentos han sido omitidos por un tema de tiempo/comodidad dado el contexto
Latex del documento. :P

También podría gustarte