La normalización de bases de datos es uno de los aspectos más importantes que se deben hacer a la hora de diseñar bases de datos. La normalización es un proceso que se utiliza para organizar y optimizar la estructura de la base de datos, para asegurar su integridad, evitar redundancia y mejorar el rendimiento.
Consiste en la división de las entidades en varias entidades mas pequeñas, y relacionar unas con otras mediante las llaves foráneas. Se realiza a través de varias etapas o niveles que se conocen como las formas normales. Muchos autores comentan que las principales son las 3 primeras formas normales, y existen otros dos niveles más.
El objetivo de la normalización es reducir la redundancia y garantizar la integridad de los datos, asegurando que cada dato se almacene en un sólo lugar, es decir, evitar duplicados, por lo que nuestros datos van a tener mayor consistencia y coherencia, dando lugar a la mejora del rendimiento ya que al tener nuestra base de datos optimizada se va a reducir el tamaño de peso y la complejidad entre las entidades. Si por ejm tenemos una entidad muy grande, es mas complejo hacer operaciones sobre ella, ya que tiene muchas cuestiones a optimizar que tener pequeños fragmentos.
En resumen, tener muchas tablas pero de pequeño tamaño, que solo se preocupen por almacenar un dato en cuestión, o un conjunto de datos que hagan referencia a una sola entidad, es decir, no mezclar entidades.
Formas normales
Las formas normales es el estándar de la organización y del modelado de datos en una base de datos relacional, es un concepto exclusivo de modelos relacionales.
- La primera forma normal nos dice que cada atributo de una entidad debe contener un sólo valor atómico, es decir, los valores deben ser indivisibles, no pueden ser divididos en atributos más pequeños. Por ejm, una dirección incluye calle, número, portal, código postal, entonces esta primera forma normal la podemos hacer partiendo la dirección en los campos que estamos viendo (calle, número, portal…).
- La segunda forma normal nos dice que, además de cumplir la primera forma normal, cada atributo no dependiente funcionalmente de la llave principal debe estar en una entidad separada. Un ejm, en un sistema de gestión escolar, tenemos en la entidad persona el nombre, apellidos, tlfo… y tenemos un campo donde tenemos el perfil (profesor, estudiante…), si este segundo campo tiene más de 5 valores, lo que conviene es crear una entidad denominada por ejm, perfiles, y en esta entidad incluir todos los perfiles (profesor, estudiante, mantenimiento, seguridad…).
- La tercera forma normal dice que, además de cumplir con las dos formas normales anteriores, todas las dependencias funcionales deben ser eliminadas, es decir, no deben existir dependencias funcionales transitorias. Por ejm, imaginemos que en un sistema de ventas tenemos en un Excel los datos del cliente, los de la venta y los del producto, tenemos 3 grandes entidades en una gran entidad, por lo que hay que separar estos niveles.
- La cuarta forma normal, que algunos autores la llaman la forma normal de Boyce-Codd, mas rigurosa que las anteriores, y nos dice que cada dependencia funcional sea una clave candidata única. Significa que nuestras entidades deben estar perfectamente optimizadas.
- La quinta forma normal, denominada también forma normal de clave-valor, o dominio clave, en ella se garantiza que no haya dependencias múltiples de conjuntos de entidades, lo que significa que cada entidad tenga los elementos que directamente dependen de él.
Dependiendo de la complejidad que tenga nuestra base de datos, debemos cumplir o no estas 5 formas normales. Puede ser que lleguemos a la segunda forma normal si estamos hablando de 3 o 4 entidades, a veces podemos llegar a la tercera, que es lo ideal. La cuarta y quinta forma normal ya es en modelos más complejos.
Nota: Lo natural es llegar hasta la tercera forma normal en sistemas muy complejos.
Pasos del modelado de datos
Este es un resumen de los pasos que debemos seguir a la hora de modelar nuestra base de datos.
- Identificar las entidades del sistema
- Identificar los atributos de las entidades
- Identificar las llaves primarias y foráneas
- Asignar una nomenclatura adecuada a las entidades y sus atributos
- Identificar las entidades pivote del sistema
- Identificar los catálogos del sistema
- Identificar los tipos de relaciones del sistema
- Crea el modelo Entidad-Relación del sistema
- Crear el modelo relacional de la base de datos del sistema
- Identificar los tipos de datos de los atributos de las entidades del sistema
- Identificar los atributos que puedan ser únicos en el sistema
- Identificar las reglas de negocio (Operaciones CRUD) del sistema
Nota: en las bases de datos se suele utilizar la sintaxis snake_case.
En conclusión
Es importante tener un equilibrio entre la integridad de los datos y la eficiencia en el modelo de datos.
Ejm
Veamos el modelado de una base de datos escrito con sintaxis markdown.
Nota: para la creación del modelo Entidad-Relación podemos usar una herramienta online, cuya URL es https://diagram.net, también la URL https://www.drawio.com/, o un software como Microsoft Visio o similares.
Sintaxis del archivo Carreras_LogicaNegocio.md.
# Carreras ## Listado de Entidades ### carreras (ED - Entidad de datos) - carrera_id **(PK)** - nombre - tipo_carrera **(FK)** - fecha - tiempo - mejor_tiempo - altitud - lugar - pais **(FK)** - foto ### tipos_carreras (EC - Entidad catálogo) - tipo_carrera_id **(PK)** - descripcion - distancia **(UQ)** ### paises (EC - Entidad catálogo) - pais_id **(PK)** - nombre ## Relaciones 1. Una **carrera** _pertenece_ a un **tipo de carrera** (_1 a 1_) 1. Una **carrera** se _corre_ en un **país** (_1 a 1_) ## Diagramas ### Modelo Entidad - Relación ![Modelo Entidad - Relación](.modeloentrel.png) ### Modelos relacional de la BD ![Modelo Relacional BD](./modelorelacionas.png) ## Reglas de negocio ### carreras 1. Crear el registro de una carrera 1. Leer el registro de una(s) carrera(s) dada una condición en particular 1. Leer todos los registros de la entidad carreras 1. Actualizar los datos de una carrera dada una condición en particular 1. Eliminar los datos de una carrera dada una condición en particular ### tipos_carreras 1. Todas las distancias están expresadas en kms y no se pueden repetir 1. Crear el registro de un tipo de carrera 1. Leer el registro de un o unos tipos de carrera dada una condición en particular 1. Leer todos los registros de la entidad tipos_carreras 1. Actualizar los datos de un tipo de carrera dada una condición en particular 1. Eliminar los datos de un tipo de carrera dada una condición en particular ### paises 1. Crear el registro de un país 1. Leer el registro de un o unos países dada una condición en particular 1. Leer todos los registros de la entidad paises 1. Actualizar los datos de un país dada una condición en particular 1. Eliminar los datos de un país dada una condición en particular
Sintaxis del archivo ModeladoDatos.md.
# Modelado de Datos
1. Identificar las Entidades del sistema
1. Identificar los atributos de las entidades
1. Identificar las llaves primarias y foráneas
1. Asignar una nomenclatura adecuada a las entidades y sus atributos
1. Identificar las entidades pivote del sistema
1. identificar los catálogos del sistema
1. Identificar los tipos de relaciones del sistema
1. Crear el modelo Entidad-Relación del sistema
1. Crear el Modelo Relacional de la base de datos del sistema
1. Identificar los tipos de datos de los atributos de las entidades del sistema
1. Identificar los atributos que puedan ser únicos en el sistema
1. Identificar las reglas de negocio (Operaciones _CRUD_) del sistema
## Glosario
**PK**: _Primery Key_
**FK**: _Foreign Key_
**UQ**: _Campo único (Unique attribute)_
**ED**: _Entidad de datos_
**EP**: _Entidad pivote_
**EC**: _Entidad catálogo_