En el diseño de bases de datos, la normalización y denormalización (o desnormalización) son dos enfoques fundamentales que afectan directamente al rendimiento, integridad y redundancia de los datos. Veamos en detalle cada uno de estos conceptos:

image.png

Normalización

Es un diseño de bases de datos que reduce la redundancia y las dependencias mediante la organización eficiente de las tablas.

image.png

Muy utilizado en sistemas transaccionales OLTP

Beneficios de la Normalización

Formas Normales Principales

Denormalización

Es el proceso de agregar redundancia de manera controlada para mejorar el rendimiento de las consultas en una base de datos.

image.png

Recomendado para sistemas analíticos OLAP

Cuándo Usar la Denormalización

Técnicas de Denormalización

Comparación entre Normalización y Denormalización

Aspecto Normalización Denormalización
Redundancia Minimizada Controlada
Rendimiento Lecturas Puede ser más lento Más rápido
Rendimiento Escrituras Más rápido Más lento
Integridad de Datos Alta Requiere más control

Consideraciones Finales

La elección entre normalización y denormalización depende de varios factores:

No existe una solución única que sirva para todos los casos. La clave está en encontrar el equilibrio adecuado entre normalización y denormalización según las necesidades específicas de tu aplicación.

<aside> 💡 Consejo: Comienza siempre con un diseño normalizado y aplica la denormalización solo cuando sea necesario por razones de rendimiento comprobadas.

</aside>

Ejemplo de Denormalización

Consideremos un sistema de órdenes de compra con las siguientes tablas normalizadas:

erDiagram
    Clientes ||--o{ Ordenes : genera
    Ordenes ||--|{ OrdenDetalles : contiene
    Productos ||--o{ OrdenDetalles : incluye

    Clientes {
        int cliente_id PK
        string nombre
        string direccion
        string ciudad
    }

    Productos {
        int producto_id PK
        string nombre
        decimal precio
        string categoria
    }

    Ordenes {
        int orden_id PK
        int cliente_id FK
        date fecha_orden
    }

    OrdenDetalles {
        int orden_id PK,FK
        int producto_id PK,FK
        int cantidad
        decimal precio_unitario
    }

Versión denormalizada para optimizar consultas de reportes:

erDiagram
    OrdenesCompletas {
        int orden_id PK
        date fecha_orden
        int cliente_id
        string cliente_nombre
        string cliente_ciudad
        int producto_id
        string producto_nombre
        string producto_categoria
        int cantidad
        decimal precio_unitario
        decimal subtotal
        decimal total_orden
    }