Modelado dimensional Kimball: guía práctica de hechos y dimensiones
João Barros
25 de October de 2024
2 min de lectura
La metodología dimensional de Ralph Kimball es el estándar de referencia para data warehousing desde hace más de 30 años. Sus principios — hechos, dimensiones y Bus Architecture — se aplican igual de bien en SQL Server tradicional, Azure Synapse y Microsoft Fabric.
Hechos vs Dimensiones
TABLA DE HECHOS:
- Contiene medidas numéricas (ingresos, cantidad, coste)
- Muchas filas, pocas columnas
- Claves foráneas hacia todas las dimensiones
- Granularidad definida: 1 fila = 1 transacción de venta
TABLA DE DIMENSIÓN:
- Contiene atributos descriptivos (nombre, categoría, región)
- Pocas filas, muchas columnas
- Clave surrogate (INT) como PK — nunca la clave natural
- Desnormalizada (a Kimball no le gusta el snow-flake)
Definir la granularidad — la decisión más importante
Pregunta: "¿Qué representa una fila de la tabla de hechos?"
Granularidad incorrecta: "datos de ventas"
Granularidad correcta: "una fila por línea de venta (line item) en cada factura"
Impacto: si la granularidad es "por factura" y el usuario quiere
análisis por producto, es imposible. Elija siempre la granularidad
más atómica disponible en el origen.
Estructura típica — esquema en estrella
-- Dimensión Cliente (desnormalizada)
CREATE TABLE dbo.DimCliente (
sk_cliente INT IDENTITY PRIMARY KEY, -- surrogate key
nk_cliente INT NOT NULL, -- natural key del origen
nombre NVARCHAR(200),
segmento VARCHAR(50),
pais VARCHAR(100),
region VARCHAR(100), -- desnormalizado (no normalizar en DimPais)
valid_from DATE NOT NULL,
valid_to DATE NOT NULL,
is_current BIT NOT NULL DEFAULT 1
);
-- Tabla de hechos
CREATE TABLE dbo.FactVentas (
sk_fecha INT NOT NULL REFERENCES dbo.DimFecha(sk_fecha),
sk_cliente INT NOT NULL REFERENCES dbo.DimCliente(sk_cliente),
sk_producto INT NOT NULL REFERENCES dbo.DimProducto(sk_producto),
sk_tienda INT NOT NULL REFERENCES dbo.DimTienda(sk_tienda),
ingresos DECIMAL(18,2) NOT NULL,
coste DECIMAL(18,2) NOT NULL,
cantidad INT NOT NULL
);
Tabla de fechas — obligatoria
-- Generar tabla de fechas con todos los atributos necesarios
CREATE TABLE dbo.DimFecha (
sk_fecha INT PRIMARY KEY, -- formato YYYYMMDD como INT
fecha_completa DATE NOT NULL,
anio SMALLINT,
trimestre TINYINT,
mes TINYINT,
nombre_mes VARCHAR(20),
semana TINYINT,
dia_semana TINYINT,
nombre_dia VARCHAR(20),
es_fin_semana BIT,
es_festivo BIT
);
Conclusión
Kimball funciona porque alinea el modelo con la forma en que los usuarios de negocio piensan en los datos. Cada dimensión es una perspectiva de análisis, cada hecho es un evento de negocio. Esta alineación hace los informes más intuitivos y las consultas más simples de escribir y optimizar.