Las relaciones pueden tener una estructura no efectiva o inapropiada. Cuando esto sucede, algún cambio en los datos puede traer consecuencias no deseadas llamadas anomalías de modificación.
Para eliminar estas anomalías tenemos que redefinir la relación descomponiéndola en dos o más relaciones. Este proceso se llama normalización.
Observe la siguiente relación:
ACTIVIDAD(NúmeroEstudiante,Actividad,Costo)
Llave: NúmeroEstudiante
NúmeroEstudiante | Actividad | Costo |
100 | Esquí | 200 |
150 | Natación | 50 |
175 | Tenis | 50 |
200 | Natación | 50 |
Si borramos la tupla del estudiante 100, se perdería no solo el hecho de que el estudiante 100 es un esquiador, sino también el hecho de que esquiar cuesta $200, Esto se llama anomalía de borrado; que significa que al borrar los hechos de una entidad, se borran inadvertidamente hechos de otra entidad en una sola operación de borrado.
Ahora suponga que queremos almacenar el hecho de que el buceo cuesta $175. No podremos meter esta información en la relación ACTIVIDAD hasta que un estudiante tome buceo. Esta restricción se denomina anomalía de inserción. No es posible insertar un hecho nuevo acerca de una entidad hasta que se tiene un hecho adicional sobre otra entidad.
Es evidente que la relación ACTIVIDAD tiene problemas. Estos problemas pueden eliminarse si se divide la relación en dos relaciones como se ve a continuación:
EST_ACT(NúmeroEstudiante,Actividad)
Llave: NúmeroEstudiante
NúmeroEstudiante | Actividad |
100 | Esquí |
150 | Natación |
175 | Tenis |
200 | Natación |
ACT_COST(Actividad,Costo)
Llave: Actividad
Actividad | Costo |
Esquí | 200 |
Natación | 50 |
Tenis | 50 |
De esta forma, si queremos borrar al estudiante 100 de EST_ACT, no se pierde el hecho de que esquiar cuesta $200. También podemos añadir buceo y su costo a la relación ACT_COST antes de que exista algún estudiante que tome buceo.
Las relaciones se clasifican por los tipos de anomalías de modificación a las que son vulnerables. En los años 70s, los teóricos relacionales encontraban anomalías, las clasificaban y determinaban la forma de prevenirlas. Estas clases de relaciones y técnicas de prevensión de anomalías son llamadas formas normales.
E.F. Codd definió la primera, segunda y tercera forma normal. Más tarde se especificó la forma normal Boyce-Codd y después se definieron la cuarta y la quinta forma normal. Estas formas normales están anidadas como se muestra en la figura. Esto es, una relación en segunda forma normal está también en primera forma normal, y una relación en quinta forma normal, está también en 4NF, BCNF, 3NF, 2NF y 1NF (NF son las siglas de Normal Form).
Los teóricos, sin embargo, no garantizaban que alguna de estas formas normales eliminara todas las anomalías, hasta que R. Fagin, en 1981, definió una nueva forma normal llamada forma normal dominio/llave (domain/key). Fagin mostró que una relación en forma normal dominio/llave está libre de todas las anomalías de modificación. También mostró que cualquier relación libre de anomalías de modificación está también en forma normal dominio/llave. Esto significa que si podemos llevar a una relación a la forma normal dominio/llave, podemos estar seguros de que no tendrá anomalías, solo hay que saber poner a las relaciones en forma normal dominio/llave.
Las formas normales se explican cada una por separado:
Cualquier tabla que cumpla con la definición de relación está en primera forma normal. Para que una tabla sea una relación debe tener las siguientes características: Cada celda de la tabla debe contener un solo valor, y no se permiten grupos o arreglos como valores. Todas las entradas en cualquier columna (atributo) debe ser del mismo tipo. Cada columna debe tener un nombre único, pero el orden de las columnas en la tabla es insignificante. Finalmente, dos renglones en una tabla no pueden ser idénticos, pero el orden de los renglones es insignificante.
La siguiente tabla es una relación en primera forma normal. Esta relación presenta anomalías de modificación.
ACTIVIDAD(NúmeroEstudiante,Actividad,Costo)
Llave: NúmeroEstudiante
NúmeroEstudiante | Actividad | Costo |
100 | Esquí | 200 |
150 | Natación | 50 |
175 | Tenis | 50 |
200 | Natación | 50 |
Considere la siguiente relación:
ACTIVIDADES(NúmeroEstudiante,Actividad,Costo)
Llave: (NúmeroEstudiante,Actividad)
NúmeroEstudiante | Actividad | Costo |
100 | Esquí | 200 |
100 | Golf | 65 |
150 | Natación | 50 |
175 | Tenis | 50 |
175 | Natación | 50 |
200 | Natación | 50 |
200 | Golf | 65 |
La relación ACTIVIDADES tiene anomalías de borrado, ya que si borramos la tupla del estudiante 175, se pierse el hecho de que el tenis cuesta 50. También presenta anomalías de inserción, porque si queremos agregar una actividad nueva, por ejemplo buceo que cuesta $175, tendremos que tener antes un estudiante que desee tomar buceo.
El problema de esta relación es que tiene una dependencia que involucra solo a una parte de la llave. La llave es (NúmeroEstudiante,Actividad), pero la relación contiene una dependencia, Actividad ---> Costo. El determinante de esta dependencia (Actividad) es solo una parte de la llave. Se dice que Costo es parcialmente dependiente de la llave. No habría anomalías de modificación si Costo fuera dependiente de toda la llave.
Definición de segunda forma normal:
Una relación está en segunda forma si todos sus atributos no-llave son dependientes de toda la llave.
Según la definición, todas las relaciones que tienen por llave a uno solo de sus atributos, están automáticamente en segunda forma normal. Si la llave es de un solo atributo, todos los atributos no-llave son dependientes de toda la llave; ahí no pueden existir dependencias parciales.
Para eliminar las anomalías de modificación de la relación ACTIVIDADES debemos dividir la relación en dos relaciones en segunda forma normal. Las nuevas relaciones son EST_ACT y ACT_COST.
EST_ACT(NúmeroEstudiante,Actividad)
Llave: (NúmeroEstudiante,Actividad)
NúmeroEstudiante | Actividad |
100 | Esquí |
100 | Golf |
150 | Natación |
175 | Tenis |
175 | Natación |
200 | Natación |
200 | Golf |
ACT_COST(Actividad,Costo)
Llave: Actividad
Actividad | Costo |
Esquí | 200 |
Natación | 50 |
Tenis | 50 |
Golf | 65 |
Las relaciones en segunda forma normal también pueden tener anomalías. Considere la relación VIVIENDA. Cada estudiante vive en un solo edificio, y cada edificio tiene un solo costo. La llave de esta relación es NúmeroEstudiante y tiene las dependencias NúmeroEstudiante --->Edificio y Edificio ---> Costo.
VIVIENDA(NúmeroEstudiante,Edificio,Costo) Llave: NúmeroEstudiante Dependencias Funcionales: Edificio ---> Costo NúmeroEstudiante ---> Edificio ---> Costo
NúmeroEstudiante | Edificio | Costo |
100 | Randolph | 1200 |
150 | Ingersoll | 1100 |
200 | Randolph | 1200 |
250 | Pitkin | 1100 |
300 | Randolph | 1200 |
Como NúmeroEstudiante determina Edificio y Edificio determina Costo, indirectamente NúmeroEstudiante ---> Costo. Un arreglo de dependencias como el anterior se llama dependencia transitiva, pues NúmeroEstudiante determina el Costo a través del atributo Edificio.
La relación VIVIENDA está en segunda forma normal porque tanto Edificio como Costo están determinados por NúmeroEstudiante. Sin embargo, VIVIENDA tiene anomalías.
Si eliminamos la tupla del estudiante 150, no solo se pierde el hecho de que el estudiante 150 vive en el edificio Ingersoll, también se pierde el hecho de que este edificio tiene un costo de $1100. Y si queremos almacenar el hecho de que el edificio Carrigg Hall cuesta $1500 tendremos que esperar a que un estudiante se mude a ese edificio. Hemos encontrado que VIVIENDA tiene anomalías de borrado y de inserción debido a la dependencia transitiva.
Definición de tercera forma normal:
Una relación está en tercera forma normal si está en segunda forma normal y no tiene dependencias transitivas.
La relación vivienda puede dividirse en dos relaciones en tercera forma normal que eliminan las anomalías, estas relaciones son
EST_VIVIENDA(NúmeroEstudiante,Edificio) y EDIF_COSTO(Edificio,Costo).
EST_VIVIENDA(NúmeroEstudiante,Edificio)
Llave: NúmeroEstudiante
NúmeroEstudiante | Edificio |
100 | Randolph |
150 | Ingersoll |
200 | Randolph |
250 | Pitkin |
300 | Randolph |
EDIF_COSTO(Edificio,Costo)
Llave: Edificio
Edificio | Costo |
Randolph | 1200 |
Ingersoll | 1100 |
Pitkin | 1100 |