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.