Bases de datos

Normalización

Normalización

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:

  • Mayor consistencia de información
  • Un diseño más simple de nuestra base de datos
  • Mayor eficiencia en nuestras consultas
  • Facilida de mantenimiento de nuestra base de datos

Normalización

En estricto sentido, hay varias formas de normalización:

  • Primera forma normal
  • Segunda forma normal
  • Tercera forma normal
  • Forma normal de Boyce-Codd
  • Cuarta forma normal
  • Quinta forma normal
  • Sexta forma normal

Normalización

En estricto sentido, hay varias formas de normalización:

  • Primera forma normal
  • Segunda forma normal
  • Tercera forma normal
  • Forma normal de Boyce-Codd
  • Cuarta forma normal
  • Quinta forma normal
  • Sexta forma normal

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)

Ejemplo

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

Primera forma normal

Para que una tabla esté en primera forma normal se deben cumplir las siguientes condiciones:

  1. Cada atributo debe contener un valor atómico (es decir, indivisible)
  2. Los atributos deben tener valores consistentes (no se puede tener, por ejemplo, valores en pesos en algunas filas y otros en centavos)
  3. No debe haber filas duplicadas
  4. Cada fila debe estar identificada por una clave primaria

Primera forma normal

Revisando nuestra tabla de ejemplo podemos notar que:

  • El nombre no es un valor atómico
  • El domicilio tampoco es un valor atómico
  • La lista de materias tampoco corresponde a un valor atómico

Primera forma normal

Revisando nuestra tabla de ejemplo podemos notar que:

  • El nombre no es un valor atómico
  • El domicilio tampoco es un valor atómico
  • La lista de materias tampoco corresponde a un valor atómico

Podemos arreglar lo anterior haciendo lo siguiente:

  • Separar el atributo nombre en dos atributos: nombre y apellido*
  • Separar el atributo domicilio en los atributos domicilio, colonia, codigo_postal, ciudad y estado**
  • Separar las materias en atributos distintos
  • Separar el atributo tutor en dos atributos: tutor_nombre y tutor_apellido*

Primera forma normal

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

Primera forma normal

Vamos a enfocarnos, por un momento, sólo en las materias. Podemos separarlas de manera vertical u horizontal

Primera forma normal

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í:

Primera forma normal

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

Primera forma normal

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

Primera forma normal

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:

  • Una misma materia puede aparecer en distintos atributos dependiendo de la fila
  • Cada materia cursada agregaría un atributo más (y eso nos llevaría a varios nulos)

Primera forma normal

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:

  • Una misma materia puede aparecer en distintos atributos dependiendo de la fila
  • Cada materia cursada agregaría un atributo más (y eso nos llevaría a varios nulos)
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

Primera forma normal

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

Primera forma normal

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

Segunda forma normal

Para que una tabla esté en segunda forma normal se deben cumplir las siguientes condiciones:

  • La tabla debe estar en primera forma normal
  • Cualquier atributo que no pertenezca a la clave primaria debe depender únicamente de la clave primaria

Segunda forma normal

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

Segunda forma normal

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

Segunda forma normal

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

Segunda forma normal

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?

Segunda forma normal

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?

Segunda forma normal

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

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

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

¿Y qué pasa ahora con el domicilio del estudiante?

Segunda forma normal

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

Segunda forma normal

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

Segunda forma normal

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

Segunda forma normal

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

Tercera forma normal

Para que una tabla esté en tercera forma normal se deben cumplir las siguientes condiciones:

  • La tabla debe estar en segunda forma normal
  • Ningún atributo que no pertenezca a la clave primaria de la tabla debe depender transitivamente de la clave primaria

Tercera forma normal

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:

  • El estado depende de la ciudad**
  • La ciudad depende del código postal**
  • El código postal depende de la colonia**

Tercera forma normal

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

Tercera forma normal

Y ya tenemos nuestras tablas en tercera forma normal

Normalización

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:

  • tutor
  • materia
  • regiones geográficas (colonia, código postal, ciudad o estado)

Otras formas normales

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

Otras formas normales

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

Bases de datos: Normalización

By Gilberto 🦁

Bases de datos: Normalización

Normalización

  • 48