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
IDProducto
Categorias
P001
Electrónica, Informática
P002
Accesorios
Dos valores en una celda → no se puede filtrar correctamente
✅ Cumple 1FN
IDProducto
Categoria
P001
Electrónica
P001
Informática
P002
Accesorios
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)
IDPedido
IDProducto
NomProducto
Cantidad
001
P01
Laptop
2
002
P01
Laptop
1
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
IDProducto
CodCategoria
NomCategoria
P001
C01
Electrónica
P002
C01
Electró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.
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
Normalizar = eliminar redundancia, ideal para DWH y sistemas transaccionales
Desnormalizar = optimizar consultas analíticas, ideal para modelos semánticos de BI
En Power BI, las dimensiones suelen estar desnormalizadas (esquema estrella)
Las tablas de hechos siempre deben estar muy normalizadas (solo FKs + métricas, sin atributos)
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. 🌸