(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa
Modelação de Dados (Kimball)
Modelação de Dados (Kimball) 2 min

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.

Partilhar: