Modelação dimensional Kimball: guia prático de factos e dimensões
João Barros
25 de October de 2024
2 min de leitura
A metodologia dimensional de Ralph Kimball é o padrão de referência para data warehousing há mais de 30 anos. Os seus princípios — factos, dimensões e Bus Architecture — aplicam-se igualmente bem em SQL Server tradicional, Azure Synapse e Microsoft Fabric.
Factos vs Dimensões
TABELA DE FACTOS:
- Contém medidas numéricas (receita, quantidade, custo)
- Muitas linhas, poucas colunas
- Chaves estrangeiras para todas as dimensões
- Granularidade definida: 1 linha = 1 transacção de venda
TABELA DE DIMENSÃO:
- Contém atributos descritivos (nome, categoria, região)
- Poucas linhas, muitas colunas
- Chave surrogate (INT) como PK — nunca a chave natural
- Desnormalizada (Kimball não gosta de snow-flake)
Definir granularidade — a decisão mais importante
Pergunta: "O que representa uma linha da tabela de factos?"
Granularidade errada: "dados de vendas"
Granularidade correcta: "uma linha por item de venda (line item) em cada factura"
Impacto: se a granularidade for "por factura" e o utilizador quiser
análise por produto, é impossível. Escolha sempre a granularidade
mais atómica disponível na fonte.
Estrutura típica — esquema em estrela
-- Dimensão Cliente (desnormalizada)
CREATE TABLE dbo.DimCliente (
sk_cliente INT IDENTITY PRIMARY KEY, -- surrogate key
nk_cliente INT NOT NULL, -- natural key da fonte
nome NVARCHAR(200),
segmento VARCHAR(50),
pais VARCHAR(100),
regiao VARCHAR(100), -- desnormalizado (não normalizar em DimPais)
valid_from DATE NOT NULL,
valid_to DATE NOT NULL,
is_current BIT NOT NULL DEFAULT 1
);
-- Tabela de Factos
CREATE TABLE dbo.FactVendas (
sk_data INT NOT NULL REFERENCES dbo.DimData(sk_data),
sk_cliente INT NOT NULL REFERENCES dbo.DimCliente(sk_cliente),
sk_produto INT NOT NULL REFERENCES dbo.DimProduto(sk_produto),
sk_loja INT NOT NULL REFERENCES dbo.DimLoja(sk_loja),
receita DECIMAL(18,2) NOT NULL,
custo DECIMAL(18,2) NOT NULL,
quantidade INT NOT NULL
);
Tabela de datas — obrigatória
-- Gerar tabela de datas com todos os atributos necessários
CREATE TABLE dbo.DimData (
sk_data INT PRIMARY KEY, -- formato YYYYMMDD como INT
data_completa DATE NOT NULL,
ano SMALLINT,
trimestre TINYINT,
mes TINYINT,
nome_mes VARCHAR(20),
semana TINYINT,
dia_semana TINYINT,
nome_dia VARCHAR(20),
e_fim_semana BIT,
e_feriado BIT
);
Conclusão
Kimball funciona porque alinha o modelo com a forma como os utilizadores de negócio pensam nos dados. Cada dimensão é uma perspectiva de análise, cada facto é um evento de negócio. Este alinhamento torna os relatórios mais intuitivos e as consultas mais simples de escrever e optimizar.