Cómo crear una junk dimension en el data warehouse
En una tabla de hechos es habitual que se acumulen pequeños indicadores — sí/no, estados, tipos de canal — que ocupan espacio y hacen el modelo confuso. La palabra "junk" no significa basura: se refiere a esas flags dispersas y de baja cardinalidad que, por sí solas, no justifican una dimensión. Una junk dimension las reúne todas en una única dimensión, dejando la tabla de hechos más limpia y el star schema más fácil de consultar.
Requisitos previos
- Un data warehouse con un star schema ya iniciado.
- Acceso a una base de datos SQL (los ejemplos usan sintaxis T-SQL, fácil de adaptar a otros motores).
- Una tabla de hechos con varias columnas de flags o indicadores de baja cardinalidad.
- Nociones básicas de surrogate keys (claves subrogadas) y de procesos de ETL.
Paso 1: Identificar las flags de baja cardinalidad
Empieza por listar las columnas de la tabla de hechos con pocos valores distintos y que no pertenecen a ninguna dimensión existente. Ejemplos típicos: un indicador "es promoción" (Sí/No), el "canal de venta" (Tienda/Online/Teléfono) o el "estado del pedido" (Nuevo/Enviado/Devuelto). Evita incluir columnas con muchos valores distintos, como un código de cliente: esas merecen su propia dimensión.
Una consulta rápida confirma la cardinalidad de cada candidata:
SELECT
COUNT(DISTINCT is_promocao) AS n_promocao,
COUNT(DISTINCT canal_venda) AS n_canal,
COUNT(DISTINCT estado) AS n_estado
FROM staging.vendas;
Paso 2: Generar las combinaciones
La junk dimension guarda una fila por cada combinación única de las flags. Como los valores son pocos, tienes dos opciones. La más simple es insertar solo las combinaciones que ocurren realmente en los datos, con un SELECT DISTINCT sobre las tres columnas en conjunto. Si quieres anticipar todas las combinaciones posibles (incluso las que aún no han aparecido), usa un CROSS JOIN entre las listas de valores distintos:
SELECT p.is_promocao, c.canal_venda, e.estado
FROM (SELECT DISTINCT is_promocao FROM staging.vendas) AS p
CROSS JOIN (SELECT DISTINCT canal_venda FROM staging.vendas) AS c
CROSS JOIN (SELECT DISTINCT estado FROM staging.vendas) AS e;
Para la mayoría de los casos, insertar solo las combinaciones reales mantiene la dimensión pequeña y eficiente.
Paso 3: Crear la tabla con surrogate key
Crea la dimensión con una surrogate key numérica y las columnas descriptivas. Esa clave, generada automáticamente con IDENTITY, será la única referencia guardada en la tabla de hechos:
CREATE TABLE dim_junk_venda (
junk_key INT IDENTITY(1,1) PRIMARY KEY,
is_promocao VARCHAR(3),
canal_venda VARCHAR(20),
estado VARCHAR(20)
);
INSERT INTO dim_junk_venda (is_promocao, canal_venda, estado)
SELECT DISTINCT is_promocao, canal_venda, estado
FROM staging.vendas;
Cada fila tiene ahora un junk_key único que representa una combinación de flags.
Consejo: mantén la junk dimension pequeña. Si una flag tiene cientos de valores distintos, probablemente merezca su propia dimensión en lugar de estar aquí.
Paso 4: Enlazar la junk dimension con la tabla de hechos
Al cargar la tabla de hechos, busca la junk_key correspondiente a cada fila y guarda solo esa clave, sustituyendo las varias columnas de flags:
INSERT INTO fact_vendas (data_key, produto_key, junk_key, quantidade, valor)
SELECT
v.data_key,
v.produto_key,
dj.junk_key,
v.quantidade,
v.valor
FROM staging.vendas AS v
JOIN dim_junk_venda AS dj
ON dj.is_promocao = v.is_promocao
AND dj.canal_venda = v.canal_venda
AND dj.estado = v.estado;
La tabla de hechos queda con una sola columna (junk_key) en lugar de tres, lo que reduce el espacio ocupado y simplifica las consultas de los usuarios.
Comprobar el resultado
Confirma que cada registro de hechos tiene una junk_key válida. Si esta consulta devuelve cero, todas las filas se enlazaron correctamente:
SELECT COUNT(*) AS factos_sem_junk
FROM fact_vendas
WHERE junk_key IS NULL;
También puedes analizar las combinaciones más frecuentes para validar que los datos tienen sentido:
SELECT dj.canal_venda, dj.estado, COUNT(*) AS n
FROM fact_vendas AS f
JOIN dim_junk_venda AS dj ON dj.junk_key = f.junk_key
GROUP BY dj.canal_venda, dj.estado
ORDER BY n DESC;
Conclusión
Con una junk dimension, has convertido varias columnas de flags dispersas en una dimensión compacta y reutilizable, dejando la tabla de hechos más ligera y el star schema más claro. El siguiente paso es revisar otras tablas de hechos en busca de indicadores similares que puedan compartir el mismo enfoque. ¿Qué flags de baja cardinalidad tienes hoy en tu tabla de hechos que vivirían mejor en una junk dimension?