En este artículo exploraremos qué es la normalización de bases de datos, una práctica fundamental tanto para el diseño de bases de datos operacionales como para la preparación y modelado de datos en Data Warehouse. Discutiremos por qué es importante normalizar los datos, cuáles son las formas normales y presentaremos un ejemplo de la tercera forma normal aplicada en el sector de Educación.
La normalización es un proceso clave para diseñar bases de datos relacionales tengan estas fines de OLTP u OLAP. Usualmente consiste en aplicar una serie de reglas (formas normales) para convertir un modelo entidad-relación a un modelo relacional.
Imagina que estás creando una lista de invitados para una ceremonia. Cada persona tiene información como nombre, teléfono y acompañante. Algunas personas se conocen entre sí y otras tienen opciones alimenticias diferentes (veganos, carnívoros, etc.). Como buen anfitrión, esperas organizar a tus invitados de la mejor forma posible.
La normalización en bases de datos equivaldría a organizar la lista de invitados de manera que evites la duplicación innecesaria de información y garantices que los datos (tus comensales) estén bien estructurados.
La normalización tiene como objetivo optimizar los datos y brindar integridad, sus principales beneficios son:
El proceso consta de etapas secuenciales llamadas formas normales (FN), se parte en la primera forma normal (1FN) pudiendo llegar hasta la sexta (6FN), aunque tradicionalmente se llega hasta la tercera forma normal.
El concepto de formas normales fue propuesto por Edgar F. Codd, quien presentó sus ideas en un artículo titulado :"A Relational Model of Data for Large Shared Data Banks" publicado en 1970. Las formas normales han evolucionado a lo largo del tiempo, en esta artículo explicaremos las primeras 3 formas normales a través de un ejemplo sencillo.
Una tabla se encuentra en primera forma normal si y sólo si:
Consideremos el siguiente ejemplo de estudiantes de un colegio, ¿la tabla cumple las reglas de primera forma normal (1FN)?
ID_ESTUDIANTE | RUT | NOMBRE | CURSO | NACIONALIDAD |
1 | 20286841-K | Jorge | Matemáticas, Lenguaje | Chile |
2 | 18075847-K | Brenda | Matemáticas | Colombia |
3 | 17016778-3 | Luis | Historia | Argentina |
4 | 21616330-3 | Flor | Historia, Ciencias | Cuba |
A continuación se destaca qué oportunidades de mejoras existen para llegar a la 1FN:
ID_ESTUDIANTE | RUT | NOMBRE | CURSO | NACIONALIDAD |
1 | 20286841-K | Jorge | Matemáticas, Lenguaje | Chile |
2 | 18075847-K | Brenda | Matemáticas | Colombia |
3 | 17016778-3 | Luis | Historia | Argentina |
4 | 21616330-3 | Flor | Historia, Ciencias | Cuba |
Las celdas en amarillo cuentan con datos divisibles (no atómicos), una alternativa de solución es crear nuevas filas donde los cursos sean simples e indivisibles. Como resultado de aplicar la 1FN tenemos:
ID_ESTUDIANTE | RUT | NOMBRE | CURSO | NACIONALIDAD |
1 | 20286841-K | Jorge | Matemáticas | Chile |
1 | 20286841-K | Jorge | Lenguaje | Chile |
2 | 18075847-K | Brenda | Matemáticas | Colombia |
3 | 17016778-3 | Luis | Historia | Argentina |
4 | 21616330-3 | Flor | Historia | Cuba |
4 | 21616330-3 | Flor | Ciencias | Cuba |
Se centra en la eliminación de dependencias parciales en una tabla. Una tabla está en 2FN si cumple con dos condiciones:
Las reglas mencionadas nos invitan a definir:
Continuando con el ejemplo, es muy conveniente separar la informacion de los cursos y estudiantes en nuevas tablas en la base de datos. Los cursos pueden tener su propia información clave en el futuro lo que nos brinda flexibilidad para extenderla (agregar campos), logrando así eliminar la dependencia parcial de los cursos con los estudiantes.
Al realizar la segunda forma normal obtendremos tres tablas: Estudiantes, Cursos y una tabla de Referencia para la dependencia que tienen estos atributos
ID_ESTUDIANTE | RUT | NOMBRE | NACIONALIDAD |
1 | 20286841-K | Jorge | Chile |
2 | 18075847-K | Brenda | Colombia |
3 | 17016778-3 | Luis | Argentina |
4 | 21616330-3 | Flor | Cuba |
ID_CURSO | NOMBRE_CURSO |
1 | Matemáticas |
2 | Lenguaje |
3 | Historia |
4 | Ciencias |
ID_ESTUDIANTE | ID_CURSO |
1 | 1 |
1 | 2 |
2 | 1 |
3 | 3 |
4 | 3 |
4 | 4 |
La tercera forma normal va un paso más alla asegurando que una o más tablas:
La dependencia transitiva ocurre cuando una columna depende de otra que a su vez no es una clave principal. Consideremos los siguientes campos para una librería (BD): ID_PEDIDO, TITULO_LIBRO, AUTOR_LIBRO, y EDITORIAL_LIBRO. El campo, ID_PEDIDO depende directamente de TITULO_LIBRO, dado que cada pedido está asociado a un título de libro específico. Sin embargo, tanto AUTOR_LIBRO como EDITORIAL_LIBRO dependen indirectamente de ID_Pedido a través de su dependencia con TITULO_LIBRO, puesto que cada libro (identificado por su título) está vinculado a un único autor y a una única editorial. Esta cadena de dependencias muestra que AUTOR_LIBRO y EDITORIAL_LIBRO tienen una dependencia transitiva respecto a ID_PEDIDO a través de TITULO_LIBRO.
Retomando nuestro ejemplo, consideremos las entidades Curso y Profesor antes de aplicar 3FN. Originalmente, si tuviéramos una estructura donde el detalle del curso incluyera tanto el nombre del curso como el del profesor, estaríamos ante una dependencia transitiva. En este escenario, el ID_CURSO sería nuestra clave primaria en la tabla Cursos con campos adicionales como NOMBRE_CURSO y NOMBRE_PROFESOR.
Por lo tanto, NOMBRE_PROFESOR tiene una dependencia transitiva con ID_CURSO a través de NOMBRE_CURSO. Cada curso, identificado por ID_CURSO, está asignado a un único profesor y el profesor depende del curso que enseña. La 3FN propone separar a los profesores en una tabla adicional vinculada a cursos, a través de un ID_PROFESOR, eliminando así la dependencia transitiva.
ID_CURSO | NOMBRE_CURSO | RUT_PROFESOR | NOMBRE_PROFESOR |
1 | Matemáticas | 12314658-1 | Sam |
2 | Lenguaje | 12175487-8 | Claudia |
3 | Historia | 11871128-9 | Nicanor |
4 | Ciencias | 9126316-5 | Tamara |
A continuación se realiza el proceso de normalización quedando:
ID_PROFESOR | RUT | NOMBRE |
1 | 12314658-1 | Sam |
2 | 12175487-8 | Claudia |
3 | 9126316-5 | Tamara |
4 | 11871128-9 | Nicanor |
ID_CURSO | NOMBRE | ID_PROFESOR |
1 | Matemáticas | 1 |
2 | Lenguaje | 2 |
3 | Historia | 4 |
4 | Ciencias | 3 |
A modo resumen, el siguiente diagrama sintetiza el proceso de normalización para el ejemplo del colegio:
Las formas normales en bases de datos surgieron como un conjunto de reglas y principios para organizar la información de manera eficiente y evitar redundancias. Habitualmente se suguiere aplicar hasta la 3FN porque balancea bien las cosas entre no ser demasiado complicado y mantener la información de forma clara, aunque otras formas normales como la Sexta (6FN) y la DKFN pueden ser útiles para situaciones más específicas.
La normalización no solo se aplica a la hora de crear software, también es utilizada para crear Data Warehouses bajo el paradigma de Hub and Spoke propuesto por Bill Inmon. El nombre de esta arquitectura se conoce como Corporate Information Factory. También existen escenarios donde la opción más óptima es una Desnormalización, como se explica en este artículo sobre Data Warehouses Dimensionales
Nota: Si crees que este contenido puede ser útil para otras personas no dudes en compartirlo. Además te invitamos a seguirnos en Linkedin, Twitter, Facebook, Instagram y Youtube. Mientras en el Blog liberamos contenido más extenso, en las RRSS publicamos semanalmente tips relacionados con Data Warehouse, BI, Data Science y Visualización de Datos que es justamente lo que más nos apasiona hacer en Lituus.