Cómo crear un Data Vault 2.0 simplificado en Data Warehouse
Este tutorial muestra cómo construir un modelo Data Vault 2.0 simplificado en Data Warehouse para registrar histórico e integraciones de múltiples fuentes. El Data Vault es útil cuando necesitamos escalabilidad, auditabilidad y facilidad de integración sin perder el historial.
Pré-requisitos
- Conocimientos básicos de SQL (SELECT, INSERT, MERGE).
- Ambiente de Data Warehouse con soporte para transacciones (ej.: Azure SQL, SQL Server, PostgreSQL).
- Exposición a conceptos de ETL/ELT y modelado dimensional.
Passo 1: Entender os elementos do Data Vault
Antes de codificar, es importante saber qué vamos a crear: Hub (entidades únicas, business keys), Link (relaciones entre hubs) y Satellite (atributos históricos y metadatos). Esto permite separar la lógica de integración de la lógica de histórico.
Passo 2: Criar tabelas físicas para Hub, Link e Satellite
Creamos esquemas mínimos con columnas esenciales: business_key en el Hub, hash keys opcionales y metadatos (load_date, record_source). El ejemplo abajo usa sintaxis SQL genérica; ajuste tipos e índices a su 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
Al cargar datos fuente, extraemos la business_key (ej.: customer_id). Insertamos solo keys nuevas en el Hub para mantener unicidad y auditabilidad.
-- 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
Los Satellites almacenan atributos y permiten registrar cambios a lo largo del tiempo. La técnica común es comparar el hash de atributos o comparar campo a campo y cerrar el registro anterior cuando cambie.
-- 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
Los Links usan las business keys de los Hubs y representan transacciones o asociaciones. Cargue solo relaciones nuevas o con cambios de contexto (ej.: cantidad, precio en el Satellite asociado al 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
Incluya record_source, load_date y, cuando sea posible, hash_chave para detección rápida de cambios. Guardar metadata facilita trazabilidad y auditoría de las 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) el Hub contiene solo business_keys únicas; (2) los Satellites tienen versiones con valid_from/valid_to y registros históricos; (3) los Links representan las relaciones esperadas. Use consultas simples para validar recuentos y muestrear cambios.
-- 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
Con un Data Vault 2.0 simplificado tienes una base para integrar múltiples fuentes con historial y auditabilidad. Próximos pasos: automatizar cargas con pipelines ETL/ELT, añadir tests de calidad y optimizar índices/particiones. Consejo: empieza por un pequeño conjunto de entidades y valida el proceso antes de escalar.