Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Base de Datos
¿Qué es eso?
La normalización es el proceso de organizar los
datos de una base de datos.
Se incluye la creación de tablas y el establecimiento de
relaciones entre ellas según reglas diseñadas tanto para
proteger los datos como para hacer que la BD sea más
flexible al eliminar la redundancia y las dependencias
incoherentes.
También se puede entender la normalización como
una serie de reglas que sirven para desarrollar un
esquema de BD que minimice los problemas de
lógica
Datos redundantes
Los datos redundantes desperdician el espacio de
disco y crean problemas de mantenimiento.
Si hay que cambiar datos que existen en más de un
lugar, se deben cambiar de la misma forma
exactamente en todas sus ubicaciones.
Un cambio en la dirección de un cliente es mucho más
fácil de implementar si los datos sólo se almacenan en
la tabla Clientes y no en algún otro lugar de la base de
datos.
Dependencias incoherentes
Una dependencia incoherente es cuando colocamos
un atributo a una entidad o tabla en donde no tiene
mucha coherencia que exista.
También se da cuando relacionamos 2 entidades o
tablas que no deberían estar relacionadas según el
planteamiento del problema.
Formas normales
Hay algunas reglas en la normalización de una base
de datos, y a cada regla se le llama una "forma
normal".
Si se cumple la 1era regla, se dice que la BD está en la
“1era forma normal".
Si se cumplen las 3 primeras reglas, la BD está en la
“3era forma normal".
Son posibles otros niveles de normalización.
Pero la 3era forma normal o hasta la 4ta se considera el
máximo nivel necesario para la mayor parte de las
aplicaciones.
Formas normales
Digamos que queremos crear una tabla con la
información de usuarios, y los datos a guardar son
el nombre, la empresa, la dirección de la empresa y
algún e-mail, o bien URL si las tienen.
En principio comenzaríamos definiendo la
estructura de una tabla como esta:
Formas normales
La tabla anterior se dice que está en forma normal
CERO, porque no se le ha aplicado ninguna regla.
¿Y que problema hay si se queda así?
¿Qué haremos cuando en nuestra aplicación necesitemos
una tercera url ?
¿Quieres tener que añadir otro campo/columna a tu tabla
y tener que reprogramar toda la entrada de datos de tu
código?
Como respuestas a estas preguntas se tiene la 1era
forma normal (1FN)
1era forma normal (1FN)
Cada renglón columna contiene valores atómicos
Pasos.
Eliminar los grupos repetitivos de la tablas
individuales.
Crear una tabla separada por cada grupo de datos
relacionados.
Identificar cada grupo de datos relacionados con una
clave primaria (Primary Key - PK).
1era forma normal (1FN)
Volviendo a nuestro caso.
¿Ves que estamos rompiendo la primera regla cuando
repetimos los campos url1 y url2 ?
¿Y que pasa con la tercera regla, la clave primaria ?
Aplicando los pasos anteriores, nos queda una tabla
así:
1era forma normal (1FN)
Hemos solucionado el problema de la limitación del
campo url.
Sin embargo vemos otros problemas...
Cada vez que introducimos un nuevo registro en la
tabla usuarios, tenemos que duplicar el nombre de la
empresa y del usuario.
No sólo nuestra BD crecerá muchísimo, sino que será
muy fácil que la BD se corrompa si escribimos mal
alguno de los datos redundantes
Esto se soluciona llevando esta tabla a la 2da forma
normal (2FN)
2da forma normal (2FN)
Pasos
Crear tablas separadas para aquellos grupos de datos
que se aplican a varios registros.
Relacionar estas tablas mediante una clave externa
(Foreing Key - FK).
2da forma normal (2FN)
Volviendo al ejemplo:
Hemos separado el
campo url en otra tabla,
de forma que podemos
añadir más en el futuro
si tener que duplicar los
demás datos.
También vamos a usar
nuestra clave primaria
para relacionar estos
campos:
2da forma normal (2FN)
OK, esto ya se ve mejor, pero…
¿Pero que ocurre cuando queremos añadir otro
empleado a la empresa ABC ?
¿ o 200 empleados ?
Ahora tenemos el nombre de la empresa y su
dirección duplicándose.
Es otra situación que puede inducirnos a introducir
errores en nuestros datos.
Para esto viene la 3era forma normal (3FN)
3era forma normal (3FN)
Pasos
Eliminar aquellos campos que no dependan de la
clave.
En nuestro ejemplo.
El nombre de empresa y su dirección no tienen nada
que ver con el campo userId.
Así que debe tener su propio empresaId.
3era forma normal (3FN)
3era forma normal (3FN)
Echemos un vistazo a nuestro campo urls ¿Hay
duplicación de datos?
Esto es perfectamente aceptable si la entrada de datos de
este campo es solicitada al usuario en nuestra aplicación
para que teclee libremente su url.
Por lo tanto es sólo una coincidencia que Joe y Jill teclearon
la misma url.
¿Pero que pasa si en lugar de entrada libre de texto
usáramos un menú desplegable con 20 o incluso más
urls predefinidas ?
Entonces tendríamos que llevar nuestro diseño de BD a la
4ta forma normal (4FN).
4ta forma normal (4FN).
Pasos
En las relaciones varios-con-varios, entidades
independientes no pueden ser almacenadas en la
misma tabla.
En nuestro ejemplo
Vamos a cambiar la estructura para permitir que varios
usuarios estén relacionados con varias urls y así
tendremos una relación muchos a muchos.
4ta forma normal (4FN).
Para disminuir la duplicación de los datos, hemos
creado una tabla que sólo tiene claves externas y
primarias url_relations.
Hemos sido capaces de remover la entradas
duplicadas en la tabla urls creando la tabla
url_relations.
Ahora podemos expresar fielmente la relación que
ambos Joe and Jill tienen entre cada uno de ellos, y
entre ambos, las urls.
4ta forma normal (4FN).
¿Qué tan lejos debe llevar la normalización