Normalizar datos en una base de datos es el proceso de organizar los datos en tablas de tal manera que los resultados al utilizar la base de datos sean siempre inequívocos y dan el resultado que se pretende. Normalizar datos es algo intrínseco a la teoría de la base de datos relacional. Puede tener el efecto de duplicar datos dentro de una base de datos y frecuentemente resulta en la creación de tablas adicionales.
El concepto de normalizar datos se remonta a un investigador de IBM que en 1970 publicó un documento describiendo el modelo de base de datos relacional. Desde entonces otras teorías, incluyendo la desnormalización, también han ido apareciendo.
¿Por qué normalizar datos?
Aunque normalizar datos tiende a aumentar la duplicación de datos, no produce redundancia en la base de datos, lo cual sería una duplicación innecesaria. Normalizar datos es estrictamente un proceso de refinamiento después de un ejercicio inicial de identificar los objetos de datos que deberían estar en la base de datos relacional, identificando sus relaciones y definiendo las tablas requeridas y las columnas dentro de cada tabla.
Imaginemos una sola tabla con tres columnas: nombre del cliente, artículo comprado y precio de compra. Si queremos utilizar esa tabla para hacer un seguimiento del precio de los artículos pero por alguna razón deseamos eliminar a uno de los clientes, también eliminaríamos el precio. Normalizar datos significa entender eso y resolver el problema dividiendo esta tabla en dos tablas, una con información sobre los clientes y el producto que compraron, y una segunda con cada producto y su precio. Añadir o eliminar datos en cualquiera de las tablas no afectaría a la otra.
La capacidad de normalizar datos para evitar o reducir anomalías de datos, redundancia de datos y duplicaciones de datos, al tiempo que se mejora la integridad de los datos, la han convertido en una parte importante del conjunto de herramientas del desarrollador de bases de datos durante muchos años. Ha sido una de las características del modelo de datos relacional.
Con el tiempo las continuas reducciones en el coste del almacenamiento en disco así como nuevas arquitecturas analíticas han recortado la supremacía de la normalización. El aumento de la desnormalización como alternativa comenzó en serio con la llegada de los Data Warehouse a partir de la década de 1990. Más recientemente han surgido bases de datos NoSQL orientadas a documentos. Estos sistemas no relacionales a menudo utilizan tipos de almacenamiento no orientados a disco.
En estos momentos, arquitectos y desarrolladores de datos equilibran normalizar datos y desnormalizar datos a medida que diseñan su sistema.
¿Por qué desnormalizar datos?
La desnormalización es una estrategia utilizada en una base de datos previamente normalizada para aumentar su rendimiento. La idea detrás de ella es agregar datos redundantes donde pensamos que nos ayudarán más. Podemos utilizar atributos adicionales en una tabla existente, agregar nuevas tablas o incluso crear instancias de tablas existentes. El objetivo habitual es disminuir el tiempo de ejecución de las consultas haciendo que los datos sean más accesibles generando informes resumidos en tablas separadas.
Normalizar datos es el punto de partida para el proceso de desnormalización. Es importante diferenciar una base datos que no ha sido normalizada de la base de datos que se normaliza primero y luego se desnormaliza. La segunda está bien y la primera es a menudo el resultado del mal diseño de una base de datos o de una falta de conocimiento.
Es necesario estar seguro de por qué se desea aplicar la desnormalización. Necesitas también estar seguro de que el beneficio de usarlo supera cualquier daño. Hay algunas situaciones en las que se debería pensar en desnormalización:
- Mantenimiento de un histórico: los datos pueden cambiar con el tiempo y tenemos que almacenar valores que eran válidos cuando se creó un registro. El nombre y apellido de una persona puede cambiar, un cliente también puede cambiar su nombre comercial o cualquier otro dato. Los detalles de ciertas consultas deben contener valores que eran reales en el momento en que se generaron. No seríamos capaces de recrear los datos del pasado correctamente si esto no es así. Podríamos resolver este problema agregando una tabla que contiene el historial de estos cambios. Pero en este caso, una consulta podría ser muy complicada.
- Mejorar el rendimiento de las consultas: algunas consultas pueden utilizar varias tablas para acceder a los datos que con frecuencia necesitamos. Piensa en una situación en la que tuviéramos que unir 10 tablas para devolver el nombre de un cliente y los productos que se vendieron. Algunas tablas también podían contener grandes cantidades de datos.
- Aceleración de presentación de informes: si necesitamos algunas estadísticas con mucha frecuencia, crearlas a partir de datos en vivo requiere mucho tiempo y puede afectar al rendimiento general del sistema.
- Tener precalculados valores que utilizamos con frecuencia: algunos valores es posible que queremos tenerlos listos para no tener que generarlos con datos en vivo.
Normalizar datos y luego desnormalizarlos es un concepto muy interesante y poderoso. Aunque no siempre es el primero que debe tenerse en cuenta para mejorar el rendimiento, en algunas situaciones puede ser la mejor o incluso la única solución.