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)
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. Explíquese 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. Dese 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 la ciudad de residencia de todos los empleados que trabajan para el Banco Importante y ganan más de 2.000.000 de pesetas 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 instaladas en ciudades pequeñas. Hállense todas las compañías instaladas en cada ciudad en la que está instalado el Banco Pequeño.
Respuesta:
a. Õnombre-persona (snombre-compañía = “Banco Importante” (trabaja))
b. Õnombre-persona (empleado |x|
(snombre-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) 1
|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.7. Las operaciones de reunión externa amplían la operación reunión natural de manera que las tuplas de las relaciones participantes no se pierdan en el resultado de la reunión. Descríbase la manera en que la operación reunión zeta puede ampliarse para que las tuplas de la relación de la izquierda, las de la relación de la derecha o las de ambas relaciones no se pierdan en el resultado de una reunión zeta.
Respuesta:
a. La reunión zeta externa por la izquierda de r(R) y s(S) (r ]x|_ s) se puede definir como
(r |x|_ s) _ ((r - ÕR(r |x|_ s)) × (nulo, nulo,. . ., nulo))
La tupla de nulos es de tamaño igual al número de atributos en S.
b. La reunión zeta externa por la derecha de r(R) y s(S) (r |x[_ s) se puede definir como
(r |x|_ s) _ ((nulo, nulo . . . nulo) × (s - Õs(r |x|_ s)))
La tupla de nulos es de tamaño igual al número de atributos en R.
c. La reunión zeta externa completa de r(R) y s(S) (r ]x[_ s) se puede definir como
(r |x|_ s) _ ((nulo, nulo,. . ., nulo) × (s - Õs(r |x|_ s))) _ ((r - ÕR(r |x|_ s)) × (nulo, nulo,. . ., nulo))
La primera tupla de nulos es de tamaño igual al número de atributos en R y la segunda es de tamaño igual al número de atributos en S.
3.8. Considérese la base de datos regional de la Figura 3.39. Dese una expresión del álgebra relacional para cada petición:
a. Modificar la base de datos de manera que Santos viva ahora en Tres Cantos.
b. Dar a todos los empleados del Banco Importante un aumento de sueldo del 10 por ciento.
c. Dar a todos los jefes de la base de datos un aumento de sueldo del 10 por ciento.
d. Dar a todos los jefes de la base de datos un aumento de sueldo del 10 por ciento, a menos que el sueldo resultante sea mayor que 100.000 _. En este caso, dar sólo un aumento del 3 por ciento.
e. Borrar todas las tuplas de los empleados de Banco Pequeño de la relación trabajo.
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 - s nombre-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
(s trabaja.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
(s trabaja.nombre-persona = nombre-jefe (trabaja × jefe))
t2 ←Õtrabaja.nombre-persona, nombre-compañía, salario*1.03
(s t1.salario * 1.1 > 100.000(t1))
t2 ←t2 _ Õtrabaja.nombre-persona, nombre-compañía, salario*1.1
s t1.salario * 1.1 _ 100.000(t1))
trabaja(trabaja - t1) __ t2
e. trabaja←trabaja - s nombre-compañía = “Banco Pequeño” (trabaja)
3.10. Considérese la base de datos relacional de la Figura 3.38. Dese 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 la nómina (suma de sueldos de sus empleados) más reducida.
c. Averiguar las compañías cuyos empleados ganen un sueldo más elevado, 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(Ƥft3 (nombre-compañía,número-empleados)(t1) |x| Ƥft4 (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)))