Download Aseveraciones Ejemplo de aseveración Disparadores Ejemplo de
Document related concepts
no text concepts found
Transcript
Aseveraciones Tema 4: Otros conceptos de diseño de bases de datos relacionales Aseveraciones Una aseveración es un predicado que expresa una condición que queremos que se cumpla siempre en la base de datos. Disparadores (triggers) Cuando se hace una aseveración, el sistema comprueba su Seguridad validez, y la comprueba de nuevo en cada actualización que puede violar la aseveración Autorización NORMALIZACIÓN + + + + + + + + + Esta comprobación puede introducir una sobrecarga importante; por Primera forma normal tanto las aseveraciones se deben utilizar con mucho cuidado. Problemas en el diseño lógico relacional Aseverar Dependencias funcionales para todo X, P(X) se consigue de manera indirecta con no existe X tal que no P(X) Descomposición Forma normal de Boyce-Codd Tercera forma normal Otras formas normales y dependencias multivaluadas Proceso global de diseño de bases de datos Bases de datos 1 Bases de datos Ejemplo de aseveración Disparadores La suma de todos los préstamos de cada sucursal debe ser Un disparador es una sentencia que se ejecuta menor que la suma de todos los saldos de cuentas de esa sucursal. automáticamente por el sistema como efecto lateral de una modificación de la base de datos. create assertion restriccion-suma check (not exists (select * from sucursal where (select sum(cantidad) from prestamo where prestamo.-nombre-sucursal = sucursal.nombre-sucursal) >= (select sum(saldo) from cuenta where cuenta.nombre-sucursal = sucursal. nombre-sucursal))) Bases de datos Para especificar un disparador debemos: + Especificar las condiciones par a su ejecución. + Especificar las acciones a realizar cuando se ejecuta. Los disparadores se introdujeron en el estándar SQL en SQL:1999, pero eran soportados antes por la mayoría de los gestores de bases de datos mediante sintaxis no estándar. 3 Ejemplo de disparador Bases de datos 4 Ejemplo de disparador en SQL:1999 Supongamos que en vez de permitir saldos de cuenta negativos, el banco trata los descubiertos de la siguiente manera: + poniendo el saldo de la cuenta a cero + creando un préstamo por la cantidad del descubierto + dando a ese préstamo un número de préstamo idéntico al número de cuenta de la cuenta al descubierto La condición para ejecutar el disparador será una actualización de la relación cuenta que dé lugar a un valor de saldo negativo. Bases de datos 2 5 create trigger descubierto after update on cuenta referencing new row as nrow for each row when nrow.saldo < 0 begin atomic insert into prestatario (select nombre-cliente, numero-cuenta from depositante where nrow.numero-cuenta = depositante.numero-cuenta); insert into prestamo values (n.row.numero-cuenta, nrow.nombre-sucursal, – nrow.saldo); update cuenta set saldo = 0 where cuenta.numero-cuenta = nrow.numero-cuenta end Bases de datos 6 Eventos y acciones de disparadores en SQL Los eventos de disparo pueden ser: insertar, eliminar o actualizar Disparadores a nivel de sentencia En vez de ejecutar una acción separada para cada fila afectada, se puede ejecutar una sola acción para todas las filas afectadas por una transacción Los disparadores sobre actualizaciones se pueden restringir a determinados atributos + Utilizar for each statement en vez de for each row + P.e. create trigger descubierto after update of saldo on cuenta Se pueden referenciar los valores anteriores y posteriores a una actualización Los disparadores se pueden activar antes de un evento, con lo que pueden servir como restricciones adicionales. + Utilizar referencing old table o referencing new table para referirse a tablas temporales (llamadas tablas de transición) que contengan las filas afectadas + Puede ser más eficiente cuando tratamos sentencias SQL que afectan a muchas filas P.e. convertir blancos a nulos: create trigger ponernulos before update on r referencing new row as nrow for each row when nrow.numero-telefono= ‘ ‘ set nrow.numero-telefono= null Bases de datos 7 Bases de datos 8 Seguridad Seguridad (Cont.) + Nivel físico Seguridad – protección frenet a intentos maliciosos de robar o modificar datos. El acceso físico a los servidores permite que los intrusos destruyan datos; se necesita seguridad física tradicional + Nivel de sistema de bases de datos Las máquinas deben protegerse también contra líquidos, fuego, Mecanismos de autentificación y autorización permiten a etc. determinados usuarios acceder sólo a los datos requeridos + Nivel humano + Nivel de sistema operativo Nos debemos asegurar de que los usuarios no den acceso a ¡Los superusuarios del sistema operativo pueden hacer cualquier cosa en las bases de datos! Se necesita una buena seguridad a nivel de sistema operativo. intrusos Uso adecuado de password + Nivel de red: debemos utilizar cifrado para prevenir “Escuchas” (lecturas no autorizadas de mensajes) Suplantaciones (pretender ser un usuario autorizado o enviar mensajes supuestamente de usuarios autorizados) Bases de datos 9 Bases de datos Autorización Autorización (Cont.) Formas de autorización sobre partes de la base de datos: Autorización de lectura – se permite leer, pero no modificar los datos. Autorización de inserción – se permite introducir nuevos datos, pero no modificar los existentes. Formas de autorización para modificar el esquema de la base de datos: Autorización de índexado – se permite crear y eliminar índices. Autorización de recursos – se permite crear nuevas relaciones. Autorización de alteración – se permite añadir o eliminar atributos Autorización de actualización – se permite modificar, pero no de una relación. borrar datos. Autorización de borrado – se permite borrar relaciones. Autorización de eliminación – se permite eliminar datos. Bases de datos 10 11 Bases de datos 12 Autorización y vistas Ejemplo de vista Los usuarios pueden obtener autorizaciones sobre vistas, sin Supongamos que un cajero necesita conocer los nombres de los tener ninguna autorización sobre las relaciones utilizadas en la definición de la vista clientes de cada sucursal, pero no está autorizado para ver información específica sobre los créditos. + Aproximación: Denegar el acceso directo a la relación prestamo, La característica de las vistas de ocultar datos sirve tanto para pero permitir el acceso a la vista cliente-prestamo, que está formada solamente por los nombres de los clientes y las sucursales en las que tienen un préstamo. simplificar el uso del sistema como para aumentar la seguridad permitiendo a los usuarios que sólo accedan a los datos que necesitan para su trabajo + La vista cliente-prestamo en SQL se define así: Se puede utilizar una combinación de seguridad a nivel relacional y seguridad a nivel de vista para limitar los accesos de los usuarios a los datos que necesitan. Bases de datos 13 create view cliente-prestamo as select nombre-sucursal, nombre-cliente from prestatario, prestamo where prestatario.numero.prestamo = prestamo.numeroprestamo Bases de datos Ejemplo de vista (Cont.) 14 Autorización sobre vistas El cajero estará autorizado a ver el resultado de la consulta: La creación de vistas no requiere autorización de recursos dado select * from cliente-prestamo que no se está creando ninguna relación real El creador de la vista obtiene solo aquellos privilegios que Cuando el procesador de consultas transforme el resultado en una consulta de las relaciones de la base de datos, obtendremos una consulta sobre prestatario y prestamo. Las autorizaciones se deben comprobar sobre la consulta del P.e. si el creador de la vista cliente-prestamo sólo tenía cajero antes de que el procesador de consultas reemplace una vista por la definición de la vista. Bases de datos suponen que no exista autorización adicional sobre la que ya tenía. autorización de lectura sobre prestatario y prestamo, sólo obtiene autorización de lectura sobre cliente-prestamo 15 Concesión de privilegios Bases de datos 16 Grafo de concesión de privilegios El paso de autorización de un usuario a otro se puede representar mediante un grafo de autorización. Requisito: Todas las flechas de un grafo de autorización deben partir de un camino que tenga su origen en el administrador de bases de datos Los nodos del grafo representan usuarios. Si el DBA revoca el privilegio para U1: La raíz del grafo es el administrador de la base de datos. + Se debe revocar la concesión de U4 dado que U1 ya no tiene autorización Consideremos el grafo para autorizaciones de actualización + No se debe revocar la autorización de U5 dado que U5 tiene otro camino de sobre prestamo. autorización desde DBA a través de U2 Una flecha Ui →Uj indica que el usuario Ui ha concedido Se deben prevenir ciclos de concesiones sin camino desde la raíz: autorización de actualización sobre prestamo a Uj. U1 + DBA concede autorización a U7 + U7 concede autorización a U8 U4 + U8 concede autorización a U7 + DBA revoca la autorización a U7 DBA Bases de datos U2 U3 + Se debe revocar la concesión de U7 a U8 y de U8 a U7 dado que no queda ningún camino desde DBA a U7 o a U8. U5 17 Bases de datos 18 Roles Los roles permiten especificar sólo una vez privilegios comunes a varios usuarios. Los privilegios se conceden o revocan a los roles igual que para usuarios individuales Los roles se pueden asignar a usuarios o a otros roles SQL:1999 soporta roles NORMALIZACIÓN create role cajero create role gestor grant select on sucursal to cajero grant update (saldo) on cuentas to cajero grant all privileges on cuentas to gestor grant cajero to gestor grant cajero to alicia, juan grant gestorr to ana Bases de datos 19 Primera forma normal Bases de datos Manuel Ramos Cabrer 20 Problemas en el diseño lógico relacional Un dominio es atómico si sus elementos se pueden considerar unidades indivisibles El diseño de bases de datos relacionales requiere encontrar un “buen” conjunto de esquemas de relación. Un mal diseño puede dar lugar a: + Ejemplos de dominios no atómicos: Nombres, atributos compuestos + Repetición de información (redundancia) Números de identificación como 305010789 que se pueden + Imposibilidad de representar cierta información. dividir en partes Objetivos de diseño: Un esquema relacional R esté en primera forma normal si los dominios de todos los atributos de R son atómicos + Evitar la redundancia Los valores no atómicos complican el almacenamiento y dan + Asegurar que se representan las asociaciones entre lugar a redundancia atributos + Facilitar la comprobación de las violaciones de + P.e. Conjunto de cuentas almacenado con cada cliente, y conjunto restricciones de integridad en las actualizaciones de las bases de datos. de propietarios almacenado con cada cuenta + Vamos a asumir que todas las relaciones están en primera forma normal Bases de datos 21 Bases de datos Ejemplo 22 Descomposición Consideremos el siguiente esquema de relación: Esquema-prestamo = (nombre-sucursal, ciudad-sucursal, activos, nombre-cliente, numero-prestamo, cantidad) nombresucursal ciudadsucursal Vigo Vigo Santiago Santiago Madrid-1 Vigo activos nombrecliente numeroprestamo 9000000 Sánchez L-17 1000 2100000 Gómez L-23 2000 Madrid 1700000 López L-15 1500 Vigo 9000000 Veiga L-14 1500 Descompongamos el esquema de relación Esquema-prestamo en: Esquema-sucursal = (nombre-sucursal, ciudad-sucursal, activos) cantidad Esquema-info-prestamo = (nombre-cliente, numero-cliente, nombre-sucursal, cantidad) Todos los atributos del esquema original (R) deben aparecer en la descomposición (R1, R2): Redundancia: + Los datos de nombre-sucursal, ciudad-sucursal, activos se repiten para cada préstamo que hace una sucursal + Gasto de espacio + Se complica la actualización, introduciendo la posibilidad de inconsistencias R = R1 ∪ R2 Descomposición reversible por join Para todas las posibles relaciones r en el esquema R r = ∏R1 (r) Valores nulos: ∏R2 (r) + No se puede almacenar información sobre una sucursal si no existen préstamos + Se pueden utilizar valores nulos, pero son difíciles de gestionar. Bases de datos 23 Bases de datos 24 Ejemplo de descomposición no reversible por join Objetivo — Una teoría para: Decidir cuando una determinada relación R está en un “estado adecuado”. Descomposición de R = (A, B) R1 = (A) R2 = (B) En el caso de que la relación R no sea “buena”, descomponerla en un conjunto de relaciones {R1, R2, ..., Rn} tales que A B α α β α β 1 2 Nuestra teoría está basada en: ∏A(r) ∏B(r) + Dependencias funcionales 1 2 1 r ∏A (r) + Cada relación esté en “estado adecuado” A B ∏B (r) A B α α β β 1 2 1 2 Bases de datos + La descomposición sea reversible por join + Dependencias multivaluadas 25 Dependencias funcionales Bases de datos 26 Dependencias funcionales (Cont.) Dado un esquema de relación R Restricciones sobre el conjunto de relaciones permitidas en un α⊆R y β⊆R conjunto relación. La dependencia funcional Introducen como restricción que el valor de un conjunto determinado de atributos determina de manera única el valor de otro conjunto de atributos. El concepto de dependencia funcional es una generalización del concepto de clave. α→β se da en R si y solo si para cualquier relación legal r(R), cuando dos tuplas cualquiera t1 y t2 de r coinciden en los valores de los atributos α, entonces también coinciden en lso valores de los atributos β. Es decir, t1[α] = t2 [α] ⇒ t1[β ] = t2 [β ] Ejemplo: Consideremos r(A,B) con la siguiente instancia de r. 1 1 3 4 5 7 En esta instancia, A → B NO se da, pero B → A si. Bases de datos 27 Dependencias funcionales (Cont.) Bases de datos 28 Uso de Dependencias Funcionales K es una superclave del esquema de relación R si y solo si K → R K es una clave candidata de R si y solo si Utilizamos dependencias funcionales para:: + Comprobar las relaciones para ver si son legales bajo un conjunto dado de dependencias funcionales. + K → R, y + Para ningún α ⊂ K, α → R Si una relación r es legal bajo un conjunto F de dependencias Las dependencias funcionales nos permiten expresar restricciones que no se pueden expresar mediante superclaves. Consideremos el esquema: Esquema-info-prestamo = (nombre-cliente, numero-prestamo, nombre-sucursal, cantidad). Debemos esperar que se cumplan las siguientes dependencias funcionales: numero-prestamo → cantidad numero-prestamo → nombre-sucursal pero debemos esperar que no se cumpla: funcionales, decimos que r satisface F. + Especificar restricciones sobre un conjunto de relaciones legales Decimos que F se da en R si todas las relaciones legales sobre R satisfacen el conjunto de dependencias funcionales F. Nota: Una instancia específica de un esquema de relación puede satisfacer una dependencia funcional aun cuando la dependencia funcional no se dé en todas las instancias legales. + Por ejemplo, una instancia específica de Esquema-prestamo puede, por tanto, satisfacer numero-prestamo → nombre-cliente. numero-prestamo → nombre-cliente Bases de datos 29 Bases de datos 30 Cierre de un conjunto de dependencias funcionales Dependencias funcionales (Cont.) Una dependencia funcional es trivial si se satisface para todas Dado un conjunto F de dependencias funcionales, hay otras las instancias de una relación dependencias funcionales que se pueden inferir de F. + P.e. Si A → B y B → C, entonces podemos inferir que A → C + P.e. nombre-cliente, numero-prestamo → nombre-cliente El conjunto de todas las dependencias funcionales que se pueden inferir de F forman el cierre de F. nombre-cliente → nombre-cliente + En general, α → β es trivial si β ⊆ α Denotaremos el cierre de F por F+. Podemos calcular F+ aplicando los Axiomas de Armstrong: + si β ⊆ α, entonces α → β (reflexividad) + si α → β, entonces γ α → γ β (aumentación) + si α → β, y β → γ, entonces α → γ (transitividad) Estas reglas son + consistentes (generan solo dependencias funcionales que se dan) y + completas (generan todas las dependencias funcionales que se dan) Bases de datos 31 Bases de datos 32 Procedimiento de cálculo de F+ Ejemplo R = (A, B, C, G, H, I) Para calcular el cierre de un conjunto de dependencias F={ A→B A→C CG → H CG → I B → H} funcionales F: F+ = F repetir para cada dependencia funcional f en F+ aplicar las reglas de reflexividad y aumentación a f añadir las dependencias funcionales resultantes a F+ para cada par de dependencias funcionales f1y f2 en F+ si f1 y f2 se pueden combinar por transitividad entonces añadir la dependencia funcional resultante a F+ + hasta que F no cambie Algunos miembros de F+ + A→H Por transitividad de A → B y B → H + AG → I por aumentación de A → C con G, que da AG → CG y después por transitividad con CG → I + CG → HI de CG → H y CG → I : la “regla de la unión” se puede inferir de – La definición de dependencia funcional, o – Por aumentación de CG → I para inferir CG → CGI, aumentación de CG → H para inferir CGI → HI, y entonces transitividad Bases de datos 33 Cierre de dependencias funcionales (Cont.) Bases de datos 34 Cierre de un conjunto de atributos Dado un conjunto de atributos α, definimos el cierre de α bajo F (denotado por α+) como el conjunto de atributos funcionalmente determinados por α bajo F: α → β está en F+ ➳ β ⊆ α+ Podemos simplificar el cálculo manual de F+ utilizando las siguientes reglas adicionales. + Si α → β se da y α → γ se da, entonces α → β γ se da (unión) + Si α → β γ se da, entonces α → β se da y α → γ se da Algoritmo para calcular α+, el cierre de α bajo F resultado := α; mientras (cambie resultado) hacer para cada β → γ en F hacer begin si β ⊆ resultado entonces resultado := resultado ∪ γ end (decomposición) + Si α → β se da y γ β → δ se da, entonces α γ → δ se da (pseudotransitividad) Estas reglas (y otras) se pueden inferir de los axiomas de Armstrong. Bases de datos 35 Bases de datos 36 Ejemplo de cierre de un conjunto de atributos R = (A, B, C, G, H, I) Utilidad del cierre de atributos Hay varias utilidades del algoritmo de cierre de atributos F = {A → B A→C CG → H CG → I B → H} (AG)+ Comprobar una superclave: + Para comprobar si α es una superclave, calculamos α+, y comprobamos si α+ contiene todos los atributos de R. Comprobar dependencias funcionales 1. resultado = AG + Para comprobar si una dependencia funcional α → β se da (o, en 2. resultado = ABCG (A → C y A → B) 3. resultado = ABCGH (CG → H y CG ⊆ AGBC) 4. resultado = ABCGHI (CG → I y CG ⊆ AGBCH) otras palabras, está en F+), se comprueba si β ⊆ α+. + Es decir, calculamos α+ utilizando el cierre de atributos, y entonces comprobamos si contiene β. ¿AG es una clave candidata? + Es una comprobación simple y poco costosa, y muy útil 1. ¿AG es una superclave? Cálculo del cierre de F 1. ¿AG → R? == (AG)+ ⊇ R + Para cada γ ⊆ R, buscamos el cierre γ+, y para cada S ⊆ γ+, 2. ¿Algún subconjunto de AG es una superclave? generamos la dependencia funcional γ → S. 1. ¿A → R? == (A)+ ⊇ R 2. ¿G → R? == (G)+ ⊇ R Bases de datos 37 Bases de datos 38 Descomposición Objetivos de la normalización Decidir cuando una determinada relación R está en un “estado Descompongamos el esquema de relación Esquema-prestamo en: Esquema-sucursal = (nombre-sucursal, ciudad-sucursal, activos) adecuado”. En el caso de que la relación R no sea “buena”, descomponerla en un conjunto de relaciones {R1, R2, ..., Rn} tales que Esquema-info-prestamo = (nombre-cliente, numero-cliente, nombre-sucursal, cantidad) Todos los atributos del esquema original (R) deben aparecer en la descomposición (R1, R2): Descomposición reversible por join Para todas las posibles relaciones r en el esquema R Una descomposición de R en R1 y R2 es reversible por join si y sólo si al menos una de las siguientes dependencias funcionales está en F+: + Cada relación esté en “estado adecuado” + La descomposición sea reversible por join R = R1 ∪ R2 Nuestra teoría está basada en: + Dependencias funcionales + Dependencias multivaluadas r = ∏R1 (r) ∏R2 (r) + R1 ∩ R2 → R1 + R1 ∩ R2 → R2 Bases de datos 44 Ejemplo de descomposición no reversible por join Bases de datos 45 Normalización utilizando dependencias funcionales Cuando descomponemos un esquema de relación R Las descomposiciones no reversibles por join dan lugar a alteraciones de la información. Ejemplo: Descomposición de R = (A, B) R2 = (B) R1 = (A) con un conjunto de dependencias funcionales F en R1, R2,.., Rn queremos: + Descomposición reversible por join: Si no la descomposición puede A B A B α α β α β 1 2 ∏A(r) ∏B(r) 1 2 1 r ∏A (r) Bases de datos ∏B (r) A B α α β β 1 2 1 2 suponer alteraciones de la información. + Sin redundancia. + Preservación de dependencias: Dado Fi como el conjunto de dependencias F+ que incluya sólo atributos de Ri. La descomposición debería preservar las dependencias, es decir, (F1 ∪ F2 ∪ … ∪ Fn)+ = F+ Si no perdemos dependencias, que son restricciones introducudas en la fase de diseño para modelar adecuadamente la aplicación. No es deseable. 46 Bases de datos 47 Comprobación de preservación de dependencias Ejemplo Para comprobar si una dependencia α→β se preserva en una R = (A, B, C) descomposición de R en R1, R2, …, Rn aplicamos la siguiente comprobación simplificada (con el cierre de atributos realizado respecto a F) F = {A → B, B → C) + Se puede descomponer de dos maneras diferentes R1 = (A, B), R2 = (B, C) + resultado = α while (cambie resultado) do for each Ri en la descomposición t = (resultado ∩ Ri)+ ∩ Ri resultado = resultado ∪ t + Descomposición reversible por join: R1 ∩ R2 = {B} y B → BC + Preserva las dependencias + Si resultado contiene todos los atributos de β, entonces se preserva la R1 = (A, B), R2 = (A, C) dependencia funcional α → β. + Descomposición reversible por join: Debemos aplicar el test a todas las dependencias de F para R1 ∩ R2 = {A} y A → AB comprobar si la descomposición preserva las dependencias + No preserva las dependencias Este procedimiento tiene una complejidad temporal polinomial, (se pierde B → C) Bases de datos frente a la complejidad exponencial de calcular F+ y (F1 ∪ F2 ∪ … ∪ Fn)+ 48 Bases de datos Forma Normal de Boyce-Codd 49 Ejemplo Un esquema de relación está en FNBC con respecto a un conjunto de dependencias funcionales F si para todas las dependencias funcionales de F+, α → β, donde α ⊆ R y β ⊆ R, se cumple al menos una de las siguientes condiciones: R = (A, B, C) F = {A → B B → C} Clave = {A} R no está en FNBC α α → β es trivial (es decir, β ⊆ α) Descomposición R1 = (A, B), R2 = (B, C) es una superclave de R + R1 y R2 en FNBC + Reversible por join + Preserva las dependencias Bases de datos 50 Comprobación de la FNBC Bases de datos 51 Algoritmo de descomposición en FNBC Para comprobar si una dependencia no trivial α →β cumple la FNBC 1. calcular α+ (el cierre de atributos de α), y 2. verificar que incluye todos los atributos de R, es decir, es una superclave de R. Comprobación simplificada: Para comprobar si un esquema de relación R está en FNBC, es suficiente comprobar las dependencias del conjunto F, en vez de comprobar todas las dependencias de F+. + Si ninguna de las dependencias de F viola la FNBC, entonces ninguna de las dependencias de F+ violará la FNBC. Pero, es incorrecto utilizar sólo F cuando se comprueba una relación de una descomposición de R + P.e. Consideremos R (A, B, C, D), con F = { A →B, B →C} resultado := {R}; hecho := false; calcular F+; while (not hecho) do if (hay un esquema Ri en resultado que no está en FNBC) then begin dada una dependencia funcional no trivial α → β que se da en Ri tal que α → Ri no está en F+, y α ∩ β = ∅; resultado := (resultado – Ri ) ∪ (Ri – β) ∪ (α, β ); end else hecho := true; Nota: cada Ri está en FNBC, y la descomposición es sin pérdidas. Descomponemos R en R1(A,B) y R2(A,C,D) Ninguna de las dependencias de F contiene sólo atributos de (A,C,D) por eso podríamos cometer el error de pensar que R2 está en FNBC. De hecho, la dependencia A → C de F+ indica que R2 no está en FNBC. Bases de datos 52 Bases de datos 53 Ejemplo de descomposición en FNBC R = (nombre-sucursal, ciudad-sucursal, activos, Comprobación de descomposición en FNBC Para comprobar si una relación Ri de una descomposición de R está en nombre-cliente, numero-prestamo, cantidad) FNBC, F = {nombre-sucursal → activos ciudad-sucursal + o bien comprobar si Ri está en FNBC con respecto a la restricción de F a Ri (es decir, todas las DFs de F+ que contienen sólo atributos de Ri) numero-prestamo → cantidad nombre-sucursal} + o utilizar el conjunto original de dependencias F que se dan en R, pero con la Clave = {numero-prestamo, nombre-cliente} siguiente comprobación: Decomposición – para cada conjunto de atributos α ⊆ Ri, comprobar que α+ (el cierre de atributos de α) o bien no incluye ningún atributo de Ri- α, o incluye todos los atributos de Ri. + R1 = (nombre-sucursal, ciudad-sucursal, activos) + R2 = (nombre-sucursal, nombre-cliente, numero-prestamo, Si la condición se viola por algún α → cantidad) α → (α+ - α ) ∩ Ri se da en Ri, y Ri viola la FNBC. + R3 = (nombre-sucursal, numero-prestamo, cantidad) β de F, la dependencia Utilizaremos la dependencia anterior para descomponer Ri + R4 = (nombre-cliente, numero-prestamo) Descomposición final R1, R3, R4 Bases de datos 54 FNBC y preservación de dependencias Bases de datos 55 Tercera Forma Normal: Motivación Hay algunas situaciones en las que No siempre es posible llegar a una descomposición en FNBC que preserve las dependencias + La FNBC no preserva las dependencias Solución: definir una forma normal más débil, denominada Tercera R = (J, K, L) Forma Normal. F = {JK → L L → K} Dos claves candidatas = JK y JL + Permite cierta redundancia (con los problemas consabidos) + Pero siempre existe una descomposición a 3FN que es reversible por join y que preserva las dependencias: R no está en FNBC Cualquier descomposición de R no preserva JK → L Bases de datos 56 Bases de datos 57 Tercera Forma Normal 3FN (Cont.) Un esquema de relación R está en tercera forma normal (3FN) si para todas las: Ejemplo + R = (J, K, L) α → β de se cumple am menos una de las siguientes condiciones: F+ F = {JK → L, L → K} + Dos claves candidatas: JK y JL + α → β es trivial (es decir, β ⊆ α) + R está en 3FN + α es una superclave de R JK → L L→K + Cada atributo A de β – α está contenido en una clave candidata de R. La descomposición en FNBC da (JL) y (LK) (NOTA: cada atributo puede estar en una clave candidata diferente) Se pierde JK → L Si una relación está en FNBC entonces también está en 3FN (dado que en FNBC se debe dar una de las dos primeras condiciones). La tercera condición es una relajación mínima de la FNBC que asegura la preservación de dependencias funcionales. Bases de datos JK es una superclave K está contenida en una clave candidata Hay cierta redundancia en este esquema 58 Bases de datos 59 Comprobación de la 3FN Algoritmo de descomposición a 3FN Dado el conjunto de dependencias funcionales F; i := 0; for each dependencia funcional α → β de F do if ninguno de los esquemas Rj, 1 ≤ j ≤ i contiene α β then begin i := i + 1; Ri := α β end if ninguno de los esquemas Rj, 1 ≤ j ≤ i contiene una clave candidata de R then begin i := i + 1; Ri := cualquier clave candidata de R; end return (R1, R2, ..., Ri) Optimización: Sólo es necesario comprobar las dependencias funcionales de F, no todas las de F+. Utilizar el cierre de atributos para comprobar en cada dependencia α → β, si α es una superclave. Si α no es superclave, tenemos que verificar si cada atributo de β está contenido en una clave candidata de R + Esta comprobación es bastante más costosa, dado que supone encontrar las claves candidatas + Se ha demostrado que comprobar la 3FN es NP-hard + Por suerte, descomponer a 3FN se puede hacer con una complejidad polinomial Bases de datos 60 Bases de datos 61 Ejemplo Algoritmo de descomposición a 3FN (Cont.) El algoritmo anterior asegura: Esquema de relación: + que cada esquema de relación Ri está en 3FN Esquema-info-banquero = (nombre-sucursal, nombre-cliente, nombre-banquero, numero-despacho) + La descomposición es reversible por join y preserva las dependencias Las dependencias funcionales para este esquema de relación son: nombre-banquero → nombre-sucursal numero-despacho nombre-cliente nombre-oficina → nombre-banquero La clave es: {nombre-cliente, nombre-sucursal} Bases de datos 62 Bases de datos Aplicando 3FN a Esquema-info-banquero 63 Comparación de FNBC y 3FN Siempre es posible descomponer una relación en relaciones en El bucle for del algoritmo hace que incluyamos los 3FN y siguientes esquemas en nuestra descomposición: Esquema-despacho-banquero = (nombre-banquero, nombre-oficina, numero-despacho) Esquema-banquero = (nombre-cliente, nombre-sucursal, nombre-banquero) + La descomposición es reversible por join + Se preservan las dependencias Siempre es posible descomponer una relación en relaciones en FNBC y + La descomposición es reversible por join + Puede que no se preserven las dependencias Dado que Esquema-banquero contiene una clave candidata para Esquema-info-banquero, hemos terminado el proceso de descomposición. Bases de datos 64 Bases de datos 65 Comparación de FNBC y 3FN (Cont.) Objetivos de diseño El objetivo de un diseño de base de datos relacional es: Ejemplo de problemas debidos a la redundancia en la 3FN + FNBC. + R = (J, K, L) F = {JK → L, L → K} + Descomposición reversible por join. J L K j1 l1 k1 j2 l1 k1 j3 l1 k1 null l2 k2 + Preservación de dependencias. Si no se puede conseguir, podemos aceptar + o bien perder la preservación de dependencias, + o bien la existencia de redundancia debida al uso de la 3FN (suele ser la opción preferible) Sorprendentemente, SQL no proporciona un mecanismo directo de especificar dependencias funcionales distintas de las superclaves. Se pueden especificar DFs como aseveraciones, pero son costosas de comprobar Un esquema que está en 3FN pero no en FNBC tiene problemas de Aunque tengamos una descomposición que preserve las dependencias, Repetición de información (p.e., la asociación l1, k1) utilizando SQL no podremos comprobar de manera eficiente una dependencia funcional cuya parte izquierda no sea una clave. Necesidad de utilizar valores nulos (p.e., para representar la asociación l2, k2 que no tiene valor para J). Bases de datos 66 Bases de datos Otras formas normales 67 Dependencias multivaluadas Existen otras formas normales que es deseable que Dado un esquema de relación R y dados α ⊆ R y β ⊆ R. La dependencia multivaluada se den en una relación: Cuarta Forma Normal (4FN), Quinta Forma Normal (5FN), … α →→ β se da en R si en cualquier relación posible r(R), para todos los pares de tuplas t1 y t2 de r tales que t1[α] = t2 [α], existen en r las tuplas t3 y t4 tales que: La 3FN es la forma ideal en lo referente a dependencias funcionales. ¿Por qué existen entonces otras formas normales? t1[α] = t2 [α] = t3 [α] = t4 [α] t3[β] = t1 [β] t3[R – β] = t2[R – β] t4 [β] = t2[β] t4[R – β] = t1[R – β] + Pues porque pueden existir otras dependencias en una base de datos además de las dependencias funcionales, aunque estas últimas son las más habituales. + Las dependencias no funcionales más habituales son las dependencias multivaluadas. Bases de datos 68 Bases de datos Dependencias multivaluadas (Cont.) Representación gráfica de α →→ β 69 Dependencias multivaluadas Definición alternativa: t1 α a1 … ai β ai+1 … aj R- α- β aj+1 … an t2 t3 a1 … ai a1 … ai bi+1 … bj ai+1 … aj bj+1 … bn bj+1 … bn t4 a1 … ai bi+1 … bj aj+1 … an + Dado un esquema de relación R con un conjunto de atributos particionado en tres subconjuntos no vacíos Y, Z, W + Decimos que Y →→ Z (Y multidefine a Z) si y sólo si para todas las relaciones posibles r(R) si < y1, z1, w1 > ∈ r y < y2, z2, w2 > ∈ r entonces < y1, z1, w2 > ∈ r y < y2, z2, w1 > ∈ r Bases de datos 70 Bases de datos 71 Proceso global de diseño de bases de datos El modelo E-A y la normalización Cuando un diagrama E-A se diseña adecuadamente, identificando Hemos asumido que un esquema R viene dado por + R puede haber sido generado por el paso de un diagrama E-A a un conjunto de relaciones. + R puede ser una única relación que contiene todos los atributos de interés (se denomina relación universal). + La normalización divide R en relaciones más pequeñas. + R puede ser el resultado de algún otro proceso de diseño de relaciones, el cual comprobamos/convertimos a forma normal. todas las entidades correctamente, las relaciones generadas a partir del diagrama E-A no deberían necesitar normalización adicional. No obstante, en un diseño real (imperfecto) puede haber dependencias funcionales desde atributos que no sean clave de una entidad hacia otros atributos de la entidad. P.e. La entidad empleado con atributos numero-despacho y localizacion-despacho, y una dependencia funcional numero-despacho → localización-despacho + En un buen diseño se debería haber creado una entidad despacho Es posible encontrar dependencias funcionales desde atributos de un conjunto asociación que no sean clave, pero no es frecuente --- la mayoría de los conjuntos asociación son binarios Bases de datos 72 Bases de datos 73 Otros aspectos de diseño La normalización no se ocupa de algunos aspectos del diseño de bases de datos. Ejemplos de malos diseños de bases de datos que se deben evitar: En vez de beneficios(id-empresa, año, cantidad), utilizar + beneficios-2000, beneficios-2001, beneficios-2002, etc., todos con el esquema (id-empresa, beneficios). Fin del tema 4 Las relaciones anteriores están en FNBC, pero hacer consultas que afecten a varios años es difícil y además se necesita una tabla nueva para cada año. + empresa-año(id-empresa, beneficios-2000, beneficios-2001, beneficios-2002) También está en FNBC, pero también es difícil hacer consultas que afecten a varios años y necesita un atributo nuevo cada año. Es un ejemplo de una tabla cruzada, en la que los valores de un atributo se utilizan como nombres de columnas. Se utiliza sobre todo en hojas de cálculo, y en herramientas de análisis de datos. Bases de datos 74 Bases de datos Manuel Ramos Cabrer 75