Las primeras formas normales
Qué problema resuelve normalizar, qué es una dependencia funcional y sus variantes, y las dos primeras formas normales con sus casos de aplicación.
Para qué sirve normalizar
La normalización es una técnica que estudia las dependencias entre los atributos de una relación para eliminar la redundancia. Se aplica sobre el esquema lógico y consiste en ir descomponiendo relaciones en otras más pequeñas hasta que cada dato quede guardado en un solo sitio.
La redundancia gasta espacio, pero ese no es el problema serio. El problema serio son las inconsistencias: si el mismo dato está en cien filas y se actualiza en noventa y nueve, la base de datos pasa a contener dos verdades distintas y ya no hay forma de saber cuál vale. De ahí salen las tres anomalías clásicas que la normalización evita.
| Anomalía | En qué consiste | Ejemplo |
|---|---|---|
| De inserción | No se puede guardar un dato porque falta otro que no viene al caso | No se puede dar de alta un curso nuevo hasta que tenga al menos un alumno matriculado |
| De borrado | Al borrar una fila se pierde información que no se quería perder | Al borrar la última matrícula de un curso desaparece también el nombre del curso |
| De modificación | Un cambio obliga a repetir la misma actualización en muchas filas | Cambiar el nombre de un curso exige tocar todas las filas de matrícula |
El resultado de normalizar es siempre el mismo: más relaciones y más pequeñas. Baja la redundancia y suben las uniones necesarias para reconstruir la información, porque queda más repartida. Ese es el precio, y es un precio de rendimiento en consulta.
Normalizar cambia espacio y consistencia por uniones. Menos redundancia, más tablas, consultas que tienen que juntar más piezas.
Para el examen
Anomalía de inserción: no poder guardar un dato sin conocer otro
Anomalía de borrado: perder información al eliminar una fila
Anomalía de modificación: tener que repetir el cambio en muchas filas
La dependencia funcional
Toda la normalización se apoya en un solo concepto. Hay dependencia funcional de Y respecto de X cuando, fijado el valor de X, el de Y queda decidido sin ambigüedad: no pueden coexistir dos valores distintos de Y para un mismo valor de X. Se dice entonces que X es el determinante y que Y está determinado funcionalmente por él.
X e Y no tienen por qué ser atributos sueltos: la dependencia puede darse entre conjuntos de atributos, y de hecho es lo habitual cuando la clave es compuesta.
Hay una dependencia que se cumple siempre y no molesta: la de la clave. Como los valores de una clave no se repiten, cada valor de la clave aparece una sola vez y por tanto determina de manera única al resto de atributos de la tupla. Esa dependencia es inherente al diseño y no hay nada que corregir.
Las que dan problemas son las demás. Si un atributo que no es clave determina a otro, ese par de valores se repetirá en tantas filas como veces aparezca el determinante, y ahí está la redundancia y la posibilidad de inconsistencia. Normalizar es, básicamente, sacar esas dependencias a una relación propia.
Que la clave determine al resto de atributos es inevitable y no da guerra. Las dependencias que hay que sacar de la relación son todas las demás.
Para el examen
Qué significa X → Y: fijado X, el valor de Y queda decidido
Determinante: la parte izquierda, X
Propiedad que NO tiene: no es simétrica
La de la clave: inherente e inofensiva
Cómo se comprueba una dependencia sobre los datos
En un supuesto de examen la dependencia funcional a veces no se enuncia: hay que deducirla de una tabla de ejemplo. El procedimiento es mecánico y conviene tenerlo por la mano.
Para comprobar si X determina a Y se agrupan las filas por el valor de X y se mira la columna Y dentro de cada grupo. Si en algún grupo aparecen dos valores distintos de Y, la dependencia no existe. Si en todos los grupos el valor de Y es siempre el mismo, la dependencia se cumple para esos datos.
| id_curso | nombre_curso | id_alumno | nota |
|---|---|---|---|
| C1 | Curso Largo | A1 | 8 |
| C1 | Curso Largo | A2 | 6 |
| C1 | Curso Largo | A3 | 9 |
| C2 | Curso Express | A1 | 7 |
Sobre esa tabla, id_curso determina a nombre_curso: en las tres filas con C1 el nombre es siempre el mismo. En cambio id_curso no determina a nota, porque dentro de C1 hay tres notas distintas. Y esa primera dependencia es la que hay que eliminar, porque id_curso no es la clave de la relación: la clave es la pareja de curso y alumno.
Un aviso importante sobre el método: los datos de ejemplo pueden desmentir una dependencia, pero no pueden demostrarla. Que en cuatro filas se cumpla no garantiza que se cumpla siempre. La dependencia la fija la semántica del enunciado, y la tabla solo sirve para descartar.
Para el examen
Método: agrupar las filas por X
Cuándo no hay dependencia: si algún grupo tiene dos valores distintos de Y
Límite: los datos pueden desmentirla, pero nunca demostrarla
Dependencia funcional completa y dependencia multivaluada
De la dependencia funcional nacen dos variantes, y cada una da nombre a una forma normal distinta.
Una dependencia funcional es completa cuando un atributo depende de un grupo de atributos entero y no de ninguna parte suya. Si la relación tiene clave compuesta por A, B y C, y G depende de los tres a la vez pero no depende solo de C ni solo de la pareja A y B, la dependencia es completa. Si en cambio bastara con C para determinar G, sería una dependencia parcial, y eso es lo que la segunda forma normal prohíbe.
La dependencia multivaluada es una generalización de la funcional. Se dice que A multidetermina a B cuando, fijado el valor de A, queda determinado todo un conjunto de valores de B, y ese conjunto no varía con los demás atributos de la relación. Donde la dependencia funcional decía «un solo valor», la multivaluada dice «un conjunto de valores bien definido».
El ejemplo típico es una relación que junta dos hechos independientes. Si en una misma tabla se guarda qué profesores imparten una asignatura y en qué cursos se imparte esa asignatura, la asignatura multidetermina a los profesores y multidetermina a los cursos, y las dos cosas no tienen nada que ver entre sí. Esa situación es de la que se ocupa la cuarta forma normal.
Completa quiere decir que depende del grupo entero, no de un trozo. Multivaluada quiere decir que un valor determina un conjunto de valores, no uno solo.
Para el examen
Dependencia completa: del grupo determinante entero
Dependencia parcial: basta una parte del determinante; la prohíbe la 2FN
Dependencia multivaluada: un valor determina un conjunto de valores; es el objeto de la 4FN
Primera forma normal
Una relación está en primera forma normal cuando no contiene grupos repetitivos: en cada celda hay un solo valor y ese valor es atómico. Dicho de otro modo, en una celda no puede haber ni una lista ni una estructura, solo un dato indivisible.
Es la única forma normal que se puede comprobar mirando la tabla sin saber nada del significado de los datos, y por eso se considera el requisito de entrada al modelo relacional: una relación que no está en primera forma normal ni siquiera cumple la propiedad de atomicidad que define a las relaciones.
-- NO está en 1FN: la columna telefonos guarda varios valores.
alumno(id_alumno, nombre, telefonos)
A1, "Ana Ruiz", "600111222, 911333444"
-- En 1FN: se saca el atributo multivalorado a su propia relación.
alumno(id_alumno, nombre)
A1, "Ana Ruiz"
telefono_alumno(id_alumno, telefono)
A1, "600111222"
A1, "911333444"La forma de arreglarlo nunca es añadir columnas numeradas (telefono1, telefono2, telefono3), aunque a primera vista cumpla la definición. Esa solución impone un tope arbitrario, desperdicia espacio y obliga a repetir cualquier consulta tantas veces como columnas haya. La solución correcta es sacar el atributo multivalorado a una relación aparte.
Primera forma normal: un solo valor por celda y ese valor atómico. Sin listas, sin campos compuestos y sin columnas numeradas.
Para el examen
Qué exige: valores atómicos y sin grupos repetitivos
Cómo se corrige: sacando el atributo multivalorado a una relación aparte
Lo que NO vale: columnas numeradas: telefono1, telefono2…
Segunda forma normal
Una relación está en segunda forma normal cuando está en primera y, además, todos sus atributos no principales dependen de la clave primaria de manera completa. Atributo no principal es el que no forma parte de ninguna clave candidata.
Lo que la segunda forma normal persigue son las dependencias parciales: un atributo que depende solo de una parte de la clave compuesta. Cuando eso ocurre, el atributo se repite en todas las filas que compartan esa parte de la clave, con la redundancia y las anomalías correspondientes.
Hay un atajo que ahorra tiempo en el examen: si la clave primaria está formada por un solo atributo, no puede haber dependencias parciales, porque no hay partes de la clave. Toda relación en primera forma normal con clave simple está automáticamente en segunda.
La corrección consiste en sacar el atributo dependiente, junto con la parte de la clave que lo determina, a una relación nueva. En la relación original se queda la parte de la clave, que ya era clave ajena.
-- Relación con clave compuesta (id_alumno, id_curso).
-- nombre_curso depende solo de id_curso: dependencia parcial.
matricula(id_alumno, id_curso, fecha_alta, nombre_curso)
-- En 2FN: el atributo parcial se va con la parte de la clave
-- que lo determina.
matricula(id_alumno, id_curso, fecha_alta)
curso(id_curso, nombre_curso)Segunda forma normal ataca las dependencias parciales, y solo pueden aparecer si la clave es compuesta. Con clave simple, no hay nada que revisar.
Para el examen
Qué exige: 1FN más dependencia COMPLETA de la clave para todo atributo no principal
Atajo de examen: con clave primaria simple, la 2FN se cumple automáticamente