Normalización - script
From Ibbddunq
Contents |
Enganche con el Navathe 5ta edición
Este tema está cubierto por los caps 10 y 11. Este curso incluye específicamente el material en:
- 10.1
- 10.2.1 y 10.2.2
- 10.3
- 10.4
- 11.1, excepto la parte de definiciones formales y algoritmos
- intro a 11.3, 11.3.1, 11.3.3
Motivación
En el curso vimos una forma de llegar al esquema de una BD relacional: arrancar por un MER y traducirlo. Hay otras formas, p.ej. armar una bolsa con todos los atributos que quiero y después ir separándolos en tablas.
P.ej. te dicen ... (o bien artista y trailer, o bien funcion / formaParte / acto).
¿Es correcta esta base? Si les preguntan por qué no, ¿qué dirían, cómo lo justificarían? A partir de estos atributos, ¿cómo armarían un esquema de BD que tenga la misma info y que esté bien?
Hoy vamos a hablar de
- criterios de calidad de esquemas de BD, que se suman a las anomalías y restricciones de integridad que vimos al estudiar MR.
- cómo transformar un esquema en otro que sí cumpla con las restricciones de calidad adicionales.
O sea, estas restricciones también las vamos a garantizar sin necesidad de programa.
Si armamos primero el MER y después lo traducimos a MR con las reglas que vimos, la BD que resulta cumple las restricciones que vamos a ver; o sea, una buena manera de armar un esquema de MR, es armarlo en MER y después pasarlo; o hacerlo directamente en MR, pero pensar en "cómo sería el MER de esta parte" ante dudas.
Un poco para verificar que una traducción MER -> MR quedó OK, y bastante porque hay mucha gente en el mundo que no sabe MER, vamos a estudiar estos criterios de calidad y las formas de ir mejorando el esquema de una BD.
Criterio de calidad fundamental - semántica
Cuando arman un esquema de BD, para cada tabla que les quedó deberían ser capaces de responder en forma sencilla a alguna de estas dos preguntas
- ¿qué representa cada fila?
- ¿qué quiere decir que la tabla incluya una fila con ciertos valores?
Ver ejemplos del circo.
Anomalías y pautas informales
Anomalías de actualización (págs 340 a 343)
trabajar con el ejemplo de tabla funcion + formaParte, lo podemos comprimir un poco p.ej.
<dia,ciudad,precioEntr,nomActo,dur>
- de inserción: no sabés qué insertar (función sin actos asignados) y/o tenés que meter algunos valores iguales que otra fila, (2do acto de una función).
- de eliminación: había programado un solo acto para una función, me arrepiento, borro la fila correspondiente.
- de modificación: si cambio un dato de una función (ponele que aumento la entrada), lo tengo que cambiar en todos los formaParte para la misma función.
2. pautas, que vienen a atacar los mismos problemas
- no mezclar atributos de distintas entidades en la misma tabla.
- que no quede info repetida excepto FKs.
- los enganches deben ser FK-PK, ponele que partís la tabla anterior en
<dia,ciudad,precioEntr> <ciudad,nomActo,dur>
acá estamos enganchando por ciudad, lo que es cualquiera. Y se pueden dar filas espurias (spurious tuples, pág 344 a 346). P.ej. esta tabla
12/08 Córdoba 30 leones 21 12/08 Córdoba 30 mono 9 15/08 Córdoba 14 payaso 30 15/08 Córdoba 14 malabares 15 20/08 Rosario 32 cuchillos 12 20/08 Rosario 32 hombreBala 6 22/08 Rosario 14 acrobacia 18
se partiría así
12/08 Córdoba 30 Córdoba leones 21 15/08 Córdoba 14 Córdoba mono 9 20/08 Rosario 32 Córdoba payaso 30 22/08 Rosario 14 Córdoba malabares 15 Rosario cuchillos 12 Rosario hombreBala 6 Rosario acrobacia 18
y si hago el join de estas dos sobran cosas
Dependencias funcionales
Definición:
X -> Y si t1(X) = t2(X) => t1(Y) = t2(Y)
A partir de este concepto podemos definir
- superclave de una tabla
- clave de una tabla
Las 6 reglitas - pág 350. Nota sobre esto: en 200901 sí las conté, y fueron realmente útiles.
Formas normales
Qué son: restricciones de calidad que ayudan a que no se puedan producir anomalías. O sea, si un esquema de BD cumple con la restricción xFN (veremos x de 1 a 4), cuanto más alto el x, más hay que ingeniarse para que que haya anomalías.
Hay varias formas de definirlas, más o menos equivalentes. Nosotros nos quedamos con lo que sigue porque creemos que es la forma en que se entienden mejor.
1FN: sin repeticiones.
2FN: 1FN + sin dependencias parciales.
3FN: 2FN + sin dependencias transitivas.
Cómo trabajar un esquema para ir subiendo la FN
- parcial, ponele clave A+B y A determina C. Se crea una nueva tabla A U C+, se saca C+ de la tabla original, A es una FK a la nueva tabla. Acá "C+" quiere decir: C más lo que depende de C. Ejemplos:
<funcion,acto,ciudad,provincia,gradoPel>
acá tengo dos dependencias parciales, una con acto y otra con ciudad. Cuando se va la ciudad, también se va la provincia que depende de la ciudad.
- transitiva, ponele A determina B y B determina C. Se van B U C+ a otra tabla, se tacha C+ de la tabla original, B es una FK a la nueva tabla. Ejemplo:
<funcion,ciudad,provincia>
Dependencias multivaluadas y cuarta forma normal
Justificar por qué existen y contar qué son las dependencias multivaluadas. Ejemplo motivador
<funcion, acto, boletero>
en una función se dan muchos actos y trabajan muchos boleteros.
- Armar la tabla ejemplo, ver las anomalías.
- Ver que al ser todo PK, necesariamente estamos en 3FN.
Definición de dependencia multivaluada - página 398 - me gusta la notación
X ->> Y | Z (1)
Explicarla bien despacito con el ejemplo motivador. Ver el método para descubrir MVDs. Como yo lo veo, si tengo un candidato, "pivoteo" sobre el posible X en (1) y se ve más o menos claro (creo).
- entenderla despacito, hay tres casos para f1 y f2
- son la misma fila
- coinciden en Y
- no pasa ninguna de las anteriores
- Observar que FD => MVD
Ver cómo partir una MVD para llegar a 4FN - página 401 Si X ->> Y | Z, parto en (X U Y) por un lado, (R - Y) = (X U Z) por el otro.
Para qué me sirve el concepto de MVD
- para seguir partiendo tablas que no tienen FDs pero que no están bien.
- para resolver "casos raros" de FDs que no son exactamente ni parciales ni transitivas ni adecuadas (ver ejemplo que sigue).
Un caso más complicado que también sale con MVD
Tomemos este caso
<funcion, ciudad, provincia, censo, poblacion>
con pk funcion, censo, y con dependencias
funcion -> ciudad ciudad -> provincia ciudad, censo -> poblacion
acá, la dependencia (ciudad, censo -> poblacion) es "medio parcial" y también transitiva. ¿Qué hacemos?
1. Seguro que podemos separar la dependencia
ciudad -> provincia
que es transitiva. Nos queda
<ciudad, provincia> <funcion, ciudad, censo, poblacion>
2. Vemos que
ciudad ->> funcion | {censo,poblacion}
Pensar este caso
funcion ciudad censo poblacion 18/05 Azul 1970 60000 19/05 Azul 1980 75000
(pivoteo como aprendí para analizar MVD). Se ve que hacen falta las otras dos filas
18/05 Azul 1980 75000 19/05 Azul 1970 60000
entonces queda
<funcion,ciudad> <ciudad,censo,poblacion> <ciudad,provincia>