Como criar uma junk dimension num Data Warehouse
Uma junk dimension (ou dimensão lixo) é uma técnica de modelação que agrupa vários indicadores de baixa cardinalidade — estados, sinalizadores e opções — numa única dimensão do Data Warehouse. Em vez de encher a tabela de factos com colunas soltas ou criar uma mini-dimensão para cada flag, junta tudo numa tabela pequena e fácil de consultar. Vamos ver, passo a passo e com exemplos em SQL, como criar uma junk dimension e ligá-la à tabela de factos.
Pré-requisitos
- Acesso a um Data Warehouse com SQL (SQL Server, Microsoft Fabric ou Azure Synapse).
- Permissões para criar tabelas e inserir dados.
- Noções básicas de esquema em estrela: dimensões e tabelas de factos.
Passo 1: Identificar os atributos candidatos
O primeiro passo é encontrar colunas com poucos valores distintos e sem atributos descritivos próprios. Imagina uma tabela de vendas com três sinalizadores: estado do pagamento (Pago ou Pendente), canal (Online ou Loja) e oferta (Sim ou Não). Cada um tem apenas dois valores. Sozinhos, não justificam uma dimensão própria e, se ficarem na tabela de factos, enchem-na de colunas de texto repetido. Juntá-los numa única dimensão evita, ao mesmo tempo, uma tabela de factos larga e um enxame de dimensões minúsculas difíceis de manter.
Dica: um bom candidato a junk dimension tem baixa cardinalidade e muda com pouca frequência. Datas ou clientes, por exemplo, não entram aqui.
Passo 2: Criar a tabela da junk dimension
Criamos uma tabela com uma chave substituta (surrogate key) e uma coluna para cada sinalizador. A chave será a única coluna que a tabela de factos vai guardar.
CREATE TABLE DimTransacao (
TransacaoKey INT NOT NULL,
EstadoPagamento VARCHAR(20) NOT NULL,
Canal VARCHAR(20) NOT NULL,
Oferta VARCHAR(3) NOT NULL
);
Repara que aqui não guardamos nenhuma métrica nem datas: a junk dimension contém apenas os sinalizadores e a sua chave.
Passo 3: Gerar todas as combinações possíveis
A ideia central é preencher a dimensão com o produto cartesiano de todos os valores. Com CROSS JOIN combinamos as listas e, com ROW_NUMBER(), geramos a chave substituta automaticamente.
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 temos 2 × 2 × 2 valores, a tabela fica com 8 linhas — todas as combinações possíveis. É também boa prática acrescentar um membro «desconhecido» para linhas de facto sem correspondência:
INSERT INTO DimTransacao (TransacaoKey, EstadoPagamento, Canal, Oferta)
VALUES (-1, 'Desconhecido', 'Desconhecido', 'N/D');
Passo 4: Ligar a dimensão à tabela de factos
Ao carregar a tabela de factos, procuramos a TransacaoKey correspondente aos três sinalizadores e guardamos apenas essa chave. Assim, a tabela de factos deixa de ter as colunas de texto e passa a fazer uma única junção pequena e 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 o resultado
Confirma que a dimensão tem as combinações esperadas e experimenta uma consulta analítica agrupando pelos atributos da 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;
Se a primeira consulta devolver 9 linhas (8 combinações mais o membro desconhecido) e a segunda mostrar totais por canal e estado, está tudo a funcionar.
Conclusão
Com uma junk dimension, a tabela de factos fica mais leve, os filtros ficam mais simples e o modelo continua limpo, mesmo quando há muitos sinalizadores pequenos. O próximo passo é olhar para as tuas tabelas de factos e identificar flags dispersas que possam ser reunidas numa só dimensão. Já sabes quantos sinalizadores andam soltos no teu modelo?