====== Examen Final - 75.15. Base de Datos - 25/02/2009 ====== **Cátedra:** Ale (catedra unica)\\ **Fecha:** 5° Oportunidad - (2° Cuatrimestre) 2008\\ **Día:** 25/02/2009 Esta página está incompleta; podés ayudar completando el material. ===== Enunciado ===== ==== Ejercicio I ==== Dadas las siguientes consultas en SQL: Q1. SELECT A FROM R r1 WHERE EXISTS (SELECT * FROM R WHERE A=r1.B) Q2. SELECT A FROM R WHERE B=ANY (SELECT A FROM R) Elija y justifique una opción: - Q1 y Q2 retornan exactamente el mismo resultado - El resultado de Q1 siempre está contenido en el de Q2 - El resultado de Q2 siempre está contenido en el de Q1 - Ambas queries retornan resultados diferentes ==== Ejercicio II ==== Dado el siguiente esquema R(A,B,C,D): * AB \rightarrow C * ABC \rightarrow D * AC \rightarrow \rightarrow B Elija y justifique una opción: - El esquema no se encuentra en 3FN - El esquema se encuentra en 3FN pero no en FNBC - El esquema se encuentra en FNBC pero no en 4FN - El esquema se encuentra en 4FN ==== Ejercicio III ==== En un momento dado se toma una imagen de la base de datos (persistida en disco) y se observa lo siguiente: ^ Atributo ^ Valor ^ | A | 13 | | B | 40 | | C | 35 | | D | 4 | | E | 18 | En ese mismo instante se examina el Log y se ve lo siguiente: Caso a) (T1,START;);(T1,C;35);(T1,D;450);(T2,START;);(T2,C;18);(T2,B;40);(T1,COMMIT;); (START CHECKPOINT, (T2) ;);(END CHECKPOINT,;);(T2,D;18);(T3,START;);(T3,C;35); (T3,E;18);(T2,A;13);(T3,COMMIT;);(T2,COMMIT;); Caso B) (T1,START;);(T1,D;4);(T2,START;);(T2,E;6);(T1,A;5);(START CHKPNT, (T1,T2) ;); (T1,E;18);(T3,START;);(T3,C;35);(T3,A;13);(T2,COMMIT;);(T3,B;40);(T3,COMMIT;); (END CHKPNT,;);(T1,A;18);(T1,COMMIT;); Lo que se pide es indicar **y justificar** para cada caso si: El log fue generado con UNDO, o REDO, u otro. ===== Resolución ===== ==== Ejercicio I ==== Q1 y Q2 retornan exactamente el mismo resultado. \\ Q1 retorna la columna A de todas las tuplas de R para las que existe alguna tupla que tenga en A, lo que esta tiene en B. \\ Q2 retorna la columna A de todas las tuplas de R para las que su valor de B pertenece a la columna A de otra tupla. Por ejemplo, si tengo una tabla llamada Correlativas: ^ cod_mat ^ Nombre ^ Correlativa ^ | 61.03 | AM2 | | | 62.03 | F2 | 61.03 | | 62.01 | F1 | | | 62.03 | F2 | 62.01 | | 61.08 | A2 | | | 61.10 | AM3 | 61.08 | | 61.10 | AM3 | 61.03 | | 75.40 | AyP1 | | | 75.41 | AyP2 | 75.40 | | 75.07 | AyP3 | 75.41 | Estas Querys pasarían a ser: Q1. SELECT cod_mat FROM Correlativas c1 WHERE EXISTS (SELECT * FROM Correlativas c2 WHERE c2.cod_mat = c1.correlativa) Q2. SELECT cod_mat FROM Correlativas c1 WHERE c1.correlativa=ANY (SELECT cod_mat FROM Correlativas) Por lo que ahora significa que traiga todas las materias que tienen alguna correlativa válida, por lo que la respuesta sería: ^ cod_mat ^ | 62.03 | | 62.03 | | 61.10 | | 61.10 | | 75.41 | | 75.07 | ==== Ejercicio III ==== a) NO es UNDO porque no hay commit de T2 dentro del CKPT, y tampoco es REDO porque los cambios de T1 no estan reflejados en la BD habiendo terminado bien. b) NO es UNDO porque no hay commit de T1 dentro del CKPT. Puede ser REDO porque no hay ninguna transacción que haya hecho commit antes de , por ende no hay cambios en la BD ===== Discusión ===== Si ves algo que te parece incorrecto en la resolución y no te animás a cambiarlo, dejá tu comentario acá.