Tema 5: Diseño de Bases de Datos Fernando Cano Espinosa Juan David González Cobas Universidad de Oviedo. Departamento de Informática fanouniovi.es , obasuniovi.es Curso 2009-2010 Produced with LATEX seminar style & PSTricks 1 C ONTENIDO 1. Introducción: un pequeño ejemplo 2. Anomalías 3. Descomposiciones 4. Normalización C ONTENIDO 2 I NTRODUCCIÓN Vamos a proponer un ejemplo que consiste en una base de datos que contendrá información sobre alumnos, asignaturas, notas y profesores. Las restricciones de las que partimos son las siguientes: • Un alumno sólo tiene asignado un profesor por asignatura • Un alumno obtiene una única nota por asignatura • Un profesor sólo puede dar clase de una asignatura I NTRODUCCIÓN 3 Podríamos plantearnos mantener todos los datos en una única tabla. Utilizaremos el siguiente ejemplo: Alumno Asignatura Profesor Nota Luis Física Newton 5 Luis Filosofía Kant 7 Carlos Física Einstein 6 Marta Física Newton 5 Pepe Filosofía Kant 4 Llamaremos a este esquema R(T, L), siendo T el conjunto de atributos y L el conjunto de restricciones expresadas como dependencias funcionales. I NTRODUCCIÓN 4 R(T, L) : T = {Alumno, Asignatura, Profesor, Nota} L= {Alumno Asignatura → Profesor, Alumno Asignatura → Nota, Profesor → Asignatura} Los pares (Alumno,Asignatura) y (Alumno, Profesor) son claves candidatas. I NTRODUCCIÓN Alumno Profesor → Asignatura ∈ L+ Alumno Profesor → Nota ∈ L+ 5 A NOMALÍAS • Repetición de Información. El problema fundamental de la repetición de información no es el desperdicio de espacio sino otros problemas derivados del mantenimiento de información repetida, que enumeramos a continuación. • Anomalías en la inserción y en la actualización. Al insertar una fila nueva (en SQL, INSERT) o actualizar una ya existente (en SQL, UPDATE), tendremos que comprobar que la información que introducimos es consistente. Por ejemplo, comprobar la restricción Profesor→Asignatura. A NOMALÍAS 6 • Anomalías en el borrado El problema que se nos presenta aquí no es un problema de inconsistencia, sino de pérdida de información. • Representación de Información. Este problema está íntimamente ligado al anterior y se basa en que nuestro esquema no nos permite guardar algunos hechos. A NOMALÍAS 7 • Imposición de las restricciones. Imponer la restricción de que un alumno sólo tiene un profesor por asignatura resulta tan sencillo como el declarar (Alumno, Asignatura) como clave primaria. Sin embargo, garantizar el cumplimiento de las DFs cuya parte izquierda no es clave candidata no es así de sencillo. Por ejemplo, comprobar la dependencia Profesor→Asignatura requeriría establecer en SQL un check como este: alter table R add onstraint PRO_ASIG hek (not exists ( selet profesor from R group by profesor having ount(distint asignatura) > 1)); A NOMALÍAS 8 – Otra solución podría ser evitar que se inserten o actualicen tuplas que contradigan la restricción mediante triggers. – En cualquier caso, nos vemos obligados a agregar más código, lo que es posiblemente innecesario y ralentiza la ejecución de nuestras modificaciones a la base de datos. A NOMALÍAS 9 • Ante este tipo de anomalías, una solución consiste en descomponer nuestro esquema original en varios subesquemas de forma que dichas anomalías se eviten. • Este proceso se conoce como normalización. • No siempre es posible encontrar una descomposición que elimine todas las posibles anomalías. En algunos casos, la normalización resuelve ciertos problemas, pero introduce otros. A NOMALÍAS 10 Descomposiciones • Sea R un esquema de relación. Un conjunto {R1 , R2 , . . . , Rn } de esquemas de relación es una descomposición de R si n [ Ri = R (1) i=1 • En la práctica, cuando descomponemos un esquema en un conjunto de subesquemas, incluimos en éstos atributos comunes. El objetivo de esto es poder recuperar posteriormente la información que se ha guardado en distintas tablas a través de operaciones de join. A NOMALÍAS 11 • Vamos a ver cómo una descomposición puede resolver algunos de los problemas mencionados en la sección anterior. • La propuesta es dividir nuestro esquema R(T, L) en dos subesquemas R1 (T1 , L1 ) y R2 (T2 , L2 ). A NOMALÍAS 12 R1 A NOMALÍAS Alumno Asignatura Nota Luis Física 5 Luis Filosofía 7 Carlos Física 6 Marta Física 5 Pepe Filosofía R2 4 Profesor Asignatura Newton Física Kant Filosofía Einstein Física 13 • Es evidente que esta descomposición nos resuelve algunos problemas: se repite menos información; a un profesor sólo se le puede asignar una asignatura (profesor es la clave primaria de R2 ); y podemos guardar información de la asignatura que imparte cada profesor aunque no tengamos alumnos matriculados. • Pero nos aparece un problema nuevo: ya no sabemos qué profesor tiene cada alumno en una determinada asignatura. A NOMALÍAS 14 • Este problema se conoce con el nombre de descomposición con pérdida de información, generalmente denominado como lossy-join. Cuando esta situación no se da, y toda la información que existía previamente puede recuperarse después de la descomposición, decimos que se cumple la propiedad lossless-join o LJ. • Al hacer la reunión ( join) de los subesquemas no obtenemos el esquema original. En nuestro ejemplo, para esta reunión la consulta apropiada sería: selet from r1.alumno, r1.asignatura, r2.profesor, r1.nota r1 inner join r2 on r1.asignatura = r2.asignatura Y el resultado sería: A NOMALÍAS 15 A NOMALÍAS R1 .Alumno R1 .Asignatura R2 .Profesor R1 .Nota Luis Física Newton 5 Luis Física Einstein 5 Luis Filosofía Kant 7 Carlos Física Newton 6 Carlos Física Einstein 6 Marta Física Newton 5 Marta Física Einstein 5 Pepe Filosofía Kant 4 16 • Aparecen tres filas más (en sombreado) que en la tabla R original. El problema radica en el hecho de que hay más de un profesor de Física, con lo que al reunir (realizar el producto natural) R1 y R2 , a cada alumno de Física se le empareja con todos los profesores de Física, dando lugar a filas espurias que contienen información incorrecta. A NOMALÍAS 17 Descomposición con la propiedad LJ • Rea R un esquema de una relación y consideremos una descomposición {R1 , R2 , . . . , Rn } (en el sentido de la definición 1). • Sea r una instancia de la relación (los valores actuales del conjunto de filas que contiene la tabla) con esquema R; definimos las instancias ri de Ri como ri = πTi (r). De esta forma, {R1 , R2 , . . . , Rn } es la base de datos que resulta de descomponer R en sus proyecciones sobre los conjuntos de atributos {T1 , T2 , . . . , Tn }. A NOMALÍAS 18 • Pues bien, puede demostrarse que siempre se da la siguiente inclusión: n ⊲⊳ ri ⊇ r i=1 (2) es decir, las tuplas de la relación original siempre se recuperan realizando una reunión natural de las proyecciones ri . Desgraciadamente, también pueden aparecer otras nuevas. • Nuestro objetivo es realizar una descomposición en la que ambos conjuntos sean iguales, es decir, que cumpla la propiedad LJ. A NOMALÍAS 19 • Decimos que una descomposición {R1 , R2 , . . . , Rn } de un esquema R es sin pérdidas (lossless) cuando se verifica la identidad n (3) ⊲⊳ ri = r i=1 • Para conseguir esto en nuestro ejemplo, sería necesario que al cruzar una fila de la tabla R1 sólo obtuviéramos una fila de la tabla R2 que cumpliera la condición R1 .Asignatura = R2 .Asignatura o dicho de otra forma, que cada asignatura de la tabla R2 sólo apareciera una vez. A NOMALÍAS 20 • Esto hecho se conoce como: Teorema 1. (Heath) Dado un esquema R(T, L), la descomposición R1 (R), R2 (R) es una descomposición sin pérdida (propiedad LJ) si y sólo si alguna de las siguientes dependencias funcionales se pueden deducir de L (pertenecen a L+ ): R1 ∩ R2 → R1 − R2 R1 ∩ R2 → R2 − R1 O lo que es lo mismo: A NOMALÍAS R1 ∩ R2 → R1 R1 ∩ R2 → R2 21 • Estas dependencias funcionales nos vienen a decir que los atributos comunes a las dos tablas funcionan como clave (más exactamente, superclave) en alguna de ellas. • Aprovechando este formalismo, vamos a dejar enunciado el siguiente teorema sobre descomposiciones con la propiedad LJ: Teorema 2. Sea el esquema R(T, L) y sea ρ = {R1 , R2 , . . . , Rk } una descomposición de R con la propiedad LJ respecto de L. Si τ = {S1 , S2 , . . . , Sk } es una descomposición de Ri con la propiedad LJ respecto de Li (proyección de L+ sobre Ti ), entonces γ = {R1 , R2 , . . . , Ri − 1, S1, S2, . . . , Sk, Ri + 1, . . . , Er} es una descomposición de R respecto L con la propiedad LJ. A NOMALÍAS 22 • Siguiendo con nuestro ejemplo, vemos que Asignatura es el atributo común a ambas tablas y no es clave en ninguna de ellas. Por eso, la descomposición propuesta resultó ser con pérdidas. • Otra descomposición alternativa que sí cumpliría la propiedad LJ sería la siguiente: A NOMALÍAS 23 R1 A NOMALÍAS Alumno Profesor Nota Luis Newton 5 Luis Kant 7 Carlos Einstein 6 Marta Newton 5 Pepe Kant R2 4 Profesor Asignatura Newton Física Kant Filosofía Einstein Física 24 • La descomposición es sin pérdida, ya que Profesor, el atributo común, es clave en R2 . • En principio, nuestro problema parece resuelto, pero si miramos con atención aún pueden aparecer algunas complicaciones. • Si alguien, por error, introduce una nueva fila en la tabla R1 con los valores (“Luis”, “Einstein”, 4) (puede hacerlo ya que no se viola la unicidad de la clave primaria), nos encontraremos con el dilema de si Luis tiene aprobada la asignatura de Física o no, además de no saber si su profesor es Newton o Einstein: A NOMALÍAS 25 R1 A NOMALÍAS Alumno Profesor Nota Luis Newton 5 Luis Kant 7 Carlos Einstein 6 Marta Newton 5 Pepe Kant 4 Luis Einstein R2 4 Profesor Asignatura Newton Física Kant Filosofía Einstein Física 26 • Lo que sucede en este caso es que no estamos cumpliendo las restricciones de que un alumno tiene un único profesor y una única nota en cada asignatura (Alumno Asignatura → P rof esorN ota) • No ocurre lo mismo con la dependencia Profesor→Asignatura, que se exige al declarar Profesor como clave primaria en R2 . • Este nuevo problema se conoce como descomposición con pérdida de dependencias funcionales. A NOMALÍAS 27 Descomposición sin pérdida de dependencias • Sea el esquema R(T, L), donde L son las dependencias estipuladas para la relación R. Sea {R1 , R2 , . . . , Rk } la descomposición de R con esquemas Ri (Ti , Li ), construidos de modo que Li es la proyección de L+ sobre Ti , es decir Li = (X → Y ) ∈ L+ | (X ∪ Y ) ⊆ Ti (4) • Por tanto cada Li será el conjunto de restricciones que involucra atributos únicamente de Ri , es decir, aquellas dependencias funcionales que se pueden comprobar de forma independiente en Ri . A NOMALÍAS 28 • Ojo: Las dependencias que afectan a cada relación Ri pueden no resultar necesariamente de la proyección de las dependencias originales sobre los atributos Ti de Ri . • Por ejemplo, en una relación R(T, L) con T = {A, B, C} y L = {A → B, B → C} la proyección sobre R1 (A, C) debe satisfacer la dependencia A → C, aunque ésta no se obtiene proyectando L sobre los atributos de R1 π(A,C) (L) = φ pero A → C ∈ L1 = π(A,C) (L+ ) de forma que es preciso deducir todas las dependencias que pueden afectar solamente a los atributos de R1 para conocer L1 . A NOMALÍAS 29 • Consideremos el conjunto L′ = ∪Li , es decir, la reunión de todas las dependencias impuestas a cada subesquema Ri . En general L′ ⊆ L, pero puede darse el caso de que una dependencia del conjunto L pueda deducirse de L′ aun no apareciendo explícitamente en L′ ; es decir, se encuentre en (L′ )+ . • Para que la descomposición siga imponiendo (a nivel de tabla) las dependencias originales, será entonces preciso que (L′ )+ = L+ . Si esto ocurre se dice que la descomposición preserva las dependencias. • Es decir, la descomposición preserva dependencias si al imponer las dependencias relativas a cada tabla de la descomposición, todas las originales resultan impuestas también, al poder deducirse de ellas. A NOMALÍAS 30 Observemos qué es lo que sucede en nuestro ejemplo. Esquema de partida: Atributos: Dependencias: R(T, L) T = {Alumno, Asignatura, Profesor, Nota} L = {Alumno Asignatura → Profesor, Alumno Asignatura → Nota, Profesor → Asignatura, Alumno Profesor → Nota} Descomposición: Atributos: Dependencias: R1 (T1 , L1 ) T1 = {Alumno, Profesor, Nota} L1 = {Alumno Profesor → Nota} Atributos: Dependencias: R2 (T2 , L2 ) T2 = {Profesor, Asignatura} L2 = {Profesor→Asignatura} En suma: A NOMALÍAS L′ = {Alumno Profesor→Nota, Profesor→Asignatura} 31 • Como vemos la dependencia Alumno Asignatura→Profesor no aparece explícitamente en L′ ; igual ocurre con Alumno Asignatura→Nota. Pero, además, tampoco se pueden deducir de dicho conjunto. • Existe un mecanismo para comprobar si esto ocurre: cuando dudemos de si una restricción de la forma X → Y se exige o no, bastará con calcular el cierre X + de X respecto al conjunto L′ , y si Y aparece en dicho cierre, la dependencia se estará imponiendo. • Aún más, hay un algoritmo que nos facilita este proceso sin la necesidad de calcular cada Li , y es el que se presenta a continuación. A NOMALÍAS 32 • El algoritmo se basa en la R-operación sobre el conjunto de atributos Z respecto de L como la sustitución de Z por Z ∪ ((Z ∩ Ti )+ ∩ Ti ). Z⇐X while Z cambie and not Y ∈ Z do for i = 1 to K do {siendo K el número de subesquemas} Z = Z ∪ ((Z ∩ Ti )+ ∩ Ti ) end for end while if Y 6∈ Z then Se pierde la dependencia X → Y else Se conserva la dependencia X → Y end if A NOMALÍAS 33 • No siempre es posible encontrar una descomposición que no presente ninguno de los anteriores problemas. • En general, el cumplir la propiedad LJ debe ser una exigencia básica que debe satisfacer cualquier descomposición, pero en el caso de descomposiciones con pérdidas habrá que analizar las ventajas e inconvenientes de las posibles descomposiciones y de las implicaciones de su implementación en un sistema real de gestión de bases de datos. A NOMALÍAS 34 E STUDIO DE N ORMALIZACIÓN • Ahora vamos a centrarnos en el estudio de la calidad de un esquema R(T, L), lo que se conoce como estudio de normalización. Lo que se pretende es dar una clasificación, de mayor a menor, de la posibilidad de encontrarnos con problemas a la hora de implementar un esquema (tabla), teniendo en cuenta las restricciones que se deben cumplir impuestas como dependencias funcionales. • La calidad estará en función de la forma normal que alcance el esquema. Definiremos 4 formas normales en este orden: Primera Forma Normal (1FN), 2FN, 3FN y Forma Normal de Boyce-Codd (FNBC). E STUDIO DE N ORMALIZACIÓN 35 Primera Forma Normal (1FN) • Un esquema R(T, L) está en 1FN cuando todas sus columnas (atributos de T ) son simples. Dicho de otra forma, cada columna de una tabla debe estar definida sobre un tipo simple de datos (entero, real, cadena, etc.) y no un tipo estructurado (registro, lista, matriz, etc.). • Realmente, lo que se busca con esta forma normal es que cada atributo se trate como un valor atómico. E STUDIO DE N ORMALIZACIÓN 36 Segunda Forma Normal (2FN) • Un esquema R(T, L) en 1FN está en 2FN cuando todos sus atributos no principales (aquellos que no forman parte de ninguna clave candidata) tienen dependencia funcional total (completa) respecto de cada una de las claves candidatas. • En algunos textos se habla únicamente de la clave primaria y no del resto de las claves candidatas. Para ver que esto no es así vamos a utilizar nuestro ejemplo con una pequeña modificación: vamos a incluir en T el atributo que nos diga el departamento al que pertenece el profesor. E STUDIO DE N ORMALIZACIÓN 37 Tomemos el siguiente esquema: Esquema: R(T, L) T = {Alumno, Asignatura, Profesor, Nota, Departamento } L = {Alumno Asignatura → Profesor, Alumno Asignatura → Nota, Profesor → Asignatura, Profesor → Departamento} • Tomemos como clave primaria (Alumno Asignatura), de manera que Departamento tiene una dependencia funcional completa con respecto a ella. • No ocurre lo mismo con la otra clave candidata (Alumno Profesor) ya que Departamento tiene una dependencia parcial de ella, porque sólo depende de Profesor. E STUDIO DE N ORMALIZACIÓN 38 • Es cierto que en este esquema se repite redundantemente la información del Departamento siempre que se repita un determinado profesor, y por tanto no cumple la 2FN. • Consecuentemente, un esquema en 1FN cuyas claves candidatas están formadas por un solo atributo siempre está en 2FN. E STUDIO DE N ORMALIZACIÓN 39 Tercera Forma Normal (3FN) • Un esquema R(T, L) en 2FN está en 3FN cuando ningún atributo no principal depende transitivamente de ninguna clave. • Entre X y Z existe una dependencia transitiva (X ։ Z) si se cumple que X ∩Z = φ ∃Y : X ∩ Y = φ, Y ∩ Z = φ X → Y, Y 9 X y Y →Z • Se dice que Z es una información sobre X, pero de forma indirecta, ya que realmente Z es una información sobre Y , e Y sobre X. E STUDIO DE N ORMALIZACIÓN 40 • Aunque nuestro esquema no cumple la 2FN, este tipo de transitividad también se presenta: Alumno Asignatura → Profesor Profesor 9 Alumno Asignatura Profesor → Departamento Luego: Alumno Asignatura ։ Departamento • Esto sucede porque Departamento es una información propia del Profesor y no de la asignatura de un alumno. Por eso cada vez que se repite el profesor se repetirá la asignatura que imparte. E STUDIO DE N ORMALIZACIÓN 41 • Otra forma equivalente, aunque algo más sencilla, de comprobar si un esquema está en 3FN es la siguiente: un esquema estará en 3FN si para toda dependencia funcional no trivial X → A ( es decir que A * X ) se cumple alguna de las siguientes condiciones: 1. X es una superclave de R 2. A está contenida en una clave candidata de R • Aunque se habla de superclaves, si trabajamos con un conjunto de dependencias sin atributos extraños (por ejemplo un recubrimiento no redundante) podemos hablar directamente de claves candidatas. • En nuestro esquema R vemos que la dependencia Profesor → Departamento no cumple ninguna de las dos condiciones. E STUDIO DE N ORMALIZACIÓN 42 Forma Normal de Boyce-Codd (FNBC) • Un esquema R(T, L) en 1FN está en BCFN cuando para toda dependencia funcional no trivial X → Y (es decir, Y * X , Y 6= φ), se tiene que X es clave o superclave. • Vemos que ahora somos más restrictivos y exigimos que se cumpla únicamente la condición 1 para estar en 3FN. Por lo tanto es evidente que todo esquema que esté en FNBC también estará en 3FN. E STUDIO DE N ORMALIZACIÓN 43 • Para ver la diferencia entre FNBC y 3FN vamos a retomar nuestro esquema original: R(T, L) : T = {Alumno, Asignatura, Profesor, Nota} L= {Alumno Asignatura → Profesor, Alumno Asignatura → Nota, Profesor → Asignatura} Claves Candidatas = {(Alumno Asignatura), (Alumno Profesor)} • Ahora R sí que está en 3FN, pero por Profesor→Asignatura R no alcanza la FNBC. E STUDIO DE N ORMALIZACIÓN 44 • Hay un aspecto de la FNBC que la hace muy interesante a la hora de implementar la base de datos. Si todas las tablas están en FNBC, podemos hacer cumplir las dependencias funcionales asociadas a cada tabla mediante la restricción PRIMARY KEY (para la clave primaria) y UNIQUE (para el resto de claves candidatas). Sin embargo en 3FN las dependencias del tipo Profesor→Asignatura suelen tener un coste computacional elevado, como ya se mencionó anteriormente. E STUDIO DE N ORMALIZACIÓN 45 • Resumiendo, si un esquema (tabla) no alcanza una forma normal satisfactoria, que reduzca la repetición de información, entonces podemos realizar una descomposición de la misma. • Esta descomposición debe cumplir la propiedad LJ; que si es posible conserve dependencias; y que las tablas obtenidas alcancen una forma normal más adecuada. Esto no siempre es posible, y a veces lo que ganamos por un lado lo perdemos por otro. E STUDIO DE N ORMALIZACIÓN 46 Algoritmo de descomposición en FNBC con la Propiedad LJ • Existe un algoritmo que nos asegura una descomposición con la propiedad LJ y que todas las tablas obtenidas alcanzan la FNBC. • Partimos de R(T, L) donde L es un recubrimiento no redundante. Si existe una dependencia X →A tal que X no sea clave (por tanto no está en FNBC), proyectamos R en R1 = (T1 , L1 ) y R2 = (T2 , L2 ), con E STUDIO DE N ORMALIZACIÓN T1 = X ∪ {A} T2 = T − {A} y 47 • Podemos ver una de las condiciones para que la descomposición cumpla la propiedad LJ T1 ∩ T2 → T1 − T2 siempre se cumple, ya que (T1 ∩ T2 ) es X y (T1 − T2 ) es A, y por tanto, se trata de la propia dependencia X → A. Es decir, los atributos comunes (X) funcionan como clave por lo menos en uno de los subesquemas (T2 ). E STUDIO DE N ORMALIZACIÓN 48 • L1 y L2 son las proyecciones de L+ (cierre del conjunto L) sobre T1 y T2 respectivamente. Normalmente no tenemos calculado L+ , por tanto, debemos encontrar todas las posibles dependencias que impliquen únicamente a atributos de cada esquema y después obtener su recubrimiento no redundante. • Si alguno de los esquemas obtenidos no alcanza la FNBC volveremos a descomponerlo hasta que todos los esquemas resultantes cumplan la FNBC. E STUDIO DE N ORMALIZACIÓN 49 • En la práctica cuando en los esquemas aparecen dependencias de la forma X → A1 , X → A2 . . . X → An donde X no es clave candidata, se genera: T1 = {X, A1 , A2 . . . An } T2 = {T − {A1 , A2 . . . An }} • Al ir cumpliendo la propiedad LJ en cada paso, la descomposición resultante también la cumple. E STUDIO DE N ORMALIZACIÓN 50 • Ejemplo R(T, L) : T = {Alumno, Asignatura, Profesor, Nota, Dpto} L= {Alumno Asignatura → Profesor Nota Profesor → Asignatura Dpto} Claves Candidatas = {(Alumno Asignatura), (Alumno Profesor)} • Profesor → Asignatura rompe la FNBC, y la utilizamos para descomponer, como también tenemos que con Profesor → Dpto: R1 (T1 , L1 ) : T1 = {Alumno, Profesor, Nota} L1 = {Alumno Profesor → Nota} Clave Candidata R2 (T2 , L2 ) : Clave Candidata E STUDIO DE N ORMALIZACIÓN = {(Alumno Profesor)} T2 = {Profesor, Asignatura, Dpto} L2 = {Profesor → Asignatura Dpto} = {(Profesor)} 51 • El resultado que hemos obtenido con todas las tablas en FNBC ya lo vimos anteriormente para mostrar que dicha descomposición no conservaba dependencias. Una vez más el resultado no parece óptimo, la elección última dependerá de otros factores de implementación que no se contemplan en esta teoría de diseño de bases de datos. E STUDIO DE N ORMALIZACIÓN 52