Download examen de bases de datos 2º

Document related concepts
no text concepts found
Transcript
CUESTIONARIO DE BASES DE DATOS 24/06/03.
TIPO A
NOTA_OBTENIDA= (Bien_contestadas − Mal_contestadas/3) × 0,25.
Sea el siguiente esquema relacional, al que se hará referencia como ESQUEMA de TRABAJO, que
mantiene información sobre la organización de los grupos en un curso de natación para niños:
d2: Entero positivo
Grupo(cod_gru: d1, capacidad: d2, nivel: d3)
CP: {cod_gru}
VNN: {nivel, capacidad}
Monitor(número: d4, nombre: d5, formación: d6)
CP: {número}
VNN: {nombre, formación}
MonitorGrupo(cod_gru: d1, número: d4, límite:d2)
CP: {cod_gru, número}
VNN: {límite}
CAj: {cod_gru} → Grupo Borrado en CASCADA y Actualización en CASCADA
CAj: {número} → Monitor Borrado RESTRICTIVO y Actualización en CASCADA
Niño(código: d7, nombre: d8, edad: d9, cod_gru: d1, número: d4)
CP: {código}
VNN: {nombre, edad , cod_gru}
CAj: {cod_gru, número} → MonitorGrupo
Integridad Referencial PARCIAL
Borrado RESTRICTIVO y Actualización en CASCADA
La relación Grupo contiene todos los grupos disponibles. En la relación Monitor se guardan los monitores
del curso. La relación MonitorGrupo mantiene la asignación de los monitores a los grupos. La relación
Niño, contiene los niños apuntados al curso con la información de a qué grupo pertenecen y el monitor que
tienen asignado.
cod_gru
G1
G2
G3
GRUPO
capacidad
10
15
15
MONITORGRUPO
cod_gru
número
G1
1
G1
2
G2
3
G2
4
G3
3
nivel
Inicial
Medio
Alto
límite
4
6
7
4
7
MONITOR
nombre
Alfonso Peris
María Llopis
Juan Cruz
Pedro Rius
NIÑO
código nombre
edad
1111 Juan
7
2222 Luisa
8
3333 Pedro
8
4444 María
8
5555 Luis
10
número
1
2
3
4
formación
Monitor-T1
Monitor-T2
Monitor-T1
Socorrista
cod_gru
G1
G1
G2
G2
G3
número
3
3
1) Dado el esquema de trabajo, ¿cuál de las siguientes afirmaciones es CIERTA?
a) Un monitor sólo puede encargarse de un grupo si hay algún niño asignado a dicho grupo.
b) Todo grupo debe tener al menos un monitor asignado.
c) Todo monitor necesariamente debe encargarse de un grupo.
d) Un monitor puede encargarse de un grupo, y dicho grupo puede a su vez tener varios monitores
asignados.
2) En la base de datos del esquema de trabajo, cual sería el efecto de realizar la siguiente operación en
SQL, DELETE FROM MONITORGRUPO WHERE cod_gru=G1 and número=1 .
a) Se borra esa tupla.
b) No se puede borrar por la directriz “Borrado Restrictivo” de la clave ajena {cod_gru, número} de
la relación NIÑO.
c) No se puede borrar por la directriz “Borrado Restrictivo” de la clave ajena {cod_gru} de la
relación MONITORGRUPO.
d) Se borra esa tupla y el sistema borra también de la relación NIÑO las tuplas con cod_gru = G1.
3) En la base de datos del esquema de trabajo, si se añade la restricción de integridad:
CREATE ASSERTION RI
CHECK
( NOT EXISTS (SELECT * FROM Monitor Mx
WHERE NOT EXISTS (SELECT * FROM MonitorGrupo MGx
WHERE MGx.número=Mx.número)))
¿Cuál de las siguientes transacciones es válida, suponiendo que todas las restricciones del esquema
tienen un modo de comprobación diferido?.
a) INSERT INTO Monitor ( número, nombre, formación) VALUES (5, “Pau ”, “Monitor-T1”);
COMMIT
b) INSERT INTO Monitor (número, nombre, formación) VALUES (5, “Pau Peris ”, “Monitor-T1”);
INSERT INTO MonitorGrupo ( cod-gru, número, limite) VALUES (“G1”, 5, 8);
COMMIT
c) INSERT INTO Monitor (número, nombre, formación) VALUES (5, “Pau Peris ”, “Monitor-T1”);
INSERT INTO Monitor (número, nombre, formación) VALUES (6, “Carmen Rius ”, “MonitorT1”);
INSERT INTO MonitorGrupo ( cod-gru, número, limite) VALUES (“G1”, 5, 8);
COMMIT
d) Todas las transacciones son válidas.
4) En la base de datos del esquema de trabajo, tras ejecutar la sentencia CREATE VIEW
SOCORRISTA AS SELECT * FROM MONITOR WHERE formación=”Socorrista”, ¿cuál de las
siguientes afirmaciones es CIERTA tras realizar la sentencia SQL,
INSERT INTO
SOCORRISTA (número, nombre, formación) VALUES (8, “Pere Such ”, “Monitor-T1”);
a) La sentencia no insertará ninguna tupla puesto que no se corresponde con un monitor de
formación “Socorrista”.
b) La sentencia no insertaría ninguna tupla si la vista se hubiera definido con la cláusula WITH
CHECK OPTION ya que no se correspondería con un monitor de formación “Socorrista”.
c) La sentencia no insertaría ninguna tupla si la vista se hubiera definido con la opción NOT
DEFERRABLE ya que no se correspondería con un monitor de formación “Socorrista”.
d) La sentencia no insertaría ninguna tupla si la vista se hubiera definido con la opción
DEFERRABLE ya que no se correspondería con un monitor de formación “Socorrista”.
5) En la base de datos del esquema de trabajo, si se añade la restricción de integridad:
CREATE ASSERTION R2
CHECK
( NOT EXISTS (SELECT *
FROM grupo G
WHERE capacidad <
(SELECT SUM(límite)
FROM MonitorGrupo M
WHERE G.cod_gru = M.cod_gru ) ) )
¿Cuál es el conjunto de operaciones que puede violar dicha restricción de integridad?.
a) Modificar el atributo capacidad de Grupo, Insertar en MonitorGrupo, modificar el atributo límite de
MonitorGrupo, modificar el atributo cod_gru en MonitorGrupo
b) Insertar en Grupo, Modificar el atributo capacidad de Grupo, Insertar en MonitorGrupo, modificar
el atributo límite de MonitorGrupo.
c) Borrar en MonitorGrupo, Modificar el atributo capacidad de Grupo, Insertar en MonitorGrupo,
modificar el atributo límite de MonitorGrupo.
d) Borrar en Niño, Modificar el atributo capacidad de Grupo, Insertar en MonitorGrupo, modificar el
atributo límite de MonitorGrupo.
6) ¿Cuál de las siguientes afirmaciones es CIERTA:
a) Al registrarse un punto de verificación (‘checkpoint’) en el fichero diario se graban en disco las
actualizaciones producidas por todas las transacciones que aparecen confirmadas en el diario desde
el último punto de verificación.
b) En el fichero diario sólo se registran las transacciones realizadas en la base de datos que aparecen
como confirmadas.
c) El fichero diario se recomienda que esté en el mismo dispositivo físico donde se guarda la base de
datos por razones de seguridad.
d) Los ficheros de la base de datos nunca pueden estar almacenados en discos diferentes.
7) Dado la base de datos del esquema de trabajo ¿qué ocurriría en la base de datos si se ejecuta la
siguiente instrucción?
DELETE FROM Grupo WHERE capacidad=15 and nivel=”Alto”;
a)
b)
c)
d)
El sistema no dejaría realizar la operación.
La instrucción se ejecutaría sin problemas.
La instrucción se ejecutaría produciendo en cascada un borrado en MonitorGrupo.
La instrucción se ejecutaría produciendo en cascada un borrado en la relación MonitorGrupo y
posteriormente en la relación Niño.
8) Dado el esquema de trabajo ¿qué ocurriría en la base de datos si se ejecuta la siguiente instrucción?
INSERT INTO Niño ( código, nombre, edad, número)
VALUES (6666, “Juan”, 12, 4);
a) La instrucción insertaría una nueva fila en la relación Niño sin problemas.
b) El sistema no dejaría realizar la operación puesto que incumpliría la integridad referencial al
indicar el monitor y no el grupo.
c) La instrucción daría error ya que no inserta valor en el campo cod_gru.
d) El sistema no dejaría realizar la operación puesto que el valor del nombre del Niño ya existe en la
relación Niño.
9) Respecto a la independencia de datos, señale la opción FALSA:
a) La independencia de datos es la propiedad que asegura que un esquema
externo nunca se verá afectado por ningún cambio en el esquema lógico.
b) En la independencia de datos se puede distinguir la física y la lógica.
c) La independencia de datos desaparece cuando se produce la ligadura.
d) Cuanto más tarde se produzca la ligadura más independencia se tiene.
10) En la base de datos del esquema de trabajo, la cardinalidad máxima de la relación MonitorGrupo es:
a) La cardinalidad de la relación Monitor.
b) La cardinalidad de la relación Grupo.
c) El producto de la cardinalidad de Monitor por la cardinalidad de Grupo.
d) Infinita.
11) ¿Cómo se definiría en el SGBD Oracle 8.0 la restricción de integridad “la edad de un niño no puede
decrecer”
a) Mediante la instrucción CREATE ASSERTION del SQL estándar.
b) Mediante una restricción de tabla (instrucción CHECK sobre el atributo edad).
c) Mediante una regla de actividad (TRIGGER).
d) No se puede definir esta restricción en el Oracle 8.0.
12) ¿Qué información devuelve la siguiente instrucción SQL?
SELECT número, COUNT(*) FROM Niño
GROUP BY número HAVING COUNT(*) >=ALL (SELECT COUNT(*)
FROM Niño
GROUP BY número)
a) Los monitores que tienen mayor número de niños asignados.
b) Los monitores que tienen mayor número de niños asignados en un mismo grupo
c) Los monitores que tienen mayor número de grupos asignados.
d) Los monitores que tienen mayor número de niños asignados que todavía no tienen grupo.
13) ¿Cuál de estas expresiones de Álgebra Relacional, responde a la consulta: ¿qué grupos no tienen
niños apuntados?
a) Grupo[cod_gru] – Niño[cod_gru]
b) Grupo[cod_gru] – (Grupo
Niño)[cod_gru]
c) Niño DONDE nulo(cod_gru)
Grupo) [cod_gru]
d) (Grupo
MonitorGrupo) [cod_gru] – Niño [cod_gru]
14) ¿En un SGBD con independencia lógica y física ¿qué consecuencias tendrá un cambio en el esquema
físico relativo a la implementación de una estructura de datos?
a) Deberá cambiarse en el esquema lógico la definición de dicha estructura.
b) Ninguna.
c) Deberá cambiarse la definición de dicha estructura de datos tanto en el esquema lógico, como en
todos los esquemas externos que la incluyen.
d) Deberá volverse a compilar los programas de aplicación que utilicen dicha estructura de datos, si
la ligadura tiene lugar en tiempo de compilación.
BASES DE DATOS
Junio 2003
Problemas
Sea el siguiente esquema relacional de una base de datos para la gestión de las misiones
espaciales a nivel mundial.
ASTRONAUTA(cod_astro:d_cod, nombre:d_nom,
país:d_país, num_viajes:d_num)
CP:{cod_astro}
VNN:{nombre, teléfono}
dirección:d_dir,
teléfono:d_tel,
CIENTÍFICO(cod_cien:d_cod, especialidad:d_esp)
CP:{cod_cien}
CAj:{cod_cien} → ASTRONAUTA
NAVE(cod_nav:d_cod, nombre:d_nom, coste:d_coste)
CP:{cod_nav}
BASE(cod_base:d_cod, dirección:d_dir, país:d_país)
CP:{cod_base}
VNN:{país}
VIAJE(cod_via:d_cod, cod_nav:d_cod, cod_base:d_cod,
fecha_llegada:d_fecha, nivel_éxito:d_nex)
CP:{cod_via}
VNN:{cod_nav, cod_base}
CAj:{cod_nav} → NAVE
CAj:{cod_base} → BASE
fecha_salida:d_fecha,
TRIPULANTE(cod_astro:d_cod, cod_via:d_cod)
CP:{cod_astro, cod_via}
CAj:{cod_astro} → ASTRONAUTA
CAj:{cod_via } → VIAJE
Además, hay definida la siguiente
RESTRICCIÓN DE INTEGRIDAD:
CREATE ASSERTION
NOT EXISTS (SELECT * FROM VIAJE V
WHERE NOT EXISTS (SELECT *
FROM TRIPULANTE T,
ASTRONAUTA A, BASE B
WHERE V.cod_via = T.cod_via AND
T.cod_astro = A.cod_astro AND
V.cod_base = B.cod_base AND
B.país = A.país));
donde los atributos tienen el siguiente significado:
Astronauta:
cod_astro: código identificador del astronauta
nombre: nombre del astronauta
dirección: domicilio del astronauta
teléfono: teléfono de localización del astronauta
país: país de residencia del astronauta
num_viajes: número total de misiones realizadas por el astronauta
Científico:
cod_cien: código identificador del científico
especialidad: especialidad en la que destaca el científico
Nave:
cod_nav: código identificador de la nave
nombre: nombre de la nave
coste: valor económico de la nave
Base:
cod_base: código identificador de la base de lanzamiento
dirección: localización de la base de lanzamiento
país: país en el que se encuentra ubicada la base de lanzamiento
Viaje:
cod_via: código identificador del viaje.
cod_nav: código identificador de la nave que va a ser lanzada
cod_base: código identificador de la base de lanzamiento
fecha_salida: fecha de lanzamiento fecha_llegada: fecha de regreso
nivel_éxito: valor entre 0 (misión fracasada) y 5 (misión exitosa)
Tripulante:
cod_astro: código identificador del astronauta
cod_via: código identificador del viaje en el que va a ser lanzado
DESPUÉS DE LEER ATENTAMENTE EL ESQUEMA
ANTERIOR, RESUELVA LOS SIGUIENTES EJERCICIOS.
RELACIONAL
Resuelva las siguientes cuestiones sobre el esquema anterior:
a) ¿Puede haber algún científico de la base de datos que no sea astronauta? Justifique
brevemente la respuesta.
(0.25)
b) Según el esquema de la base de datos (incluida la restricción de integridad), ¿puede
existir una base de la que no parta ningún viaje? Justifique brevemente la respuesta.
(0.25)
c) Según el esquema de la base de datos (incluida la restricción de integridad), ¿puede
un viaje no tener tripulación? Justifique brevemente la respuesta.
(0.25)
Escriba en SQL/92 las siguientes consultas:
a) Obtener el número total de astronautas que no son científicos.
(0.5)
b) Obtener para cada nave cuántos viajes ha hecho. Incluir en el resultado el nombre de
la nave y las naves que no han hecho ningún viaje.
(1)
c) Obtener el código de los viajes en los que todos los astronautas son científicos.(1)
d) Obtener el nombre de las naves que sólo han partido desde una base.
e) Obtener el país desde cuyas bases ha habido más lanzamientos.
(1)
(1.25)
Se desea mantener el atributo derivado num_viajes de forma automática, de tal forma que
siempre indique el número de viajes en los que ha participado el astronauta (según la
información de la base de datos)
a) Enumere las operaciones sobre la base de datos que afectan al atributo derivado.(0.5)
b) Diseñe un disparador (trigger) de ORACLE8 para controlar alguna de las
operaciones enumeradas en la cuestión anterior.
(0.5)
CUESTIONARIO DE BASES DE DATOS 24/6/2003. SOLUCIONES
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Tipo Cuestionario
A
B
C
D
D C
B
A
A D
C
B
B
A
C
D
B
A
D C
A D
C
B
A D
C
B
A D
C
B
C
B
A D
A D
C
B
C
B
A D
C
B
A D
A D
C
B
A/B D/A C/D B/C
D C
B
A
PROBLEMAS DE BASES DE DATOS 24/6/2003.
SOLUCIONES
1)
a) NO, ya que CIENTÍFICO tiene una clave ajena “cod_cien” que hace referencia a
ASTRONAUTA y dicha clave ajena tiene restricción de valor no nulo por ser la
clave primaria de CIENTÍFICO.
b) SÍ, ya que puede haber una tupla en BASE para la que no haya ninguna tupla en
VIAJE que la referencie.
c) NO, ya que la restricción de integridad adicional obliga a que siempre haya un
miembro de la tripulación que sea del mismo país que la base. Esto implica
necesariamente que todo viaje tiene al menos un tripulante.
2)
a) SELECT COUNT(*)
FROM ASTRONAUTA A
WHERE A.cod_astro NOT IN (SELECT C.cod_cien FROM CIENTÍFICO);
b) SELECT N.nombre, COUNT(V.cod_via)
FROM NAVE N LEFT JOIN VIAJE V ON N.cod_nav = V.cod_nav
GROUP BY N.nombre, N.cod_nav;
(también se puede realizar con unA concatenación normal y un UNION)
c) SELECT V.cod_via
FROM VIAJE V
WHERE NOT EXISTS (SELECT * FROM TRIPULANTE T
WHERE V.cod_via = T.cod_via AND
T.cod_astro NOT IN (SELECT cod_cien
FROM CIENTÍFICO));
d) SELECT N.nombre
FROM NAVE N
WHERE N.cod_nav IN (SELECT V.cod_nav FROM VIAJE V
WHERE NOT EXISTS (SELECT * FROM VIAJE V2
WHERE V2.cod_nav= N.cod_nav AND
V2.cod_base <> V.cod_base));
También se podría hacer con un “COUNT(DISTINCT cod_base)”.
e) SELECT B.país
FROM BASE B, VIAJE V
WHERE B.cod_base = V.cod_base
GROUP BY B.país
HAVING COUNT(*) = (SELECT MAX(COUNT(*))
FROM BASE B2, VIAJE V2
WHERE B2.cod_base = V2.cod_base
GROUP BY B2.país);
(Se ignoran las fechas. Si se contemplan sólo los viajes pasados, también estaría bien).
3) a) INSERCIÓN en TRIPULANTE
BORRADO en TRIPULANTE
MODIFICACIÓN de “cod_astro” en TRIPULANTE
Además:
ƒ La modificación directa del atributo “num_viajes” de ASTRONAUTA debería
limitarse a los triggers.
ƒ La inserción de un nuevo astronauta podría controlarse de modo que siempre se
empiece con num_viajes = 0.
b) CREATE TRIGGER T1
AFTER INSERT ON TRIPULANTE
FOR EACH ROW
BEGIN
UPDATE ASTRONAUTA A
SET A.num_viajes = A.num_viajes + 1
WHERE A.cod_astro = :new.cod_astro;
END;
Esta solución se ha realizado ignorando el hecho de si el viaje se ha producido o es un
viaje futuro. En el caso de que se tenga en cuenta las fechas, el resultado es más completo
y también está bien.