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

Como criar um Data Vault 2.0 simplificado em Data Warehouse

João Barros 28 de August de 2026 5 min de leitura

Este tutorial mostra como construir um modelo Data Vault 2.0 simplificado em Data Warehouse para registar histórico e integrações de múltiplas fontes. O Data Vault é útil quando precisamos de escalabilidade, auditabilidade e facilidade de integração sem perder histórico.

Pré-requisitos

  • Conhecimentos básicos de SQL (SELECT, INSERT, MERGE).
  • Ambiente de Data Warehouse com suporte a transacções (ex.: Azure SQL, SQL Server, PostgreSQL).
  • Exposição a conceitos de ETL/ELT e modelação dimensional.

Passo 1: Entender os elementos do Data Vault

Antes de codificar, é importante saber o que vamos criar: Hub (entidades únicas, keys de negócio), Link (relacionamentos entre hubs) e Satellite (atributos históricos e metadados). Isto permite separar a lógica de integração da lógica de histórico.

Passo 2: Criar tabelas físicas para Hub, Link e Satellite

Criamos esquemas mínimos com colunas essenciais: business_key no Hub, hash keys opcionais, e metadados (load_date, record_source). O exemplo abaixo usa sintaxe SQL genérica; ajuste tipos e índices ao seu SGBD.

-- Hub Cliente
CREATE TABLE hub_cliente (
  cliente_hk BIGINT IDENTITY PRIMARY KEY,
  cliente_bk VARCHAR(100) NOT NULL UNIQUE,
  record_source VARCHAR(100),
  load_date DATETIME DEFAULT GETDATE()
);

-- Link Compra (relaciona Cliente a Produto)
CREATE TABLE link_compra (
  compra_hk BIGINT IDENTITY PRIMARY KEY,
  cliente_bk VARCHAR(100) NOT NULL,
  produto_bk VARCHAR(100) NOT NULL,
  record_source VARCHAR(100),
  load_date DATETIME DEFAULT GETDATE()
);

-- Satellite Cliente (atributos historizados)
CREATE TABLE sat_cliente (
  sat_cliente_hk BIGINT IDENTITY PRIMARY KEY,
  cliente_bk VARCHAR(100) NOT NULL,
  nome VARCHAR(200),
  morada VARCHAR(300),
  valid_from DATETIME DEFAULT GETDATE(),
  valid_to DATETIME NULL,
  record_source VARCHAR(100)
);

Passo 3: Carregar e deduplicar business keys no Hub

Ao carregar dados fonte, extraímos a business_key (ex.: customer_id). Inserimos apenas keys novas no Hub para manter unicidade e auditabilidade.

-- Exemplo de carga incremental para Hub (SQL Server)
MERGE INTO hub_cliente AS target
USING (
  SELECT DISTINCT customer_id AS cliente_bk, 'sistema_vendas' AS record_source
  FROM staging_vendas
) AS source
ON target.cliente_bk = source.cliente_bk
WHEN NOT MATCHED THEN
  INSERT (cliente_bk, record_source) VALUES (source.cliente_bk, source.record_source);

Passo 4: Criar/atualizar Satellites para historização

Satellites guardam atributos e permitem registar mudanças ao longo do tempo. A técnica comum é comparar hash de atributos ou comparar campo a campo e encerrar o registo anterior quando mudar.

-- Inserir novo registo no Satellite quando houver mudança (exemplo conceptual)
INSERT INTO sat_cliente (cliente_bk, nome, morada, valid_from, record_source)
SELECT s.customer_id, s.name, s.address, GETDATE(), 'sistema_vendas'
FROM staging_vendas s
LEFT JOIN (
  SELECT cliente_bk, nome, morada FROM sat_cliente WHERE valid_to IS NULL
) cur ON cur.cliente_bk = s.customer_id
WHERE cur.nome IS NULL OR cur.nome <> s.name OR cur.morada <> s.address;

-- Encerrar versão anterior
UPDATE sat_cliente
SET valid_to = GETDATE()
FROM sat_cliente sc
JOIN staging_vendas s ON sc.cliente_bk = s.customer_id
WHERE sc.valid_to IS NULL AND (sc.nome <> s.name OR sc.morada <> s.address);

Passo 5: Carregar Links para representar relações

Links usam as business keys dos Hubs e representam transacções ou associações. Carregue apenas relações novas ou com mudanças de contexto (ex.: quantidade, preço no Satellite associado ao Link).

-- Inserir relações únicas no Link
MERGE INTO link_compra AS target
USING (
  SELECT DISTINCT customer_id AS cliente_bk, product_id AS produto_bk, 'sistema_vendas' AS record_source
  FROM staging_vendas
) AS source
ON target.cliente_bk = source.cliente_bk AND target.produto_bk = source.produto_bk
WHEN NOT MATCHED THEN
  INSERT (cliente_bk, produto_bk, record_source) VALUES (source.cliente_bk, source.produto_bk, source.record_source);

Passo 6: Registar metadados e auditoria

Inclua record_source, load_date e, quando possível, hash_chave para detecção rápida de mudanças. Guardar metadata facilita rastreabilidade e auditoria das cargas.

-- Exemplo de coluna de hash para Satellite (funcionalidade DB depende do SGBD)
ALTER TABLE sat_cliente ADD attrs_hash VARCHAR(64);

-- Calcular hash simplificado (ex.: HASHBYTES no SQL Server)
UPDATE sat_cliente
SET attrs_hash = CONVERT(VARCHAR(64), HASHBYTES('SHA2_256', ISNULL(nome,'') + '|' + ISNULL(morada,'')), 2)
WHERE attrs_hash IS NULL;

Verificar o resultado

Confirme que: (1) o Hub contém apenas business_keys únicas; (2) os Satellites têm versões com valid_from/valid_to e registos históricos; (3) os Links representam relações esperadas. Use consultas simples para validar contagens e amostrar mudanças.

-- Verificações rápidas
SELECT COUNT(*) AS hubs_totais FROM hub_cliente;
SELECT cliente_bk, COUNT(*) AS versoes FROM sat_cliente GROUP BY cliente_bk HAVING COUNT(*) > 1;
SELECT COUNT(*) AS links_totais FROM link_compra;

Conclusão

Com um Data Vault 2.0 simplificado tens uma base para integrar múltiplas fontes com histórico e auditabilidade. Próximos passos: automatizar cargas com pipelines ETL/ELT, acrescentar testes de qualidade e optimizar índices/partições. Dica: começa por um pequeno conjunto de entidades e valida o processo antes de escalar.