Cómo crear una junk dimension en un Data Warehouse
Una junk dimension (o dimensión basura) es una técnica de modelado que agrupa varios indicadores de baja cardinalidad — estados, marcadores y opciones — en una única dimensión del Data Warehouse. En lugar de llenar la tabla de hechos con columnas sueltas o crear una minidimensión para cada marcador, lo reúnes todo en una tabla pequeña y fácil de consultar. Veamos, paso a paso y con ejemplos en SQL, cómo crear una junk dimension y conectarla a la tabla de hechos.
Requisitos previos
- Acceso a un Data Warehouse con SQL (SQL Server, Microsoft Fabric o Azure Synapse).
- Permisos para crear tablas e insertar datos.
- Nociones básicas del esquema en estrella: dimensiones y tablas de hechos.
Paso 1: Identificar los atributos candidatos
El primer paso es encontrar columnas con pocos valores distintos y sin atributos descriptivos propios. Imagina una tabla de ventas con tres marcadores: estado del pago (Pagado o Pendiente), canal (Online o Tienda) y regalo (Sí o No). Cada uno tiene solo dos valores. Por sí solos no justifican una dimensión y, si se quedan en la tabla de hechos, la llenan de columnas de texto repetido. Reunirlos en una única dimensión evita a la vez una tabla de hechos ancha y un enjambre de dimensiones minúsculas difíciles de mantener.
Consejo: un buen candidato a junk dimension tiene baja cardinalidad y cambia con poca frecuencia. Las fechas o los clientes, por ejemplo, no entran aquí.
Paso 2: Crear la tabla de la junk dimension
Creamos una tabla con una clave subrogada (surrogate key) y una columna por cada marcador. La clave será la única columna que la tabla de hechos tendrá que guardar.
CREATE TABLE DimTransacao (
TransacaoKey INT NOT NULL,
EstadoPagamento VARCHAR(20) NOT NULL,
Canal VARCHAR(20) NOT NULL,
Oferta VARCHAR(3) NOT NULL
);
Fíjate en que aquí no guardamos ninguna métrica ni fechas: la junk dimension contiene solo los marcadores y su clave.
Paso 3: Generar todas las combinaciones posibles
La idea central es llenar la dimensión con el producto cartesiano de todos los valores. Con CROSS JOIN combinamos las listas y, con ROW_NUMBER(), generamos la clave subrogada automáticamente.
INSERT INTO DimTransacao (TransacaoKey, EstadoPagamento, Canal, Oferta)
SELECT
ROW_NUMBER() OVER (ORDER BY p.EstadoPagamento, c.Canal, o.Oferta),
p.EstadoPagamento,
c.Canal,
o.Oferta
FROM (VALUES ('Pago'), ('Pendente')) AS p(EstadoPagamento)
CROSS JOIN (VALUES ('Online'), ('Loja')) AS c(Canal)
CROSS JOIN (VALUES ('Sim'), ('Nao')) AS o(Oferta);
Como tenemos 2 × 2 × 2 valores, la tabla queda con 8 filas — todas las combinaciones posibles. También es buena práctica añadir un miembro «desconocido» para las filas de hechos sin correspondencia:
INSERT INTO DimTransacao (TransacaoKey, EstadoPagamento, Canal, Oferta)
VALUES (-1, 'Desconhecido', 'Desconhecido', 'N/D');
Paso 4: Conectar la dimensión a la tabla de hechos
Al cargar la tabla de hechos, buscamos la TransacaoKey correspondiente a los tres marcadores y guardamos solo esa clave. Así, la tabla de hechos deja de tener las columnas de texto y hace una única junción pequeña y rápida.
SELECT
v.VendaID,
dt.TransacaoKey,
v.Valor
FROM Staging_Vendas AS v
JOIN DimTransacao AS dt
ON dt.EstadoPagamento = v.EstadoPagamento
AND dt.Canal = v.Canal
AND dt.Oferta = v.Oferta;
Verificar el resultado
Confirma que la dimensión tiene las combinaciones esperadas y prueba una consulta analítica agrupando por los atributos de la junk dimension.
SELECT COUNT(*) AS TotalLinhas FROM DimTransacao;
SELECT dt.Canal, dt.EstadoPagamento, SUM(f.Valor) AS Total
FROM FactVendas AS f
JOIN DimTransacao AS dt ON dt.TransacaoKey = f.TransacaoKey
GROUP BY dt.Canal, dt.EstadoPagamento;
Si la primera consulta devuelve 9 filas (8 combinaciones más el miembro desconocido) y la segunda muestra totales por canal y estado, todo está funcionando.
Conclusión
Con una junk dimension, la tabla de hechos queda más ligera, los filtros se simplifican y el modelo se mantiene limpio incluso cuando hay muchos marcadores pequeños. El siguiente paso es mirar tus propias tablas de hechos e identificar marcadores dispersos que puedan reunirse en una sola dimensión. ¿Cuántos marcadores andan sueltos en tu modelo?