3.1
Diséñese una base de datos relacional para la
oficina de registro de una universidad. La oficina conserva datos sobre cada
curso, incluyendo el profesor, el número de estudiantes matriculados y la hora
y el lugar de las clases. Por cada pareja estudiante – curso, se guarda una
calificación.
Respuesta: Los atributos subrayados indican la clave
primaria.
estudiante
(id-estudiante, nombre, programa)
curso
(número-curso, título, programa-estudios, créditos)
ofertas-cursos
(número-curso, número-sección, año, semestre, hora, aula)
profesor
(id-profesor, nombre, departamento, título)
matrículas
(id-estudiante, número-curso, número-sección, semestre, año, calificación)
enseña
(número-curso, número-sección, semestre, año, id-profesor)
requerimientos
(curso-principal, requisitos-previos)
3.2
Descríbanse las diferencias de significado
entre los términos relación y esquema de la relación. Ilústrese
la respuesta haciendo referencia a la solución propuesta para el Ejercicio 3.1.
Respuesta:
Un esquema de la relación es una definición de
tipos y una relación es una instancia de ese esquema. Por ejemplo, estudiante
(ss#, nombre) es un esquema de la relación y ss# nombre es una
relación basada en ese esquema.
|
ss#
|
nombre
|
|
123-45-6789
|
Tom Jones
|
|
456-78-9123
|
Joe Brown
|
3.3
Diséñese una base de datos relacional
correspondiente al diagrama E-R de la Figura 3.38.
Respuesta:
El esquema de la base de datos relaciones se
presenta a continuación.
persona (id-conductor, nombre, dirección)
coche (matrícula, año, modelo)
accidente (número-informe, lugar, fecha)
posee (id-conductor, matrícula)
participado (número-informe, id-conductor, matrícula,
importe-daños)
empleado (nombre-persona, calle, ciudad)
trabaja (nombre-persona, nombre-compañía, sueldo)
compañía (nombre-compañía, ciudad)
jefe (nombre-persona, nombre-jefe)
3.4
En el Capítulo 2 se mostró la manera de
representar los conjuntos de relaciones de varios a varios, de varios a uno, de
uno a varios y de uno a uno. Explicar la manera en que las claves primarias
ayudan a representar estos conjuntos de relaciones en el modelo relacional.
Respuesta:
Supóngase que la clave primaria del esquema de
la relación R es {Ai1, Ai2 , ...,Ain} y que la
clave primaria del esquema de la relación S es {Bi1, Bi2 ,
...,Bim}. Entonces una relación entre los dos conjuntos se puede
representar como una tupla (Ai1, Ai2 , ...,Ain, Bi1, Bi2
, ...,Bim). En una relación de uno a uno, cada valor en {Ai1,
Ai2 , ...,Ain} aparecerá en una tupla e igualmente para {Bi1,
Bi2 , ...,Bim}. En una relación de varios a uno (por ejemplo de
varios A a un B), cada valor en {Ai1, Ai2 ,
...,Ain} aparecerá una vez y cada valor en {Bi1, Bi2 ,
...,Bin} puede aparecer varias veces. En una relación de varios a
varios, los valores en ambos {Ai1, Ai2 , ...,Ain} y {Bi1,
Bi2 , ...,Bim}aparecerán varias veces. Sin embargo, en todos los
casos anteriores {Ai1, Ai2 , ...,Ain ,Bi1, Bi2
, ...,Bim} es una clave primaria, por lo que ninguna tupla en (Aj1
, ...,Ajn Bk1 , ...,Bkm) aparecerá más de una vez.
3.5
Considérese la base de datos relacional de la
Figura 3.39, donde las claves primarias están subrayadas.
Formúlese
una expresión del álgebra relacional, otra del cálculo relacional de tuplas y
una tercera del cálculo relacional de dominios, para cada una de las consultas
siguientes:
a.
Averiguar los nombres de todos los empleados
que trabajan para el Banco Importante.
b.
Averiguar el nombre y la ciudad de residencia
de todos los empleados que trabajan para el Banco Importante.
c.
Averiguar el nombre, la calle y ciudad de
residencia, de todos los empleados que trabajan para el Banco Importante y
ganan más de 10.000€ anuales.
d.
Averiguar el nombre de todos los empleados de
esta base de datos que viven en la misma ciudad que la compañía para la que
trabajan.
e.
Averiguar el nombre de todos los empleados que
viven en la misma ciudad y en la misma calle que sus jefes.
f.
Averiguar el nombre de todos los empleados de
esta base de datos que no trabajan para el Banco Importante.
g.
Averiguar el nombre de todos los empleados que
ganan más que cualquier empleado del Banco Pequeño.
h.
Supóngase que las compañías pueden estar
ubicadas en varias ciudades. Buscar todas las empresas con sede en todas las
ciudades en las que tiene sede el Banco Pequeño.
Respuesta:
a. Õnombre-persona (snombre-compañía
= “Banco Importante” (trabaja))
b.
Õnombre-persona (empleado
|x|
(Õnombre-compañía
= “Banco Importante” (trabaja)))
c. Õnombre-persona,
calle, ciudad
(s(nombre-compañía
= “Banco Importante” ^sueldo > 2.000.000)
trabaja |x| 1
empleado)
d.
Õnombre-persona (empleado
|x| trabaja |x| compañía)
e.
Õnombre-persona
((empleado |x| jefe)
|x| (nombre-jefe =
empleado2.nombre-persona ^empleado.calle = empleado2.calle
^ empleado.ciudad = empleado2.ciudad)(Ƥempleado2
(empleado)))
f.
Las
soluciones siguientes asumen que todas las personas trabajan para una compañía.
Si se permite que aparezcan personas en la base de datos (por ejemplo en empleado)
pero que no aparezcan en trabaja, el problema se complica. Más adelante
se dan soluciones para este caso más realista.
Õnombre-persona
(snombre-compañía
_ “Banco Importante” (trabaja))
Si
las personas no pueden trabajar para cualquier compañía:
Õnombre-persona
(empleado) __
Õnombre-persona
(s(nombre-compañía
= “Banco Importante”) (trabaja))
g.
Õnombre-persona (trabaja)
__ Õtrabaja.nombre-persona
(trabaja
|x| (trabaja.sueldo
≤ trabaja2.sueldo ^ trabaja2.cpnmbre-compañía =“Banco Pequeño”)
Ƥ
trabaja2 (trabaja)))
h. Nota: El
Banco Pequeño se incluirá en cada respuesta.
Õnombre-compañïa
(compañía ÷
(Õciudad (snombre-compañía
= “Banco Pequeño” (compañía))))
3.8 Considérese la
base de datos relacional de la Figura 3.39. Se da una expresión del álgebra
relacional para cada petición:
a.
Modificar la base de datos de forma que Santos
viva en Tres Cantos.
b.
Dar a todos los empleados del Banco Importante
un aumento de sueldo del 10%.
c.
Dar a todos los jefes de la base de datos un
aumento de sueldo del 10%.
d.
Dar a todos los jefes de la base de datos un
aumento de sueldo del 10%, a menos que su sueldo esté por encima de 100.000 €
anuales. En tal caso, darles sólo un 3%.
e.
Borrar todas las tuplas de la relación trabaja
para los empleados del Banco Pequeño.
Respuesta:
a.
empleado
← Õnombre-persona,calle,“Tres
Cantos”
(snombre-persona
=“Santos”(empleado))
ᴗ
(empleado snombre-persona
=“Santos”(empleado))
b. trabaja
← Õnombre-persona,nombre-compañía,
1.1 * salario (
(s(nombre-compañía
= “Banco Importante”) (trabaja))
ᴗ
(trabaja - snombre-compañía
= “Banco Importante”
(trabaja))
c.
La
sintaxis de actualización permite referenciar sólo a una relación sencilla. Dado
que esta actualización requiere acceder a las dos relaciones a actualizar (trabaja)
y jefe, se deben seguir varios pasos. En primer lugar, identificar las
tuplas de trabaja que se han se actualizar y almacenarlas en una
relación temporal (t1) Después, crear una relación temporal (t2)
que contenga las nuevas tuplas. Finalmente borrar las tuplas en t1,
desde trabaja, e insertar las tuplas t2.
t1
←Õtrabaja.nombre-persona,
nombre-compañía, salario
(strabaja.nombre-persona
= nombre-jefe (trabaja × jefe))
t2
←Õnombre-persona,nombre-compañía,
1.1 * salario (t1)
trabaja(trabaja
- t1) ᴗ t2
d.
La misma situación surge aquí. Como antes, t1,
contiene las tuplas que se han de actualizar y t2 contiene estas tuplas
en su forma actualizada.
t1
← Õtrabaja.nombre-persona,
nombre-compañía, salario
(strabaja.nombre-persona
= nombre-jefe (trabaja × jefe))
t2
← Õtrabaja.nombre-persona,
nombre-compañía, salario*1.03
(st1.salario
* 1.1 > 100.000(t1))
t2
← t2 ᴗ (Õtrabaja.nombre-persona,
nombre-compañía, salario*1.1
(st1.salario
* 1.1 _ 100.000(t1))
trabaja(trabaja
- t1) __ t2
e.
trabaja ← trabaja
- snombre-compañía
= “Banco Pequeño” (trabaja)
3.10
Considérese la base de datos relacional de la
Figura 3.39. Se da una expresión del álgebra relacional para cada una de las
consultas siguientes:
a.
Averiguar la compañía con mayor número de
empleados.
b.
Averiguar la compañía con nómina (suma de
sueldos de sus empleados) más reducida.
c.
Averiguar las compañías cuyos empleados ganan
un sueldo más alto, en media, que el sueldo medio del Banco Importante.
Respuesta:
a.
t1
←nombre-compañía G count-distinct
nombre-persona (trabaja)
t2
← max número-empleados(Ƥ
fuerza-compañía (nombre-compañía,número-empleados)(t1))
Õnombre-compañía(Ƥ
t3 (nombre-compañía,número-empleados)(t1)
|x|Ƥ t4 (número-empleados)(t2))
b. t1
←nombre-compañía G sum
sueldo (trabaja)
t2 ←min
nómina (Ƥ nómina-compañía
(nombre-compañía,nómina)(t1))
Õnombre-compañía(Ƥ
t3 (nombre-compañía,nómina)(t1) |x| Ƥ t4 (nómina)(t2))
c.
t1
←nombre-compañía G avg sueldo (trabaja)
t2 ← snombre-compañía
= “Banco Importante” (t1)
Õt3.nombre-compañía((
Ƥ t3(nombre-compañía,salario-medio)(t1))
| x| t3.salario-medio
> banco-importante.salario-medio (Ƥ banco-importante
(nombre-compañía,salario-medio)(t2)))