Normalizar una base de datos: Ejemplo Completo

Normalizar una base de datos. La normalización de Bases de Datos es un factor muy importante en la creación de páginas web dinámicas y/o sistemas web. Sin embargo, es un proceso de organización que se basa en optimizar nuestro sistema hacia el futuro y no tenga ningún inconveniente cuando nuestra base de datos contenga millones de registros.
¿Qué sucede si mi base de datos no está normalizada?
Primeramente, si tus tablas no están correctamente optimizadas y/0 normalizadas, a largo plazo te pueden causar muchos problemas a la hora de realizar consultas SQL en el código PHP para extraer los datos que necesitas mostrar en el FRONT-END.
¿Cuál sería la solución para estos inconvenientes?
En este punto tenemos que analizar lo que nos dice la normalización de base de datos y es cumplir con el requisito que dice que todos los atributos deben ser atómicos, es decir que debemos descomponerlo en su mínima expresión la base de datos.
Normalizar una base de datos
Para lograr este objetivo tenemos que seguir varios pasos o procesos. Por lo tanto, en este artículo mostraremos dos ejemplos de normalización de base de datos.

A) Primer ejemplo de normalización: Tabla Usuarios
En este ejemplo vamos a suponer que queremos crear una tabla con la información de usuarios de una empresa, y las columnas para almacenar la información son: nombre, la empresa, la dirección, e-mail, o bien URL. Por lo tanto, en primera instancia comenzaríamos definiendo la siguiente estructura de tabla.
La Formalización CERO
La base de datos que presento esta tabla a continuación:
Es el proceso de formalización de una tabla que contiene varios datos sin ninguna regla o especificación técnica de normalización.

¿Qué errores que podemos encontrar en la tabla anterior?
Primeramente, observa los campos url1 y url2, ¿Qué haremos cuando se necesite una tercera url?
Entonces surgen alternativas de solución para este problema se debe tener las tres reglas de normalización. A continuación, veremos las reglas de normalización.
Primer nivel de Formalización/Normalización.
- Eliminar los campos repetitivos de las tablas individuales.
- Generar una tabla separada por cada campo de datos relacionados.
- Identificar cada campo de datos relacionados con una clave primaria.
Segundo nivel de Formalización / Normalización
- Crear tablas separadas para aquellos campos que se aplican a varios registros.
- Relacionar estas tablas mediante una clave foránea.
Tercer nivel de Formalización / Normalización
- Eliminar aquellos campos que no dependan de la clave.
Aquí les dejare un ejemplo completo de normalización de la tabla usuarios. Sin embargo, se logró separando en varias tablas: Usuarios, empresas, urls. Ahora, se procedió a relacionar de uno a muchos haciendo uso de las claves primarias y foráneas.

Ahora tenemos la clave primaria emprId en la tabla “empresa” relacionada con la clave foránea con recEmpresaId en la tabla usuarios, y podemos añadir 500 usuarios mientras que sólo tenemos que insertar el nombre de un registro ‘ABC‘ una sola vez.
B) Segundo ejemplo de normalización: Tabla Cursos
Para normalizar una tabla en este segundo ejemplo tomaremos una tabla llamada Cursos, veamos a continuación.

Como podemos apreciar esta tabla posee una «formalización cero«, es decir, que está mal estructurada y tendrá errores a futuro cercano.
Recordemos que el proceso de normalización es muy sencillo, veamos cómo podemos formalizar una tabla.
¿Qué es la Normalización de una base de datos?
La normalización de una base de datos relacional (Clave primaria, clave foránea) es un proceso técnico que se descifra en aplicar normas o reglas en una base de datos. Por lo tanto, aplicando estas reglas evitara en un futuro las inconsistencias al realizar consultas SQL.
¿Por qué se normaliza una base de datos?
- Para evitar la redundancia de datos en la tabla
- Proteger los datos (información)
- Evitar problemas de actualización de los datos en las tablas (consultas)
Importante.- Para afirmar que nuestra base de datos está normalizada deben de apreciar que se aplicaron los 3 niveles de normalización. Veamos a continuación.
La primera forma Formalización
Este proceso es el principal y trata de completar unos pasos o procesos que a continuación detallaremos.
- Eliminar los campos repetitivos de las tablas individuales.
- Crear una tabla separada por cada campo o columna de datos relacionados.
- Identificar cada campo de datos relacionados con una clave primaria
¿Cómo saber si lo hemos realizado correctamente?
Para asegurarnos que la normalización esta correcta, debemos considerar los siguientes aspectos:
- Atributos o datos deben ser atómicos. Un atributo es atómico si los elementos son indivisibles, mínimos en su expresión.
- La tabla debe de contener una clave primaria única.
- La clave primaria no debe de contener atributos nulos. Podemos darle solución con la opción (Auto incremento)
- Nuestra tabla no debe existir variación en el número de columnas.
- Los campos no clave deben identificarse por la clave (Dependencia Funcional).
- Debe existir una independencia del orden tanto de las filas como de las columnas, es decir, si los datos cambian de orden no deben cambiar en las consultas SQL.
- La tabla normalizada no puede tener múltiples valores en una determinada columna.
- Los datos deben de ser atómicos.
La segunda forma Formalización
Ya pasamos a la segunda fase y debemos cumplir los siguientes puntos:
- Crear tablas separadas para aquellos grupos de datos que se aplican a varios
registros. - Relacionar estas tablas mediante una clave foránea.
Para asegurarnos que estamos en la segunda fase, tenemos que haber cumplido la primera fase y sus pasos. Además, si sus atributos no principales dependen de forma completa de la clave principal de una determinada tabla.
La tercera forma Formalización
Obviamente en este paso ya deberíamos haber cumplido la primera y segunda forma. A continuación, veamos los pasos para completar el proceso de normalización.
- Eliminar aquellos campos que no dependan de la clave primaria.
- Ninguna columna puede depender de una columna que no tenga una clave primaria.
- No puede haber datos derivados.
Ejemplo de tabla con formalización cero:
Vamos a darle solución a esta tabla llamada «CURSOS» para entender mucho mejor todo el proceso de normalización.
A simple vista podemos apreciar que esta tabla no cumple con el requisito mínimo de normalización que dice que toda la información deben de ser atómicos, es decir que debemos de descomponerlo en su mínima expresión de datos.
La solución: Formalizar la Tabla Cursos
La primera fase es crear tablas separadas para Cursos, para docentes, para manuales y cada una de estas tendría su clave primaria y estarían relacionadas por una clave foránea (Foreign Key).
Tabla de Cursos:
Esta tabla posee el nombre del curso y está relacionada a manualId y docenteId

Tabla de Docente:
Recudiendo en su mínima expresión, separando en apellidos paternos, apellidos maternos, nombres y fecha de registro.

Tabla de Manual:
Esta tabla está relacionada con la «tabla cursos» de uno a muchos mediante clave primaria.

La segunda fase de formalización
Es relacionar las tablas mediante una clave primaria y clave foránea.

Para terminar debemos de eliminar aquellos campos que no dependan de la clave y con esto, nuestra tabla cumpliría con los requisitos de la Tercera forma de normalización y estaría lista para trabajar.
CONCLUSIÓN DE NORMALIZAR UNA BASE DE DATOS
En este artículo hemos expuesto dos ejemplos para normalizar una base de datos y le hemos dado una solución. Sin embargo, quiero comunicarte que el proceso de normalización es muy importante a corto y largo plazo si estamos realizando un proyecto online.
Desde un inicio ya se debe de estar creando tablas relacionales aplicando estos procesos de formalización, para así evitar dolores de cabeza en un futuro cercano.
Espero que esta breve explicación les ayude a normalizar sus tablas en su base de datos.
Muy buena la descripción del uso de la normalización de tablas relacionales.
Gracias.
Muy buen articulo, su expicacion y ejemplos estan muy entendibles.
hola gracias por la información pero tengo una duda, estoy empezando con esto de las bases de datos y mi pregunta es cuando se debe normalizar, dado que tengo entendido que se crean un diagrama entidad – relación del cual posteriormente obtenemos un diagrama relacional pero como se normaliza este diagrama o la normalizacion solo se aplica a bases de datos ya existentes con datos almacenados en ellas? o se puede normalizar un diagrama relacional obtenido a través de un diagrama entidad-relacion? y en su defecto como se hace este proceso espero me pueda ayudar he buscado en todas partes pero siempre ponen como ejemplo unsa sola tabla y nunca dicen de donde salieron esos atributos, espero su repuesta gracias ,saludos cordiales.
Hola ! Buen articulo,te hago una consulta¿La tabla cursos y la tabla docentes no deberían tener una relación de muchos a muchos? Ya que un un docente puede dictar muchos cursos y un curso mismo curso puede ser dictado por muchos docentes , para esto deberíamos hacer una tabla intermedia si no me equivoco. Espero puedas sacarme esta duda ,Saludos desde Argentina.
muy buen articulo pero me surge esta situación: si por ejemplo se crea un mini crud con estas tablas de este articulo, partiendo que la base de datos va estar en blanco, para alimentar la tabla de url tendria que crear un usuario primero y ya luego llenar la tabla url pero como seria para hacerlo en el mismo proceso todo junto ? osea como vaya creando mi usuario quiero crear las url con el idUsuario creado sin tener que dividirlo en 2 procesos diferentes, espero haberme explicado bien
Hola Luis,
Lo ideal sería primero crear el usuario y después las URLs, pero como mencionas deseas crear en un solo proceso, dos tareas, tendrías que hacer un formulario que tome los datos del usuario con las URLs.
1) La primera condición (consulta SQL) agrega primero al usuario en su respectiva tabla «usuarios».
2) La segunda consulta que agrega las URLs en la tabla «url» pero llevando el ID de la tabla alumnos.
Puedes usar esta opción para obtener el último usuario ingresado
https://www.baulphp.com/ultimo-id-de-insercion-en-mysql
Obtener el ID y en la segunda consulta insertar las URL, lo que lograrías es realizar una acción con dos procesos.
Un saludo, espero haberte ayudado