Gilberto 🦁 PRO
Desarrollo visualizaciones y aplicaciones en línea, colaboro con distintos medios digitales
La normalización de una base de datos es un proceso para organizar su información (tablas, atributos y relaciones) de manera que se eliminen (o, cuando menos, se minimicen) las redundancias de información a través de relaciones y tablas nuevas que las reemplacen
Entre algunas de las ventajas de realizar este proceso podemos mencionar:
En estricto sentido, hay varias formas de normalización:
En estricto sentido, hay varias formas de normalización:
Aunque, en la práctica, normalmente basta con llegar a la tercera forma normal (si acaso a la de Boyce-Codd, pero rara vez es necesario llegar hasta la sexta)
Vamos a usar una tabla de ejemplo para demostrar el proceso:
matricula | nombre | domicilio | materias | tutor |
---|---|---|---|---|
200312889 | José López Pérez | Bulgaria 127, Colonia Nápoles, 03300, Ciudad de México | Bases de datos, Arquitectura de computadoras, Matemáticas discretas | Carlos Jaimez |
200328597 | Alfredo Gómez Díaz | Andador Jose Enrique Pestalozzi 1238, Colonia Del Valle, 03100, Ciudad de México | Matemáticas discretas, Introducción al pensamiento matemático, Laboratorio temático | Dominique Decauchant |
Para que una tabla esté en primera forma normal se deben cumplir las siguientes condiciones:
Revisando nuestra tabla de ejemplo podemos notar que:
Revisando nuestra tabla de ejemplo podemos notar que:
Podemos arreglar lo anterior haciendo lo siguiente:
Separando los nombres y domicilios nos queda:
matricula | nombre | apellido | domicilio | colonia | codigo_postal |
ciudad | estado | materias | tutor_nombre |
tutor_apellido |
---|---|---|---|---|---|---|---|---|---|---|
200312889 | José | López Pérez | Bulgaria 127 | Nápoles | 03300 | Ciudad de México | Ciudad de México | Bases de datos, Arquitectura de computadoras, Matemáticas discretas | Carlos |
Jaimez |
200328597 | Alfredo | Gómez Díaz | Andador Jose Enrique Pestalozzi 1238 | Del Valle | 03100 | Ciudad de México | Ciudad de México | Matemáticas discretas, Introducción al pensamiento matemático, Laboratorio temático | Dominique |
Decauchant |
Vamos a enfocarnos, por un momento, sólo en las materias. Podemos separarlas de manera vertical u horizontal
Vamos a enfocarnos, por un momento, sólo en las materias. Podemos separarlas de manera vertical u horizontal
matricula | materia |
---|---|
200312889 | Bases de datos |
200312889 | Arquitectura de computadoras |
200312889 | Matemáticas discretas |
200328597 | Matemáticas discretas |
200328597 | Introducción al pensamiento matemático |
200328597 | Laboratorio temático |
Si las separamos de manera vertical, nuestra tabla quedaría más o menos así:
Vamos a enfocarnos, por un momento, sólo en las materias. Podemos separarlas de manera vertical u horizontal
matricula | materia |
---|---|
200312889 | Bases de datos |
200312889 | Arquitectura de computadoras |
200312889 | Matemáticas discretas |
200328597 | Matemáticas discretas |
200328597 | Introducción al pensamiento matemático |
200328597 | Laboratorio temático |
Si las separamos de manera vertical, nuestra tabla quedaría más o menos así:
El problema con eso es que estaríamos agregando redundancia a la tabla porque habría varias filas, una por cada materia, con la información de cada estudiante
Vamos a enfocarnos, por un momento, sólo en las materias. Podemos separarlas de manera vertical u horizontal
Si las separamos de manera horizontal, nuestra tabla quedaría más o menos así:
matricula | materia_1 | materia_2 | materia_3 |
---|---|---|---|
200312889 | Bases de datos | Arquitectura de computadoras | Matemáticas discretas |
200328597 | Matemáticas discretas | Introducción al pensamiento matemático | Laboratorio temático |
Vamos a enfocarnos, por un momento, sólo en las materias. Podemos separarlas de manera vertical u horizontal
Si las separamos de manera horizontal, nuestra tabla quedaría más o menos así:
matricula | materia_1 | materia_2 | materia_3 |
---|---|---|---|
200312889 | Bases de datos | Arquitectura de computadoras | Matemáticas discretas |
200328597 | Matemáticas discretas | Introducción al pensamiento matemático | Laboratorio temático |
Acá también podemos ver varios problemas:
Vamos a enfocarnos, por un momento, sólo en las materias. Podemos separarlas de manera vertical u horizontal
Si las separamos de manera horizontal, nuestra tabla quedaría más o menos así:
Acá también podemos ver varios problemas:
matricula | materia_1 | materia_2 | materia_3 | materia_4 | materia_5 | materia_6 | materia_7 |
---|---|---|---|---|---|---|---|
200312889 | Bases de datos | Arquitectura de computadoras | Matemáticas discretas | NULL | NULL | NULL | NULL |
200328597 | Matemáticas discretas | Introducción al pensamiento matemático | Laboratorio temático | NULL | NULL | NULL | NULL |
La solución, entonces, no se queda sólo en separar atributos sino en crear una tabla nueva y establecer una relación con la que ya existe:
matricula | nombre | apellido |
---|---|---|
200312889 | José | López Pérez |
200328597 | Alfredo | Gómez Díaz |
matricula | clave |
---|---|
200312889 | 400005 |
200312889 | 400006 |
200312889 | 400007 |
200328597 | 400007 |
200328597 | 400008 |
200328597 | 400009 |
clave | nombre |
---|---|
400005 | Bases de datos |
400006 | Arquitectura de computadoras |
400007 | Matemáticas discretas |
400008 | Introduccion al pensamiento matemático |
400009 | Laboratorio temático |
De modo que ahora tenemos las siguientes tablas, todas en primera forma normal:
matricula | nombre | apellido | domicilio | colonia | codigo_postal | ciudad | estado | tutor_nombre | tutor_apellido |
---|---|---|---|---|---|---|---|---|---|
200312889 | José | López Pérez | Bulgaria 127 | Nápoles | 03300 | Ciudad de México | Ciudad de México | Carlos | Jaimez |
200328597 | Alfredo | Gómez Díaz | Andador Jose Enrique Pestalozzi 1238 | Del Valle | 03100 | Ciudad de México | Ciudad de México | Dominique | Decauchant |
estudiante_matricula | materia_clave |
---|---|
200312889 | 400005 |
200312889 | 400006 |
200312889 | 400007 |
200328597 | 400007 |
200328597 | 400008 |
200328597 | 400009 |
clave | nombre |
---|---|
400005 | Bases de datos |
400006 | Arquitectura de computadoras |
400007 | Matemáticas discretas |
400008 | Introduccion al pensamiento matemático |
400009 | Laboratorio temático |
Para que una tabla esté en segunda forma normal se deben cumplir las siguientes condiciones:
Regresemos a nuestra tabla de ejemplo:
matricula | nombre | apellido | domicilio | colonia | codigo_postal | ciudad | estado | tutor_nombre | tutor_apellido |
---|---|---|---|---|---|---|---|---|---|
200312889 | José | López Pérez | Bulgaria 127 | Nápoles | 03300 | Ciudad de México | Ciudad de México | Carlos | Jaimez |
200328597 | Alfredo | Gómez Díaz | Andador Jose Enrique Pestalozzi 1238 | Del Valle | 03100 | Ciudad de México | Ciudad de México | Dominique | Decauchant |
Regresemos a nuestra tabla de ejemplo:
matricula | nombre | apellido | domicilio | colonia | codigo_postal | ciudad | estado | tutor_nombre | tutor_apellido |
---|---|---|---|---|---|---|---|---|---|
200312889 | José | López Pérez | Bulgaria 127 | Nápoles | 03300 | Ciudad de México | Ciudad de México | Carlos | Jaimez |
200328597 | Alfredo | Gómez Díaz | Andador Jose Enrique Pestalozzi 1238 | Del Valle | 03100 | Ciudad de México | Ciudad de México | Dominique | Decauchant |
La información que identifica al tutor no depende de la matrícula porque la matrícula sólo identifica a cada estudiante
De hecho, es fácil ver que el tutor es una entidad propia y no un atributo del estudiante
La solución es, nuevamente, generar una tabla nueva con una relación:
matricula | nombre | apellido | domicilio | colonia | codigo_postal | ciudad | estado |
---|---|---|---|---|---|---|---|
200312889 | José | López Pérez | Bulgaria 127 | Nápoles | 03300 | Ciudad de México | Ciudad de México |
200328597 | Alfredo | Gómez Díaz | Andador Jose Enrique Pestalozzi 1238 | Del Valle | 03100 | Ciudad de México | Ciudad de México |
matricula | numero_economico |
---|---|
200312889 | 23587 |
200328597 | 28965 |
numero_economico | nombre | apellido |
---|---|---|
23587 | Carlos | Jaimez |
28965 | Dominique | Decauchant |
La solución es, nuevamente, generar una tabla nueva con una relación:
matricula | nombre | apellido | domicilio | colonia | codigo_postal | ciudad | estado |
---|---|---|---|---|---|---|---|
200312889 | José | López Pérez | Bulgaria 127 | Nápoles | 03300 | Ciudad de México | Ciudad de México |
200328597 | Alfredo | Gómez Díaz | Andador Jose Enrique Pestalozzi 1238 | Del Valle | 03100 | Ciudad de México | Ciudad de México |
matricula | numero_economico |
---|---|
200312889 | 23587 |
200328597 | 28965 |
numero_economico | nombre | apellido |
---|---|---|
23587 | Carlos | Jaimez |
28965 | Dominique | Decauchant |
¿Esa relación es correcta?
Normalmente usamos una tabla para establecer una relación N a N pero en este caso, la relación no es así: un estudiante tiene un, y sólo un, tutor asignado; mientras que un tutor tiene varios estudiantes
La relación 1 a N la establecemos mediante una clave foránea pero la regla para la segunda forma normal dice que todo atributo de una tabla debe depender completamente de la clave primaria así que ¿podemos agregar una clave foránea?
Normalmente usamos una tabla para establecer una relación N a N pero en este caso, la relación no es así: un estudiante tiene un, y sólo un, tutor asignado; mientras que un tutor tiene varios estudiantes
La relación 1 a N la establecemos mediante una clave foránea pero la regla para la segunda forma normal dice que todo atributo de una tabla debe depender completamente de la clave primaria así que ¿podemos agregar una clave foránea?
Una clave foránea no describe de ninguna manera a la entidad, sino que se usa para establecer una relación, de modo que podemos agregarla manteniendo la segunda forma normal
De modo que ahora nos queda:
matricula | nombre | apellido | domicilio | colonia | codigo_postal | ciudad | estado | tutor_numero_economico |
---|---|---|---|---|---|---|---|---|
200312889 | José | López Pérez | Bulgaria 127 | Nápoles | 03300 | Ciudad de México | Ciudad de México | 23587 |
200328597 | Alfredo | Gómez Díaz | Andador Jose Enrique Pestalozzi 1238 | Del Valle | 03100 | Ciudad de México | Ciudad de México | 28965 |
numero_economico | nombre | apellido |
---|---|---|
23587 | Carlos | Jaimez |
28965 | Dominique | Decauchant |
De modo que ahora nos queda:
matricula | nombre | apellido | domicilio | colonia | codigo_postal | ciudad | estado | tutor_numero_economico |
---|---|---|---|---|---|---|---|---|
200312889 | José | López Pérez | Bulgaria 127 | Nápoles | 03300 | Ciudad de México | Ciudad de México | 23587 |
200328597 | Alfredo | Gómez Díaz | Andador Jose Enrique Pestalozzi 1238 | Del Valle | 03100 | Ciudad de México | Ciudad de México | 28965 |
numero_economico | nombre | apellido |
---|---|---|
23587 | Carlos | Jaimez |
28965 | Dominique | Decauchant |
¿Y qué pasa ahora con el domicilio del estudiante?
La regla para la segunda forma normal es, de nuevo, que el atributo dependa directamente de la clave. En ese sentido, la matrícula hace referencia a una persona en un contexto muy específico: su identidad dentro de una institución universitaria, de modo que la pregunta es ¿el domicilio es parte de esa identidad o es una entidad propia y distinta del estudiante?
Más aún, ¿que pasa si necesitamos el domicilio para distintas funciones?
En un sistema de ventas, por ejemplo, el domicilio de un cliente sirve para hacer envíos, facturar y cotizar, de modo que es fácil ver que el domicilio tendría que ser una entidad distinta del cliente, pero relacionada a éste
Siguiendo esa misma idea, podemos separar al domicilio del estudiante a través de, como ya adivinaron, otra tabla y una relación nueva
matricula | nombre | apellido | tutor_numero_economico |
---|---|---|---|
200312889 | José | López Pérez | 23587 |
200328597 | Alfredo | Gómez Díaz | 28965 |
id | domicilio | colonia | codigo_postal | ciudad | estado | estudiante_matricula |
---|---|---|---|---|---|---|
d00001 | Bulgaria 127 | Nápoles | 03300 | Ciudad de México | Ciudad de México | 200312889 |
d00002 | Andador Jose Enrique Pestalozzi 1238 | Del Valle | 03100 | Ciudad de México | Ciudad de México | 200328597 |
En este caso no sucedió pero hay que tener cuidado cuando normalizamos una tabla que tiene una clave compuesta: la regla es que cada atributo de la tabla dependa de la clave, de la clave completa si es que es una clave compuesta, no solo de una parte u otra de la clave
Si tienen una clave compuesta y uno o varios atributos dependen sólo de una parte de la clave compuesta (y no de la totalidad), entonces deberían separarlos en otra tabla; los únicos atributos que se deberían mantener en la tabla son aquellos que dependen de la clave compuesta completa
Y nuestras tablas ya están en segunda forma normal
matricula | nombre | apellido | tutor_numero_economico |
---|---|---|---|
200312889 | José | López Pérez | 23587 |
200328597 | Alfredo | Gómez Díaz | 28965 |
estudiante
numero_economico | nombre | apellido |
---|---|---|
23587 | Carlos | Jaimez |
28965 | Dominique | Decauchant |
tutor
id | domicilio | colonia | codigo_postal | ciudad | estado | estudiante_matricula |
---|---|---|---|---|---|---|
d00001 | Bulgaria 127 | Nápoles | 03300 | Ciudad de México | Ciudad de México | 200312889 |
d00002 | Andador Jose Enrique Pestalozzi 1238 | Del Valle | 03100 | Ciudad de México | Ciudad de México | 200328597 |
domicilio
estudiante_matricula | materia_clave |
---|---|
200312889 | 400005 |
200312889 | 400006 |
200312889 | 400007 |
200328597 | 400007 |
200328597 | 400008 |
200328597 | 400009 |
estudiante_materia
clave | nombre |
---|---|
400005 | Bases de datos |
400006 | Arquitectura de computadoras |
400007 | Matemáticas discretas |
400008 | Introduccion al pensamiento matemático |
400009 | Laboratorio temático |
materia
Para que una tabla esté en tercera forma normal se deben cumplir las siguientes condiciones:
Pongamos nuestra atención en la tabla de domicilios*:
id | domicilio | colonia | codigo_postal | ciudad | estado | estudiante_matricula |
---|---|---|---|---|---|---|
d00001 | Bulgaria 127 | Nápoles | 03300 | Ciudad de México | Ciudad de México | 200312889 |
d00002 | Andador Jose Enrique Pestalozzi 1238 | Del Valle | 03100 | Ciudad de México | Ciudad de México | 200328597 |
Un estado tiene varias ciudades, una ciudad tiene varios códigos postales y un código postal tiene varias colonias. Eso implica varias dependencias transitivas a eliminar:
Realizamos el proceso habitual, tablas nuevas con relaciones, de modo que nos quedamos con algo así luego de normalizar los atributos del domicilio:
id | nombre | codigo_postal |
---|---|---|
col157864 | Nápoles | 03300 |
col157894 | Del Valle | 03100 |
id | domicilio | colonia_id | estudiante_matricula |
---|---|---|---|
d00001 | Bulgaria 127 | col157864 | 200312889 |
d00002 | Andador Jose Enrique Pestalozzi 1238 | col157894 | 200328597 |
codigo_postal | ciudad_id |
---|---|
03300 | 7553123 |
03100 | 7553123 |
id | nombre | estado_id |
---|---|---|
7553123 | Ciudad de México | 9 |
id | nombre |
---|---|
9 | Ciudad de México |
domicilio
estado
colonia
codigo_postal
ciudad
numero_economico | nombre | apellido |
---|---|---|
23587 | Carlos | Jaimez |
28965 | Dominique | Decauchant |
tutor
estudiante_matricula | materia_clave |
---|---|
200312889 | 400005 |
200312889 | 400006 |
200312889 | 400007 |
200328597 | 400007 |
200328597 | 400008 |
200328597 | 400009 |
estudiante_materia
clave | nombre |
---|---|
400005 | Bases de datos |
400006 | Arquitectura de computadoras |
400007 | Matemáticas discretas |
400008 | Introduccion al pensamiento matemático |
400009 | Laboratorio temático |
materia
id | nombre | codigo_postal |
---|---|---|
col157864 | Nápoles | 03300 |
col157894 | Del Valle | 03100 |
colonia
id | domicilio | colonia_id | estudiante_matricula |
---|---|---|---|
d00001 | Bulgaria 127 | col157864 | 200312889 |
d00002 | Andador Jose Enrique Pestalozzi 1238 | col157894 | 200328597 |
domicilio
id | nombre |
---|---|
9 | Ciudad de México |
estado
id | nombre | estado_id |
---|---|---|
7553123 | Ciudad de México | 9 |
ciudad
codigo_postal | ciudad_id |
---|---|
03300 | 7553123 |
03100 | 7553123 |
codigo_postal
matricula | nombre | apellido | tutor_numero_economico |
---|---|---|---|
200312889 | José | López Pérez | 23587 |
200328597 | Alfredo | Gómez Díaz | 28965 |
estudiante
Y ya tenemos nuestras tablas en tercera forma normal
Como pueden ver, las tablas resultantes eliminan la redundancia de la tabla del ejemplo original
Más aún, la información granulada que tenemos ahora nos permite hacer búsquedas no sólo por estudiante sino por:
Hablando en términos generales, llegar a las otras formas normales tiene pocos beneficios contra el esfuerzo que implica su normalización y no se ven en el campo profesional excepto en entornos altamente especializados
Hablando en términos generales, llegar a las otras formas normales tiene pocos beneficios contra el esfuerzo que implica su normalización y no se ven en el campo profesional excepto en entornos altamente especializados
Spoiler: ¿Recuerdan que en los diagramas entidad-relación les he dicho que siempre mapeen las relaciones únicamente entre dos atributos (de 1 a 1) en vez de tres o más a la vez? Eso obedece a la cuarta forma normal
By Gilberto 🦁
Normalización
Desarrollo visualizaciones y aplicaciones en línea, colaboro con distintos medios digitales