(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa

Como criar uma junk dimension no data warehouse

João Barros 07 de July de 2026 4 min de leitura

Numa tabela de factos, é comum acumularem-se pequenos indicadores — sim/não, estados, tipos de canal — que ocupam espaço e tornam o modelo confuso. O termo "junk" não significa lixo: refere-se a essas flags dispersas e de baixa cardinalidade que, sozinhas, não justificam uma dimensão. Uma junk dimension junta-as todas numa única dimensão, deixando a tabela de factos mais limpa e o star schema mais fácil de consultar.

Pré-requisitos

  • Um data warehouse com um star schema já iniciado.
  • Acesso a uma base de dados SQL (os exemplos usam sintaxe T-SQL, fácil de adaptar a outros motores).
  • Uma tabela de factos com várias colunas de flags ou indicadores de baixa cardinalidade.
  • Noções básicas de surrogate keys (chaves substitutas) e de processos de ETL.

Passo 1: Identificar as flags de baixa cardinalidade

Comece por listar as colunas da tabela de factos com poucos valores distintos e que não pertencem a nenhuma dimensão existente. Exemplos típicos: um indicador "é promoção" (Sim/Não), o "canal de venda" (Loja/Online/Telefone) ou o "estado da encomenda" (Novo/Enviado/Devolvido). Evite incluir colunas com muitos valores distintos, como um código de cliente — essas merecem a sua própria dimensão.

Uma consulta rápida confirma a cardinalidade 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;

Passo 2: Gerar as combinações

A junk dimension guarda uma linha por cada combinação única das flags. Como os valores são poucos, tem duas opções. A mais simples é inserir apenas as combinações que ocorrem realmente nos dados, com um SELECT DISTINCT sobre as três colunas em conjunto. Se quiser prever todas as combinações possíveis (mesmo as que ainda não apareceram), use um CROSS JOIN entre as 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 a maioria dos casos, inserir só as combinações reais mantém a dimensão pequena e eficiente.

Passo 3: Criar a tabela com surrogate key

Crie a dimensão com uma surrogate key numérica e as colunas descritivas. Essa chave, gerada automaticamente com IDENTITY, será a única referência guardada na tabela de factos:

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 linha passa a ter um junk_key único que representa uma combinação de flags.

Dica: mantenha a junk dimension pequena. Se uma flag tiver centenas de valores distintos, provavelmente merece a sua própria dimensão em vez de entrar aqui.

Passo 4: Ligar a junk dimension à tabela de factos

No carregamento da tabela de factos, procure a junk_key correspondente a cada linha e guarde apenas essa chave, substituindo as várias colunas 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;

A tabela de factos fica com uma só coluna (junk_key) em vez de três, o que reduz o espaço ocupado e simplifica as consultas dos utilizadores.

Verificar o resultado

Confirme que cada registo de factos tem uma junk_key válida. Se esta consulta devolver zero, todas as linhas foram ligadas corretamente:

SELECT COUNT(*) AS factos_sem_junk
FROM fact_vendas
WHERE junk_key IS NULL;

Pode também analisar as combinações mais frequentes para validar que os dados fazem 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;

Conclusão

Com uma junk dimension, transformou várias colunas de flags dispersas numa dimensão compacta e reutilizável, deixando a tabela de factos mais leve e o star schema mais claro. O passo seguinte é rever outras tabelas de factos à procura de indicadores semelhantes que possam partilhar a mesma abordagem. Que flags de baixa cardinalidade tem hoje na sua tabela de factos que poderiam viver melhor numa junk dimension?