⚖️

Normalización vs Desnormalización

Cuándo conviene cada enfoque, cómo afecta al rendimiento y la guía práctica para tomar la decisión correcta en tu modelo de Power BI

Intermedio
⚖️

¿Qué significan estos términos?

Dos filosofías de organización de datos

Normalizar un modelo de datos es como organizar tu armario en cajones 🗂️: cada tipo de ropa en su sitio, sin duplicados, todo ordenadito. Si cambias el nombre de una categoría, lo cambias en un solo lugar y el cambio se propaga a todas partes automáticamente.

Desnormalizar es como preparar una maleta para un viaje 🧳: juntas todo lo que necesitas para un propósito concreto, aunque repitas algún dato. Es menos "perfecto" en papel, pero más práctico para lo que necesitas hacer ahora mismo.

Ninguno de los dos enfoques es mejor en absoluto — depende del contexto de uso. La clave es saber cuál aplicar y cuándo.

💡 La regla general del mundo de los datos: Los Data Warehouses (DWH) tienden a estar más normalizados para garantizar consistencia y eficiencia de almacenamiento. Los modelos semánticos de BI (incluido Power BI) suelen estar más desnormalizados para maximizar el rendimiento de las consultas analíticas y simplificar la experiencia del usuario.
🗂️

Cuándo normalizar (Data Warehouse)

La filosofía del dato único y consistente

La normalización busca que cada dato exista en un único lugar. Sus objetivos son:

  • Eliminar redundancia (cada dato se guarda una sola vez)
  • Garantizar integridad (una actualización se propaga correctamente)
  • Reducir anomalías de inserción, modificación y borrado
  • Optimizar el almacenamiento en bases de datos relacionales clásicas

¿Cuándo normalizar?

  • Cuando diseñas el Data Warehouse o Data Lakehouse de origen (capa de almacenamiento)
  • Cuando los datos se actualizan con frecuencia — sistemas OLTP o transaccionales
  • Cuando el equipo de datos necesita mantener la consistencia a largo plazo
  • Cuando el modelo tiene millones de filas con mucha repetición de texto largo
  • En Microsoft Fabric Warehouse, SQL Server o PostgreSQL como capa de base de datos

Ejemplo — modelo normalizado (copo de nieve):

  'Familias'
  ┌──────────────────┐
  │ IDFamilia     PK │
  │ NomFamilia       │
  └──────────────────┘
           ▲ FK
  'Categorias'
  ┌──────────────────┐
  │ IDCategoria   PK │
  │ NomCategoria     │
  │ IDFamilia     FK │
  └──────────────────┘
           ▲ FK
  'SubCategorias'
  ┌──────────────────┐
  │ IDSubCat      PK │
  │ NomSubCat        │
  │ IDCategoria   FK │
  └──────────────────┘
           ▲ FK
  'Productos'
  ┌──────────────────┐
  │ IDProducto    PK │
  │ NomProducto      │
  │ IDSubCat      FK │
  └──────────────────┘
           │ 1:N
           ▼
  'Ventas'
  ┌──────────────────┐
  │ IDProducto    FK │
  │ Importe          │
  └──────────────────┘

  ✦ Sin duplicados · 4 tablas de dimensión · 4 relaciones
🧳

Cuándo desnormalizar (BI / Power BI)

La filosofía del modelo rápido y simple

La desnormalización acepta cierta redundancia de datos a cambio de:

  • Reducir el número de relaciones y JOINs necesarios en el modelo
  • Acelerar las consultas analíticas (OLAP) al evitar cruces costosos
  • Simplificar el modelo para que sea más intuitivo para el negocio
  • Aprovechar la compresión de VertiPaq, que gestiona muy bien los datos repetidos

¿Cuándo desnormalizar?

  • Cuando diseñas el modelo semántico de Power BI / Fabric Semantic Model
  • Cuando los datos son de solo lectura y se refrescan en bloque (no fila a fila)
  • Cuando la prioridad es el rendimiento de las queries analíticas
  • Cuando quieres simplificar el modelo para que el equipo de negocio lo use con autonomía
  • En Power BI Desktop, Azure Analysis Services o Fabric Semantic Model

Ejemplo — modelo desnormalizado (estrella):

  'DimProductos'
  ┌──────────────────────────────┐
  │ IDProducto        PK         │
  │ NomProducto                  │
  │ NomSubCategoria              │  ← antes en SubCategorias
  │ NomCategoria                 │  ← antes en Categorias
  │ NomFamilia                   │  ← antes en Familias
  └──────────────────────────────┘
           │ 1:N
           ▼
  'Ventas'
  ┌──────────────────────────────┐
  │ IDProducto        FK         │
  │ Importe                      │
  └──────────────────────────────┘

  ✦ 1 sola tabla de dimensión · 1 relación · queries más rápidas
💡 Tip VertiPaq: El motor de almacenamiento de Power BI comprime datos en columnas usando codificación por valor y por hash. Un string como "Electrónica" que aparece 50.000 veces en una columna se almacena prácticamente igual que si apareciese una sola vez. La desnormalización no penaliza tanto en tamaño de modelo como podrías intuir, y el beneficio en rendimiento de consultas suele superar con creces el coste de almacenamiento.
📊

Los trade-offs reales

Comparativa honesta entre los dos enfoques

Aquí no hay respuestas universalmente correctas — solo contextos. Esta tabla resume los trade-offs reales para ayudarte a decidir:

Aspecto Normalizado Desnormalizado
Almacenamiento en DWH/SQL ✅ Más eficiente ❌ Más espacio en disco
Almacenamiento en Power BI ⚠️ Similar (VertiPaq comprime) ✅ Similar (VertiPaq comprime)
Rendimiento de queries ❌ Más lento (más JOINs) ✅ Más rápido
Nº de relaciones en modelo ❌ Más relaciones ✅ Menos relaciones
Mantenibilidad del dato ✅ Un solo lugar por dato ❌ Actualizar muchas filas si cambia algo
Simplicidad del modelo ❌ Más tablas, más complejo ✅ Más simple, más intuitivo
Flexibilidad analítica ✅ Muy flexible para queries complejas ⚠️ Más rígido si cambia la lógica
Ideal para DWH · OLTP · SQL · Fabric Warehouse Semantic Model · Power BI · SSAS · AAS
⚠️ Ojo con esto: En Power BI, tener muchas relaciones (especialmente bidireccionales) puede degradar el rendimiento significativamente, porque el motor debe evaluar la propagación de filtros en cada consulta. La desnormalización estratégica de las dimensiones reduce el número de relaciones y suele ser la mejor decisión para el modelo semántico, aunque signifique algunos datos repetidos.
📐

Las formas normales explicadas fácil

Sin jerga académica innecesaria

Las formas normales son reglas que, si sigues, garantizan que tu modelo no tiene redundancias problemáticas. Aquí van las tres más relevantes para el trabajo con Power BI.

1FN

Primera Forma Normal

Regla: cada celda contiene un solo valor. No hay listas dentro de celdas.

❌ No cumple 1FN
IDProductoCategorias
P001Electrónica, Informática
P002Accesorios

Dos valores en una celda → no se puede filtrar correctamente

✅ Cumple 1FN
IDProductoCategoria
P001Electrónica
P001Informática
P002Accesorios

Una fila por valor → Power BI puede filtrar y contar correctamente

2FN

Segunda Forma Normal

Regla: todo dato depende de la clave completa, no de una parte de ella. Aplica cuando la clave primaria es compuesta.

❌ No cumple 2FN — clave: (IDPedido + IDProducto)
IDPedidoIDProductoNomProductoCantidad
001P01Laptop2
002P01Laptop1

NomProducto depende solo de IDProducto, no del pedido completo

✅ Cumple 2FN

Tabla Pedido_Producto: (IDPedido, IDProducto, Cantidad)

Tabla Productos: (IDProducto, NomProducto)

Cada tabla tiene datos que dependen solo de su propia clave

3FN

Tercera Forma Normal

Regla: ningún dato depende de otro que no sea la clave primaria (sin dependencias transitivas).

❌ No cumple 3FN
IDProductoCodCategoriaNomCategoria
P001C01Electrónica
P002C01Electrónica

NomCategoria depende de CodCategoria, no de IDProducto

✅ Cumple 3FN

Tabla Productos: (IDProducto, CodCategoria)

Tabla Categorias: (CodCategoria, NomCategoria)

Cada dato depende solo de la clave de su tabla

💡 Tip para Power BI: Lo más importante es entender 1FN y 3FN. La 1FN es básica para que los datos estén bien estructurados y puedan filtrarse. La 3FN te indica cuándo tiene sentido separar en tablas diferentes — aunque en el modelo semántico de BI, a veces rompemos la 3FN intencionalmente (desnormalizando) para ganar rendimiento. Y eso está bien, siempre que sea una decisión consciente.
🗺️

Guía práctica de decisión

Cuatro preguntas para tomar la decisión correcta

❓ ¿Estás diseñando el origen de datos (DWH, Data Lake, SQL, Fabric Warehouse)?
→ SÍ Normaliza siguiendo las formas normales (hasta 3FN como mínimo). La consistencia a largo plazo vale más aquí.
→ NO Pasa a la pregunta 2.
❓ ¿Es el modelo semántico de Power BI o Analysis Services?
→ SÍ Desnormaliza las dimensiones (esquema estrella). Aplana jerarquías en Power Query antes de cargar.
→ NO Pasa a la pregunta 3.
❓ ¿Los datos se actualizan fila a fila constantemente (sistema OLTP, ERP, CRM)?
→ SÍ Normaliza para evitar anomalías de actualización. Una sola fila que cambiar es infinitamente mejor que miles.
→ NO Desnormaliza para optimizar las consultas analíticas. Los refrescos en bloque no tienen el problema de las anomalías.
❓ ¿Tienes problemas de rendimiento en Power BI (queries lentas, modelo pesado)?
→ SÍ Revisa si hay tablas muy normalizadas que puedas aplanar en Power Query. Cada relación que elimines mejora el rendimiento.
→ NO Mantén el diseño actual — si funciona bien, no lo toques.

La regla de oro para Power BI:

  • Tablas de hechos (Ventas, Pedidos, Transacciones): muy normalizadas — solo FKs y métricas, sin atributos descriptivos
  • Tablas de dimensiones (Productos, Clientes, Calendario): desnormalizadas — todos los atributos directamente en la tabla, sin sub-tablas
🔬

Ejemplos reales comparados

Ejemplo 1 — Jerarquía de productos con familia, categoría y subcategoría

Enfoque normalizado (DWH en SQL Server):

  Familias      (IDFamilia, NomFamilia)
  Categorias    (IDCategoria, NomCategoria, IDFamilia FK)
  SubCategorias (IDSubCat, NomSubCat, IDCategoria FK)
  Productos     (IDProducto, NomProducto, Precio, IDSubCat FK)

  Query SQL para obtener el nombre completo de la jerarquía:
  SELECT p.NomProducto, sc.NomSubCat, c.NomCategoria, f.NomFamilia
  FROM   Productos p
  JOIN   SubCategorias sc ON p.IDSubCat     = sc.IDSubCat
  JOIN   Categorias    c  ON sc.IDCategoria = c.IDCategoria
  JOIN   Familias      f  ON c.IDFamilia    = f.IDFamilia
  → 3 JOINs necesarios para cada consulta

Enfoque desnormalizado (DimProductos en Power BI):

  DimProductos  (IDProducto, NomProducto, Precio,
                  NomSubCat, NomCategoria, NomFamilia)
  → 0 JOINs necesarios · 3 relaciones menos en el modelo semántico ✅

Código Power Query (M) para aplanar la jerarquía en una sola tabla:

Power Query — M

let
    Productos     = ...,  // tabla de origen
    SubCategorias = ...,
    Categorias    = ...,
    Familias      = ...,

    // Paso 1: unir Productos con SubCategorias
    Join1   = Table.NestedJoin(Productos, "IDSubCat",
                SubCategorias, "IDSubCat", "SubCat", JoinKind.Left),
    Expand1 = Table.ExpandTableColumn(Join1, "SubCat",
                {"NomSubCat", "IDCategoria"}),

    // Paso 2: unir con Categorias
    Join2   = Table.NestedJoin(Expand1, "IDCategoria",
                Categorias, "IDCategoria", "Cat", JoinKind.Left),
    Expand2 = Table.ExpandTableColumn(Join2, "Cat",
                {"NomCategoria", "IDFamilia"}),

    // Paso 3: unir con Familias
    Join3   = Table.NestedJoin(Expand2, "IDFamilia",
                Familias, "IDFamilia", "Fam", JoinKind.Left),
    Expand3 = Table.ExpandTableColumn(Join3, "Fam", {"NomFamilia"}),

    // Limpiar: quitar FKs intermedias que ya no son necesarias
    QuitarFKs = Table.RemoveColumns(Expand3,
                  {"IDSubCat", "IDCategoria", "IDFamilia"})
in
    QuitarFKs
📌 Buena práctica: Este patrón de aplanar jerarquías en Power Query es una de las técnicas de optimización más habituales en proyectos Power BI profesionales. Lo aplicas una sola vez en la capa de transformación, el modelo semántico queda limpio, y las consultas DAX vuelan.

Ejemplo 2 — Gestión de clientes con dirección

Normalizado (DWH)

Clientes: (IDCliente, Nombre, IDDireccion)

Direcciones: (IDDireccion, Calle, Ciudad, CP, Pais)

Desnormalizado (Power BI)

DimClientes: (IDCliente, Nombre, Calle, Ciudad, CP, Pais)

¿Vale la pena desnormalizar aquí?

  • Si un cliente tiene una sola dirección: desnormaliza — es una relación 1:1, no hay ganancia en separarla
  • Si un cliente puede tener múltiples direcciones: NO desnormalices — necesitas una tabla puente o una dimensión de dirección separada
🎯

Resumen y siguiente paso

Los 5 puntos que debes llevarte

📋 Checklist normalización en Power BI

  1. Normalizar = eliminar redundancia, ideal para DWH y sistemas transaccionales
  2. Desnormalizar = optimizar consultas analíticas, ideal para modelos semánticos de BI
  3. En Power BI, las dimensiones suelen estar desnormalizadas (esquema estrella)
  4. Las tablas de hechos siempre deben estar muy normalizadas (solo FKs + métricas, sin atributos)
  5. VertiPaq comprime bien los datos repetidos → la desnormalización no penaliza tanto en tamaño como se intuye, y el beneficio en rendimiento es real
🚀 ¡Enhorabuena! Ya entiendes uno de los conceptos más debatidos en el mundo del modelado de datos. Con la normalización, la desnormalización y las tablas puente dominadas, tienes las bases para construir modelos de datos realmente profesionales en Power BI. El siguiente paso: explorar patrones avanzados como Role-Playing Dimensions y Slowly Changing Dimensions para llevar tu arquitectura al siguiente nivel. 🌸