Desnormalización de Base de Datos
La desnormalización es el proceso intencional de introducir redundancia en una base de datos para mejorar el rendimiento.
Cristian Escalante
Última actualización: 11 de mayo de 2025
Desnormalización de Base de Datos
La desnormalización es el proceso intencional de introducir redundancia en una base de datos para mejorar el rendimiento. A diferencia de la normalización (que busca eliminar duplicación de datos), la desnormalización sacrifica un poco de eficiencia en el almacenamiento para ganar velocidad en las consultas.
¿Por qué desnormalizar?
- Consultas más rápidas: Al tener datos redundantes, las consultas pueden ser más rápidas porque requieren menos uniones (joins) entre tablas.
- Simplicidad: En algunos casos, una estructura de datos desnormalizada puede ser más fácil de entender y trabajar, especialmente en sistemas donde la velocidad es crítica.
- Mejor rendimiento en lecturas: En aplicaciones donde las lecturas son mucho más frecuentes que las escrituras, la desnormalización puede ser beneficiosa.
- Optimización de consultas: Algunas consultas complejas pueden ser optimizadas al tener datos relacionados en una sola tabla, evitando múltiples uniones.
::Alert
title: Nota variant: info description: Desnormalizar no es una excusa para diseñar base de datos desorganizadas. Se recomienda usar después de normalizar y evaluar el rendimiento.
::
Ejemplo de desnormalización
Base de datos normalizada (Tienda Online):
-- Tabla "Clientes"
CREATE TABLE clientes (
id INT PRIMARY KEY,
nombre VARCHAR(100),
email VARCHAR(100)
);
-- Tabla "Pedidos"
CREATE TABLE pedidos (
id INT PRIMARY KEY,
cliente_id INT,
fecha DATE,
FOREIGN KEY (cliente_id) REFERENCES Clientes(id)
);
Para ver el nombre del cliente en un pedido, tendríamos que hacer una unión entre las tablas clientes
y pedidos
:
SELECT p.id, c.nombre AS nombre_cliente, p.fecha
FROM pedidos p
JOIN clientes c ON p.cliente_id = c.id;
La base de datos desnormalizada (Tienda Online Desnormalizada):
CREATE TABLE pedidos (
id INT PRIMARY KEY,
cliente_id INT,
nombre_cliente VARCHAR(100), -- ¡Dato duplicado!
fecha DATE
);