lunes, 2 de mayo de 2011

►Proceso de Normalización.-

El proceso de normalización
El proceso de normalización consiste en comprobar en secuencia si el esquema original está en 1FN, 2FN y 3FN, analizando las dependencias funcionales en cada paso.

Un ejemplo completo
Tenemos una empresa pública donde los puestos de trabajo están regulados por el Estado, de modo que las condiciones salariales están determinadas por el puesto. Se ha creado el siguiente esquema relacional

EMPLEADOS(id, nombre, puesto, salario, email) con id como clave primaria.

idnombrepuestosalarioemail
111Juan PérezJefe de Área3.000.000juanp@live.cl; jefe2@live.cl
222José SánchezAdministrativo1.500.000jsanchez@live.c
333Ana DíazAdministrativo1.500.000adiaz@live.cl; ana32@live.cl
...............

Primera forma normal (1FN)
Una tabla está en 1FN si sus atributos contienen valores atómicos. En el ejemplo, podemos ver que el atributo email puede contener más de un valor, por lo que viola 1FN.

En general, tenemos una relación Roriginal con clave primaria Koriginal. Si un atributo Aoriginal viola la condición de 1FN, tenemos dos opciones.

Solución 1: duplicar los registros con valores repetidos
En general, esta solución pasa por sustituir Rorignal por una nueva relación modificada Rnuevo, en la cual:
  • El atributo Aoriginal que violaba 1FN se elimina.
  • Se incluye un nuevo atributo Anuevo que solo puede contener valores simples, de modo que si Rnuevo[Anuevo] es uno de los valores que teníamos en Roriginal[Aoriginal], entonces Rnuevo[Koriginal] = Roriginal[Koriginal]. En otras palabras, para una tupla con valores duplicados en A, en la nueva relación habrá tuplas, que sólo varían en que cada una de ellas guarda uno de los valores que había en Aoriginal.
  • La clave primaria de Rnuevo es (Koriginal, Anuevo'), dado que podrá haber valores de Koriginal repetidos, para los valores multivaluados en Aoriginal.
Siguiendo el ejemplo, tendríamos el siguiente esquema para la nueva tabla EMPLEADOS'(a) con clave primaria (id, email):

idnombrepuestosalarioemail
111Juan PérezJefe de Área3.000.000juanp@live.cl
111Juan PérezJefe de Área3.000.000jefe2@live.cl
222José SánchezAdministrativo1.500.000jsanchez@live.cl
333Ana DíazAdministrativo1.500.000adiaz@live.cl
333Ana DíazAdministrativo1.500.000ana32@live.cl
...............

Solución 2: separar el atributo que viola 1FN en una tabla
En general, esta solución pasa por:

sustituir Roriginal por una nueva relación modificada Rnuevo que no contiene el atributo Anuevo.

Crear una nueva relación N(Koriginal, Anuevo), es decir, una relación con una clave ajena Koriginal referenciando Rnuevo, junto al atributo Anuevo, que es la variante mono-valuada del atributo Aoriginal.

La nueva relación N tiene como clave (Koriginal, Anuevo).

Siguiendo el ejemplo, tendríamos el siguiente esquema para la nueva tabla EMPLEADOS'(b)

idnombrepuestosalario
111Juan PérezJefe de Área3.000.000
222José SánchezAdministrativo1.500.000
333Ana DíazAdministrativo1.500.000
............

Y además tendríamos una nueva tabla EMAIL con clave primaria (id, email):

idemail
111juanp@live.cl
111jefe2@live.cl
222jsanchez@live.c
333adiaz@live.cl
333ana32@live.cl
......

Segunda forma normal (2FN)
Un esquema está en 2FN si:

Está en 1FN.

Todos sus atributos que no son de la clave principal tienen dependencia funcional completa respecto de todas las claves existentes en el esquema. En otras palabras, para determinar cada atributo no clave se necesita la clave primaria completa, no vale con una subclave.

La 2FN se aplica a las relaciones que tienen claves primarias compuestas por dos o más atributos. Si una relación está en 1FN y su clave primaria es simple (tiene un solo atributo), entonces también está en 2FN. Por tanto, de las soluciones anteriores, la tabla EMPLEADOS'(b) está en 1FN (y la tabla EMAIL no tiene atributos no clave), por lo que el esquema está en 2FN. Sin embargo, tenemos que examinar las dependencias funcionales de los atributos no clave de EMPLEADOS'(a). Las dependencias funcionales que tenemos son las siguientes:

id->nombre, puesto, salario, email

Como la clave es (id, email), las dependencias de nombre, salario y email son incompletas, por lo que la relación no está en 2FN.

En general, tendremos que observar los atributos no clave que dependan de parte de la clave.

Para solucionar este problema, tenemos que hacer lo siguiente para los gupos de atributos con dependencia incompleta Aoriginal:

Eliminar de Roriginal el atributo Aoriginal.

Crear una nueva relación N con el atributo Aoriginal y la parte de la clave primaria Koriginal de la que depende, que llamaremos Knuevo.

La clave primaria de la nueva relación será Knuevo.

Siguiendo el ejemplo anterior, crearíamos una nueva relación con los atributos que tienen dependencia incompleta:

idnombrepuestosalario
111Juan PérezJefe de Área3.000.000
222José SánchezAdministrativo1.500.000
333Ana DíazAdministrativo1.500.000
............

Y al eliminar de la tabla original estos atributos nos quedaría:

idemail
111juanp@live.cl
111jefe2@live.cl
222jsanchez@live.c
333adiaz@live.cl
333ana32@live.cl
......

Como vemos, la solución a la que llegamos es la misma que en la otra opción de solución para el problema de 1FN.

Tercera forma normal (3FN)
Una relación está en tercera forma normal si, y sólo si:

está en 2FN

y, además, cada atributo que no está incluido en la clave primaria no depende transitivamente de la clave primaria.

Por lo tanto, a partir de un esquema en 2FN, tenemos que buscar dependencias funcionales entre atributos que no estén en la clave.

En general, tenemos que buscar dependencias transitivas de la clave, es decir, secuencias de dependencias como la siguiente: K->A y A->B, donde A y B no pertenecen a la clave. La solución a este tipo de dependencias está en separar en una tabla adicional N el/los atributos B, y poner como clave primaria de N el atributo que define la transitividad A.

Siguiendo el ejemplo anterior, podemos detectar la siguiente transitividad:

id->puesto

puesto->salario

Por lo tanto la descomposición sería la siguiente:

idnombrepuesto
111Juan PérezJefe de Área
222José SánchezAdministrativo
333Ana DíazAdministrativo
.........

En la nueva tabla PUESTOS, la clave sería el puesto, que también queda como clave ajena referenciando la tabla EMPLEADOS. El resto de las tablas quedan como estaban.