descargar 116.62 Kb.
|
Ejercicios SQL (Agregar aqui abajo las querys que vayan haciendo, con su respectivo [nombre y apellido]) 1) El NOMBRE de los ingredientes que componen los platos que clasifican en cocina tipica "VASCA" [Nico Cohen] SELECT i.nombre_ing FROM ingrediente i, composicion c, plato p, cocina_tipica ct WHERE i.c_ing = c.c_ing AND p.c_rest = c.c_rest AND p.plato# = c.plato# AND p.c_cocina = ct.c_cocina AND ct.tipo_cocina = 'VASCA' [Ani] SELECT I.NOMBRE_INGREDIENTE FROM INGREDIENTES I, COMPOSICION C, PLATO P WHERE I.C_ING = C.C_ING AND C.C_REST = P.C_REST AND C.PLATO# = P.PLATO# AND P.C_COCINA = 'VSC'; [Nico Cohen] Tenes que joinear tambien con cocina_tipica, ¿como sabes que VSC es vasca? 2) El NOMBRE de los ingredientes que componen los platos que cocinan los chefs especializados en cocina tipica "VASCA" [Nico Cohen] SELECT i.nombre_ing FROM ingrediente i, composicion c, restaurante r, especialidad e, cocina_tipica ct WHERE i.c_ing = c.c_ing AND r.c_rest = c.c_rest AND r.nombre_chef = e.nombre_chef AND e.cocina = ct.c_cocina AND ct.tipo_cocina = 'VASCA' [Euge] SELECT nombre_ing FROM ingrediente i, composicion c WHERE i.c_ing = c.c_ing AND EXISTS (SELECT r.c_rest FROM restaurante r, especialidad e, cocina_tipica ct WHERE r.c_rest = c.c_rest AND r.nombre_chef = e.nombre_chef AND e.c_cocina = ct.c_cocina AND ct.tipo_cocina = 'VASCA') 3) El (o los) TIPO de cocina tipica en que se especializan los chefs que cocinan platos incluyendo el ingrediente "CILANTRO" [Nico Cohen] SELECT ct.tipo_cocina FROM ingrediente i, composicion c, restaurante r, especialidad e, cocina_tipica ct WHERE i.c_ing = c.c_ing AND r.c_rest = c.c_rest AND r.nombre_chef = e.nombre_chef AND e.cocina = ct.c_cocina AND i.nombre_ing = 'CILANTRO' [Ani] SELECT ct.tipo_cocina FROM ingrediente i, composicion c, restaurante r, especialidad e, cocina_tipica ct, plato P WHERE i.c_ing = c.c_ing AND r.c_rest = c.c_rest AND r.nombre_chef = e.nombre_chef AND e.cocina = ct.c_cocina AND i.nombre_ing = 'CILANTRO' AND R.c_rest = P.c_rest AND P.c_rest = C.c_rest AND P.plato# = C.plato#; [Ani Comentario: la relacion con plato se podria evitar como hiciste vos Nico, pero buen yo la habia puesto tambien] 4) El TIPO de cocina tipica en la cual no clasifica plato alguno, ni se especializa chef alguno [Nico Cohen] SELECT c_cocina FROM cocina_tipica MINUS SELECT distinct c_cocina FROM PLATO MINUS SELECT distinct c_cocina FROM especialidad [berta] SELECT tipo_cocina FROM cocina_tipica ct WHERE NOT EXISTS (SELECT c_cocina FROM plato p WHERE p.c_cocina = ct.c_cocina) AND NOT EXISTS (SELECT c_cocina FROM especialidad e WHERE e.c_cocina = ct.c_cocina) [ Euge ] Ídem berta [Ani] SELECT tipo_cocina FROM cocina_tipica WHERE c_cocina not in ( select c_cocina from especialidad ) UNION SELECT tipo_cocina FROM cocina_tipica WHERE c_cocina not in ( select c_cocina from plato); [Euge] Acá con el UNION hmm no cumple lo que pide la consigna. Vos sacás por un lado las cocinas donde no clasifica plato alguno y por el otro sacás en las que no se especializa chef y la consigna pide sacar las cocinas que cumplan ambas cosas a la vez. Corríjanme si me equivoco... 5) El NOMBRE de los restaurantes para los cuales se cumple que su menu incluye platos que clasifican en alguna de las cocinas tipicas en las cuales se especializa el chef que cocina en el restaurante [ Euge Liva ] SELECT distinct nombre_rest FROM restaurante r, plato p, especialidad e WHERE r.c_rest = p.c_rest AND r.nombre_chef = e.nombre_chef AND p.c_cocina = e.c_cocina [Nico Cohen] SELECT distinct r.nombre_rest FROM especialida e, restaurante r, plato p WHERE e.c_cocina = p.c_cocina AND r.c_rest = p.c_rest AND e.nombre_chef = r.nombre_chef 6) El NOMBRE de los restaurantes para los cuales se cumple que su menu incluye platos que clasifican en alguna cocina tipica en la cual no se especializa el chef que cocina en el restaurante [ Euge Liva ] SELECT DISTINCT r.nombre_rest FROM restaurante r, plato p, especialidad e [Nico Cohen] --> Creo que el join con especialidad no es necesario <-- [Euge] Es verdad, no hace falta! WHERE r.c_rest = p.c_rest AND r.nombre_chef = e.nombre_chef AND p.c_cocina NOT IN ( SELECT e.c_cocina FROM especialidad e WHERE e.nombre_chef = r.nombre_chef ) [Nico Cohen] SELECT distinct r.nombre_rest FROM restaurante r, plato p WHERE r.c_rest = p.c_rest AND p.c_cocina NOT IN ( SELECT e.c_cocina FROM especialidad e WHERE e.nombre_chef = r.nombre_chef ) [Ani] idem Nico 7) La CLASE de ingredientes que participa en la composicion de todos los platos del circuito de restaurantes [berta] Esto es la division (not exists not exists). SELECT distinct i.clase FROM ingrediente i WHERE NOT EXISTS (SELECT * FROM plato p WHERE NOT EXISTS (SELECT * FROM composicion c WHERE c.c_ing = i.c_ing AND c.c_rest = p.c_rest AND c.plato# = p.plato#)) [Nico Cohen] idem berta [Ani] idem berta y nico 8) El NOMBRE de los ingredientes que son utilizados, para la composicion de platos, por todos los chefs [berta] SELECT distinct i.nombre_ing FROM ingrediente i WHERE NOT EXISTS (SELECT * FROM chef ch WHERE NOT EXISTS (SELECT * FROM restaurante r, composicion c WHERE r.c_rest = c.c_rest AND r.nombre_chef = ch.nombre_chef AND c.c_ing = i.c_ing)) [Nico Cohen] idem berta 9) El NOMBRE de los ingredientes que participan, en la composicion de platos, en todas las cocinas tipicas [berta] SELECT distinct i.nombre_ing FROM ingrediente i WHERE NOT EXISTS (SELECT * FROM cocina_tipica ct WHERE NOT EXISTS (SELECT * FROM plato p, composicion c WHERE p.c_cocina = ct.c_cocina AND c.c_rest = p.c_rest AND c.plato# = p.plato# AND c.c_ing = i.c_ing)) [Nico Cohen] idem berta [Ani] idem Berta y nico 10) Para cada uno de los restaurantes, el (o los) plato/s de su menu que en su composicion incluye/n todos los ingredientes que utilizan los platos de ese restaurante [Nico Cohen] SELECT c_rest,plato# FROM plato MINUS SELECT c_rest,plato# FROM plato WHERE c_rest,plato#,c_ing IN ( SELECT c_rest,plato#,c_ing FROM composicion c, plato p WHERE c.c_rest=p.c_rest MINUS SELECT c_rest,plato#,c_ing FROM composicion ) 11) La CATEGORIA de restaurantes donde se cocinan todos los platos mas caros del circuito de restaurantes [berta] SELECT distinct r.categor FROM restaurante r WHERE NOT EXISTS (SELECT MAX(precio) FROM plato p1 WHERE NOT EXISTS (SELECT * FROM plato p2 WHERE p2.c_rest = r.c_rest AND p1.c_rest = r.c_rest AND p2.plato = p1.plato)) [Nico Cohen] La probe y no devuelve resultados, en la query de plato tenes que poner * y la condicion de max la tenes que poner en el where <- [Euge] Si, solo hay que arreglar el max como condicion de where en el divisor. El segundo not exists está bien. [berta] coincido, dejo la resolucion mal hecha y los comentarios como ejemplo. [Nico Cohen] SELECT distinct r1.categor FROM restaurante r1 WHERE NOT EXISTS (SELECT * FROM plato p1 WHERE NOT EXISTS (SELECT * FROM plato p2 WHERE r1.c_rest=p2.c_rest AND p1.c_rest=p2.c_rest AND p1.plato=p2.plato) AND p1.precio=(SELECT max(precio) FROM plato)) [ Euge ] SELECT r.categor FROM restaurante r WHERE NOT EXISTS (SELECT p.c_rest, p.plato# FROM plato p WHERE p.precio = (SELECT Max(b.precio) FROM plato b) AND NOT EXISTS (SELECT * FROM plato p2 WHERE p2.c_rest = p.c_rest AND p2.plato# = p.plato# AND p2.c_rest = r.c_rest)) 12) La lista de ingredientes (NOMBRE_ING, UN_MED, CLASE) que participan, en la composicion de platos, en todas las cocinas tipicas en las que se especializa el chef PATO PLUMAS [Nico Cohen] SELECT i.nombre_ing,i.un_med,i.clase FROM ingrediente i WHERE NOT EXISTS (SELECT * FROM especialidad e WHERE NOT EXISTS (SELECT * FROM plato p, composicion c WHERE p.c_rest=c.c_rest AND p.plato=c.plato AND e.c_cocina=p.c_cocina AND i.c_ing=c.c_ing) AND e.nombre_chef='pato plumas') IDEM NICO -Analia hojman 12/20/09 9:13 PM [Euge] SELECT i.nombre_ing, i.un_med, i.clase FROM ingrediente i WHERE NOT EXISTS (SELECT e.c_cocina FROM especialidad e WHERE e.nombre_chef = 'pato plumas' AND NOT EXISTS (SELECT * FROM composicion c, plato p WHERE p.c_cocina = e.c_cocina AND c.c_rest = p.c_rest AND c.plato# = p.plato# AND c.c_ing = i.c_ing)) Yo tenia dudas si la condicion de 'Pato Plumas' iba en el medio, al final o era lo mismo, alguien sabe si da igual?? -Analia hojman 12/20/09 9:34 PM [Euge] Es lo mismo. Siempre y cuando esté como una de las condiciones del WHERE del divisor, da igual.Gracias! -Analia hojman 12/20/09 10:14 PM 13) Sentencia que describa codigo y tipo de todas las cocinas tipicas junto con los nombres de sus respctivos chefs especializados ( considerar las cardinalidades de correspondencia. En el diagrama esta asi: Chef 0,N ----------/ especializa\ -----------1,N cocina_tipica [Analia Hojman] SELECT C.C_COCINA, C.TIPO_COCINA, E.NOMBRE_CHEF FROM COCINA_TIPICA C, ESPECIALIDAD E WHERE C.C_COCINA = E.C_COCINA UNION SELECT C_COCINA, TIPO_COCINA, 'NINGUNO' FROM COCINA_TIPICA WHERE C_COCINA NOT IN (SELECT C_COCINA FROM ESPECIALIDAD) [Euge] Ídem [Nico Cohen] Idem Ani Hojman 14) ESCRIBIR UNA VISTA GRAN-MENU QUE DESCRIBA NOMBRE DE RESTO, CATEGORIA Y PROMEDIO DE PRECIOS DE SUS PLATOS PARA LOS RESTO. CUYO MENU INCLUYA MAS DE 50 PLATOS. [Analia Hojman] CREATE VIEW GRAN-MENU AS SELECT R.NOMBRE_RESTAURANTE, R.CATEGORIA, AVG( P.PRECIO ) AS PRECIO_PROMEDIO FROM RESTAURANTE R, PLATO P WHERE R.C_REST = P.C_REST GROUP BY ( P.C_REST, R.NOMBRE_RESTAURANTE, R.CATEGORIA ) HAVING COUNT( P.plato#) > 50; <-- [Euge] En el HAVING siempre tenés que incluir las columnas del select que no son la operación matemática.Si! me las comi en el having! gracias! ( Pregunta, es seguro agrupar por nombre de resto? digo, solo es seguro si es clave candidata no? Sino..me parece que no serviria agrupar por nombre -Analia hojman 12/20/09 10:11 PM [Berta] La consigna es agrupar por las columnas del select que no son de la operacion matematica, es obligatorio. [Euge] GROUP BY habia puesto arriba yo, no HAVING.Yo le puse HAVING xq en el group by tenia puesto los atributos del select, pero tenia mal el having ( asi como quedo estaria mal el having) -Analia hojman 12/21/09 2:13 AM [Nico Cohen] El p.c_rest en el group by esta demas, el nombre_restaurante es clave candidata [Euge] CREATE VIEW gran_menu AS SELECT r.nombre_rest, r.categor, avg(p.precio) AS promedio_precios FROM restaurante r, plato p WHERE r.c_rest = p.c_rest GROUP BY r.nombre_rest, r.categor HAVING count(*) > 50 [Nico Cohen] Idem Euge 15) Agrego una consulta que mezcle SQL con reglas de integridad ( Lucas ayudante me dijo que una vez se tomo ese ejercicio, la redaccion la invente yo) a) Escribir sentencia SQL que devuelva todas las tuplas de la tabla especialidad que cumplan con las reglas de integridad. [Ani : creo que con los dos exists solos alcanzaria para las dos reglas no? porque si ya existe en las otras tablas, no es null. No le agrego la condicion de que o sea null porque en este caso los dos atributos forman la clave asi que ninguno puede ser null.] <-- [Euge] Claro! SELECT e.* FROM especialidad e WHERE EXISTS (SELECT c_cocina FROM cocina_tipica where c_cocina=e.c_cocina) AND EXISTS (SELECT nombre_chef FROM chef where nombre_chef=e.nombre_chef) [Nico Cohen] Idem b) Escribir sentencia SQL que devuelva todas las tuplas de la tabla Restaurante que cumplan con las reglas de integridad. [Ani : No estoy del todo segura que ese OR funcione bien ahi ] SELECT * FROM RESTAURANTE R WHERE EXISTS ( SELECT NOMBRE_CHEF FROM CHEF C WHERE R.NOMBRE_CHEF = C.NOMBRE_CHEF OR R.NOMBRE_CHEF = NULL ) AND C_REST <> NULL; [Euge] El "OR R.NOMBRE_CHEF = NULL" tiene que ir afuera del EXISTS porque si no queda como condición del SELECT de la tabla Chef y necesitamos que aplique sobre el SELECT de la tabla Restaurante, es decir, que traiga aquellas tuplas en las que el chef existe en la tabla chef O que traiga aquellas en las que el chef es null. -->[Ani]Si, por eso decia en el comentario de arriba que no estaba segura de ese OR ahi. Lo pongo a continuacion como quedaria bien : SELECT * FROM RESTAURANTE R WHERE ( EXISTS ( SELECT NOMBRE_CHEF FROM CHEF C WHERE R.NOMBRE_CHEF = C.NOMBRE_CHEF) OR R.NOMBRE_CHEF = NULL ) AND C_REST <> NULL; [Ani] no probe de correr esto, nose si valen esos parentesis asi al ppio del EXISTS. El tema es que sino los ponemos nose como se interpreta el orden de los op. logicos ( podria interpretarse que se quiere el 1er exists O los otros dos restantes ( AND ) [Nico Cohen] SELECT r.* FROM restaurante r WHERE r.c_rest IS NOT NULL AND (EXISTS (select nombre_chef from chef where nombre_chef=r.nombre_chef) OR r.nombre_chef IS NULL) ![]() Ejercicios Algebra Relacional (Agregar aqui abajo las querys que vayan haciendo, con su respectivo [nombre y apellido]) 1) El NOMBRE de los ingredientes que componen los platos que clasifican en cocina tipica "VASCA" [Nico Cohen] ![]() [ Euge Liva ] πNOMBRE_ING ((σTIPO_COCINA='VASCA'(plato*cocina_tipica)*composicion)*ingrediente) 2) El NOMBRE de los ingredientes que componen los platos que cocinan los chefs especializados en cocina tipica "VASCA" [Nico Cohen] ![]() [ Euge Liva ] πNOMBRE_ING (σTIPO_COCINA='VASCA'(especialidad*cocina_tipica)*restaurante*plato*composicion*ingrediente) [berta] El join con Plato está de más, la relacion con chef la hacemos a través de C_REST que ya lo tiene composición. [Nico Cohen] Corregido 3) El (o los) TIPO de cocina tipica en que se especializan los chefs que cocinan platos incluyendo el ingrediente "CILANTRO" [Nico Cohen] ![]() [berta] El join con Plato está de más, la relacion con chef la hacemos a través de C_REST que ya lo tiene composición. [Nico Cohen] Corregido [ Euge Liva ] πTIPO_COCINA (σNOMBRE_ING='CILANTRO'(ingrediente)*composicion*restaurante*especialidad*cocina_tipica) 4) El TIPO de cocina tipica en la cual no clasifica plato alguno, ni se especializa chef alguno [Nico Cohen] ![]() [ Euge Liva ] πTIPO_COCINA(cocina_tipica) – π(cocina_tipica*especialidad) Ո πTIPO_COCINA(cocina_tipica) – π(cocina_tipica*restaurante) 5) El NOMBRE de los restaurantes para los cuales se cumple que su menu incluye platos que clasifican en alguna de las cocinas tipicas en las cuales se especializa el chef que cocina en el restaurante [Nico Cohen] ![]() [ Euge Liva ] πNOMBRE_REST(restaurante*plato*especialidad) 6) El NOMBRE de los restaurantes para los cuales se cumple que su menu incluye platos que clasifican en alguna cocina tipica en la cual no se especializa el chef que cocina en el restaurante [Nico Cohen] (Donde dice "1.c_rest", el "1" hace referencia a todo lo que esta dentro del parentesis de la izquierda. No hago join natural porque no quiero que la igualdad incluya c_cocina [ Euge Liva ] πNOMBRE_REST(restaurante*(πNOMBRE_CHEF, C_COCINA(restaurante*plato) -πNOMBRE_CHEF, C_COCINA(restaurante*especialidad))) 7) La CLASE de ingredientes que participa en la composicion de todos los platos del circuito de restaurantes [Nico Cohen] (Resuelto de 2 maneras diferentes) [ Euge Liva ] ![]() [berta] idem Nico 8) El NOMBRE de los ingredientes que son utilizados, para la composicion de platos, por todos los chefs [Nico Cohen] ![]() [ Euge Liva ] Ídem Nico [berta] Es necesario plato? <-- [ Euge ] De nuevo, me parece que no. [Nico Cohen] Corregido 9) El NOMBRE de los ingredientes que participan, en la composicion de platos, en todas las cocinas tipicas [Nico Cohen] ![]() [ Euge Liva ] Ídem Nico [berta] idem Nico 10) Para cada uno de los restaurantes, el (o los) plato/s de su menu que en su composicion incluye/n todos los ingredientes que utilizan los platos de ese restaurante [Nico Cohen] La idea es traer todos los platos con todos los ingredientes para cada restaurante y restarlo a todos los platos con sus ingredientes para cada restaurante, esto nos va a dar todos los platos con los ingredientes que les faltan. (Dicho de otra forma, obtengo todos los platos que les faltan ingredientes) Finalmente resto todos los platos a los platos que les faltan ingredientes y voila!, obtengo todos los platos que no les faltan ingredientes (dicho de otra forma, obtengo todos los platos que tienen todos los ingredientes) [Nahuel Quevedo] ![]() (ojo, no sé si se puede usar el sigma como lo hice, pero no se me ocurre otra cosa) 11) La CATEGORIA de restaurantes donde se cocinan todos los platos mas caros del circuito de restaurantes [ Euge Liva ] ![]() [berta] ![]() Si en el lado izquierdo dejas solo CATEGOR, el divisor no puede actuar, ya que no tiene ninguna columna en comun con el dividendo (tenes que especificar la columna que te piden, + lo que está en el divisor, el resultado final hace desaparecer las columnas en comun entre el dividendo y el divisor, y deja en este caso CATEGOR solo, que es lo que se pide). Alguien opina igual? <-- Era para mí el comentario? Si era: No estoy dejando solo la columna CATEGOR, eso es lo que estoy sacando luego de hacer la división, mirá los paréntesis. Divido plato*restaurante con las columnas C_REST, PLATO# que corresponden al máximo en la tabla. Luego de dividir obtengo CATEGOR, no está bien eso? <-- Fixeado, gracias! [Nico Cohen] 12) La lista de ingredientes (NOMBRE_ING, UN_MED, CLASE) que participan, en la composicion de platos, en todas las cocinas tipicas en las que se especializa el chef PATO PLUMAS [ Euge Liva ] (Yo acá interpreto obtener los ingredientes que estén en TODOS los platos asociados a las cocinas tipicas de Pato Plumas, es correcto?) [Nico Cohen] Para mi no es correcto, porque del lado derecho estas poniendo todos los platos y el enunciado te pide que pongas todas las cocinas tipicasOK, entonces sí, me queda igual al tuyo. Elimino lo anterior para no confundir. [Nico Cohen] ![]() Detectar 3FN con SQL (Agregar aqui abajo las querys que vayan haciendo, con su respectivo [nombre y apellido]) [Euge] ¿Qué onda con esto? Ni idea de cómo puede ser un enunciado de este estilo... [Nico Cohen] Tendriamos que pensar una forma generica de encontrar alguna condicion que devuelva un registro que no cumpla con la 3FN Estudien bien las Formas Normales y tratemos de pensar alguna estrategia [Euge] En 3FN está cuando todos los atributos son atómicos, no hay dependencias parciales ni transitivas, no? [Ani ] Si, tiene que estar en 2da FN y a parte no tener dependencias transitivas. En la guia de la pagina esta bastante claro el ejemplo y la explicacion hasta 3 FN. ![]() Detectar 3FN con AR (Agregar aqui abajo las querys que vayan haciendo, con su respectivo [nombre y apellido]) ![]() Ejercicios de Normalización (Los que pasé por mail) (1) [Euge] (a) Está en 1FN ya que las claves son ABC, ABE y las siguientes dependencias violan la 2FN: AC->D (Derivada de AC->DE) E-F (b) La descomposición en FNBC, SPI me queda: R1(EF) R2(EG) R3(ACDE) R4(ABC) No estoy segura de esta descomposición. Cuando me levanto la vuelvo a chequear. ![]() EJERCITACION PROPUESTA TEORIA DE LAS DEPENDENCIAS FUNCIONALES. 1) Suponga que tenemos una base de datos para una firma de inversiones, que consiste de los siguientes datos: Sea R=(BOSQID) y F=(S->D,I->B,IS->Q,B->O) a) Encuentre una clave para el esquema de relación R (BOSQID). b) Cuántas claves tiene este esquema de relación? Pruebe su respuesta. c) Usando el algoritmo encuentre una descomposición de R en FNBC sin pérdida de información. Se preservaron las DF ? d) Encuentre una descomposición de R en 3FN, usando el algoritmo correspondiente, sin pérdida de información y que preserve las DF. e) Si se descompone el esquema R por proyección en los esquemas R1 (ISQD) y R2 (IBO). En qué forma normal se encuentra cada uno de ellos ? Qué anomalías y redundancias subsisten ?, Cuáles se resolvieron? La descomposición fue sin pérdida de información?, Se preservaron las DF ? f) Ídem para la descomposición SD IB ISQ y BO. [Euge] (a) La clave es IS [Nico Cohen] Idem [Ani] Idem (b) Una clave. [Nico Cohen] Idem [Ani] Idem (c) R1(SD) R2(IB) R3(IO) R4(ISQ), No, no se preservan las DF. B->O es la que no sobrevive. [Nico Cohen] Idem [Ani] Idem El conjunto Z final queda Z={B}, donde no aparece O. (d) Descomposición 3FN SPI, SPDF: R'=(SD,IB,ISQ,BO) [Ani] Idem (e) R1 está en 1FN porque las dependencias que afectan son: IS->Q, S->D donde S->D viola la 2FN. Presenta todas las anomalías. R2 está en 3FN porque las dependencias que afectan son: I->B, I->O y ambas cumplen que su LI (lado izquierdo) es superclave. No presenta anomalías. (f) La descomposición está en 3FN, sin pérdida de Informacion ni de dependencias funcionales. Es el resultado al que llegué en el ítem (d). No presenta anomalías. 3) Sea el esquema de relación R(ABCDE) y F=(A->BC,CD->E,B->D,E->A) a) Hallar todas las claves candidatas de R. Justificar. b) Sea R1 (A,B,C) y R2 (C,D,E). Es una descomposición de producto sin pérdida? Hubo pérdida de DF? Justifique. c) Ídem ítem c ejercicio 1. d) Ídem ítem d ejercicio 1. [Euge] (a) CC: A, E, BC, CD [Nico Cohen] Idem (b) Es SPI, (con un join vuelve a la original) pero no SPDF. Se pierde la dependencia: B->D [Nico Cohen] Idem (c) R1(BD, ABC, EA) No se conserva la dependencia CD->E (d) Descomposición SPI, SPDF: R'(ABC,CDE,BD,EA) 4) Sea el esquema de relación R (A,B,C,D) y F=(A->B,B->C,C->D,D->A) y la descomposición R1(A,B) ; R2(B,C) ; R3(C,D) a) Es una descomposición con pérdida de información? Justifique. b) Se conservaron las DF? Justifique. [Euge] (a) Es SPI. R=(R1*R2)*R3 (b) No es SPDF. La dependencia D->A no sobrevive. El conjunto Z final es Z={CD} donde no está incluido A. [Ani] no habria que iterar una vez mas sobre todos los esquemas R hasta que Z no cambie? Yo lo repeti una vez mas y me queda para i=3, el mismo Z que en i=2, entonces corte ahi ( queda Z ={CBD}, igual no esta incluido A ) 5) Dado el esquema R (A,B,C,D,E,F) y F=(A->BC,B->C,C->A,AD->E,AE->F,CD->E) a) Hallar fmín. b) Hallar todas las claves candidatas. Justificar. c) En que FN se encuentra r. Justificar. d) Descomponer al r en FNBC usando el algoritmo. Se conservaron las DF ? Justificar. e) Descomponer a r en 3FN usando el algoritmo correspondiente. La descomposición se encuentra en fnbc ? [Euge] (a) Fmin={A->B, B->C, C->A, AE->F, CD->E} (Ani) idem (b) CC: AD, BD, CD. <-- No sé si habrá alguna otra, me cansé de buscar, pero calculo que no...[Ani] Yo encontre las mismas. DUDA, hay que probar con todas las combinaciones de a 3 que no incluyan a las CC tambien no? ( igual probe bastantes combinaciones de a 3, y no sirven porque o incluyen alguna CC o no tienen D entonces no se puede determinar D). (c) Se encuentra en 2FN. La FNBC sólo la cumplen dos dependencias, ergo, no está en FNBC. No está en 3FN porque la dependencia AE->F viola 3FN por no ser AE una superclave ni LD ser atributo primo. Finalmente todas las dependencias cumplen 2FN. Los LD que dependen parcialmente de las claves son atributos primos, así que no hay problema. (d) Descomposición SPI: R1(AEF) R2(AB) R3(CA) R4(CDE). Es no SPDF. Se pierde la dependencia B->C (e) Descomposición 3FN SPI, SPDF: R'(AB,BC,CA,AEF,CDE) Acá se ve cómo aparece B->C en el segundo subconjunto BC. Están en FNBC. |