[NF] Normalización
1 · ¿Para qué normalizar?
La normalización es el proceso de organizar las tablas de una base de datos relacional para que cada dato se guarde una sola vez, en el lugar que le corresponde. Se aplica después de transformar el MER al modelo relacional, o cuando recibimos una tabla «plana» (una planilla, un reporte, un JOIN guardado) y queremos convertirla en un buen diseño. Sus objetivos:
- Disminuir el espacio que ocupa la información: un dato que se repite en mil filas ocupa mil veces su tamaño.
- Eliminar la redundancia y, con ella, la inconsistencia: si un dato está en un solo lugar, no puede estar en dos lugares con valores distintos.
- Ordenar los datos: cada tabla describe un solo tema (alumnos, asignaturas, carreras) y se relaciona con las demás mediante claves foráneas.
Una tabla mal diseñada sufre tres anomalías:
El nombre de la carrera se repite en cada fila de cada alumno. Cambiarlo obliga a modificar muchas filas; si se olvida una, la base queda con dos nombres para la misma carrera.
No se puede registrar una asignatura nueva hasta que algún alumno la inscriba, porque la clave de la tabla exige una matrícula.
Si el único alumno de una asignatura se retira y se borra su fila, se pierde también el nombre de la asignatura.
2 · Dependencias funcionales
Una dependencia funcional (DF) X → Y dice que el valor de X determina el valor de
Y: dos filas que coinciden en X deben coincidir también en Y. A X se le
llama determinante. Las DF no se deducen de los datos: salen de las reglas del negocio.
matricula → nombre, apellido: cada matrícula corresponde a un solo alumno.nrc → asignatura: cada NRC es una sección de una sola asignatura.cod_carrera → carrera: cada código identifica una sola carrera.nombre → matriculano es una DF: puede haber dos alumnos llamados Ana.
Hay tres tipos de dependencias que interesan al normalizar. Sea K la clave de la tabla:
- Completa: el atributo depende de toda la clave. Ejemplo:
matricula, nrc → nota. - Parcial: depende solo de una parte de una clave compuesta. Ejemplo:
nrc → asignaturacuando la clave es(matricula, nrc). - Transitiva: depende de otro atributo que no es clave:
matricula → cod_carrera → carrera.
3 · Cierre de atributos y claves candidatas
El cierre X⁺ es el conjunto de todos los atributos que X determina, directa o
indirectamente. Se calcula partiendo con X y agregando el lado derecho de cada DF cuyo lado izquierdo ya
esté en el conjunto, hasta que no se pueda agregar nada más.
R(matricula, nombre, apellido, nrc, asignatura, cod_carrera, carrera)
{matricula}⁺ = {matricula, nombre, apellido, cod_carrera, carrera} ← falta nrc, asignatura
{matricula, nrc}⁺ = {matricula, nombre, apellido, cod_carrera, carrera, nrc, asignatura} ← ¡todos!
- Superclave: conjunto de atributos cuyo cierre contiene a todos los atributos de la relación.
- Clave candidata: superclave mínima (si se le quita cualquier atributo, deja de ser superclave). Una relación puede tener varias; se elige una como clave primaria.
- Atributo primo: el que forma parte de alguna clave candidata. Los demás son no primos.
Truco: un atributo que nunca aparece a la derecha de una DF tiene que estar en todas las claves (nadie lo determina).
En el ejemplo, matricula y nrc nunca están a la derecha, y juntos ya determinan todo.
4 · Las formas normales
Cada forma normal exige la anterior y agrega una condición. Un esquema en FNBC está también en 3FN, 2FN y 1FN. Como muestra la infografía de la semana 6, la escalera sigue con la 4FN y la 5FN, que tratan casos menos frecuentes.
Cada celda contiene un solo valor indivisible, no hay grupos repetitivos (teléfono1, teléfono2, …) y la tabla tiene una clave.
Cómo se corrige: el atributo multivaluado pasa a una tabla propia, con una fila por valor, junto con la clave de la que depende.
Está en 1FN y todo atributo no primo depende de la clave completa, no de una parte. Solo puede fallar cuando la clave es compuesta.
Cómo se corrige: por cada parte de la clave que determina atributos, se crea una tabla con esa parte como PK y los atributos que determina.
Está en 2FN y ningún atributo no primo depende de otro atributo no clave. Para toda DF X → A: X es superclave o A es primo.
Cómo se corrige: se crea una tabla con X como PK y los atributos que determina; X queda en la tabla original como clave foránea.
Para toda DF no trivial X → A, X es superclave, sin excepciones. Es más estricta que la 3FN solo cuando hay claves candidatas compuestas que se traslapan.
Ojo: llevar a FNBC siempre se puede sin perder datos, pero a veces se pierde una dependencia funcional. Por eso en la práctica muchas veces el objetivo es la 3FN.
4FN y 5FN · más allá de las dependencias funcionales
Hasta la FNBC solo miramos dependencias funcionales (un valor determina un valor). La 4FN y la 5FN corrigen redundancias que aparecen cuando una tabla mezcla hechos independientes de muchos valores.
Una dependencia multivaluada X →→ Y dice que cada valor de X tiene un conjunto de valores de
Y, independiente del resto de los atributos. Una tabla está en 4FN si está en FNBC y toda dependencia
multivaluada no trivial tiene como determinante una superclave.
Ejemplo: curso(asignatura, profesor, texto), donde cada asignatura tiene varios profesores y
varios textos, y cualquier profesor usa cualquier texto. Para 2 profesores y 3 textos hay que guardar las 6 combinaciones.
Se descompone en dicta(asignatura, profesor) y usa(asignatura, texto): 2 + 3 filas.
Una tabla está en 5FN (o FNPR, proyección-reunión) si no se puede descomponer en tablas más pequeñas que, al unirlas con JOIN, reproduzcan exactamente la original, salvo que la descomposición se base en sus claves.
Ejemplo: suministra(proveedor, pieza, proyecto) con la regla «si un proveedor vende una pieza,
y esa pieza se usa en un proyecto, y el proveedor abastece ese proyecto, entonces le vende esa pieza a ese proyecto».
Se descompone en tres tablas de dos columnas cuyo JOIN de las tres recupera la original. Es raro en la práctica.
Una frase para recordarlo: cada atributo no primo debe depender de la clave (1FN), de toda la clave (2FN) y nada más que de la clave (3FN).
5 · El ejemplo de la clase, paso a paso
La tabla de la clase guarda en un solo lugar la matrícula, el nombre y apellido del alumno, la asignatura con su NRC
y la carrera. Las reglas del negocio dan tres DF:
matricula → nombre, apellido, cod_carrera, nrc → asignatura y cod_carrera → carrera.
La clave es (matricula, nrc). Recorre las pestañas para ver cómo cambian las tablas y sus datos:
6 · Laboratorio de normalización
Elige un ejemplo o escribe tu propia relación: sus atributos, las dependencias funcionales (una por línea, con
->) y, si quieres, algunas filas de datos. QueryLab calcula las claves, diagnostica la forma normal y
la descompone paso a paso. Después puedes generar el CREATE TABLE, cargar las tablas con sus datos en la consola SQL
o abrirlas en el editor relacional.