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

Cómo crear una Dimension Conformed en Modelado de Datos (Kimball)

João Barros 08 de August de 2026 5 min de lectura

Este tutorial explica cómo crear una Dimension Conformed en Modelado de Datos (Kimball) para compartir atributos entre varias fact tables. Tener dimensiones conformadas hace que los informes sean consistentes y reduce la redundancia cuando múltiples fact tables utilizan las mismas descripciones de entidad.

Prerequisitos

  • Conocimientos básicos de SQL (SELECT, JOIN, INSERT)
  • Entorno con una base de datos relacional (p. ej.: SQL Server, PostgreSQL)
  • Ejemplos de fact tables que comparten la misma entidad (p. ej.: Ventas y Devoluciones)

Paso 1: Identificar la entidad a conformar

Explique por qué: elegir la entidad correcta evita duplicación. Busque dimensiones con los mismos conceptos (p. ej.: Cliente, Producto, Tienda) usadas por múltiples fact tables. Verifique atributos idénticos o muy similares y reglas de negocio.

Paso 2: Definir la estructura de la Dimension Conformed

Haga un diseño sencillo: claves surrogate, clave natural, atributos que describan la entidad y flags útiles. La Dimension Conformed debe contener todos los atributos comunes exigidos por cada fact table y mantener la granularidad necesaria.

-- Exemplo: criar a dimensão Cliente_conformed
CREATE TABLE dim_cliente_conformed (
  cliente_sk BIGINT IDENTITY PRIMARY KEY,
  cliente_nk VARCHAR(50) NOT NULL, -- natural key (ex.: customer_id)
  nome VARCHAR(200),
  segmento VARCHAR(50),
  pais VARCHAR(50),
  data_registo DATE,
  CURRENT_FLAG CHAR(1) DEFAULT 'Y'
);

Paso 3: Mapear y migrar datos de las fuentes

Explique por qué: garantizar que cada fuente usa la misma clave natural (o un mapeo) es esencial. Normalmente se realiza un proceso ETL/ELT para consolidar las claves naturales y limpiar atributos antes de poblar la dimensión conformada.

-- Exemplo de MERGE para popular e actualizar dim_cliente_conformed (SQL Server syntax)
MERGE dim_cliente_conformed AS target
USING (
  SELECT DISTINCT customer_id AS cliente_nk, name AS nome, segmento, country AS pais, signup_date AS data_registo
  FROM stg_vendas_customers
  UNION
  SELECT DISTINCT customer_id, name, segment, country, signup
  FROM stg_devolucoes_customers
) AS src
ON target.cliente_nk = src.cliente_nk
WHEN MATCHED AND (target.nome <> src.nome OR target.pais <> src.pais) THEN
  UPDATE SET nome = src.nome, segmento = src.segmento, pais = src.pais, data_registo = src.data_registo
WHEN NOT MATCHED BY TARGET THEN
  INSERT (cliente_nk, nome, segmento, pais, data_registo)
  VALUES (src.cliente_nk, src.nome, src.segmento, src.pais, src.data_registo);

Paso 4: Gestionar clave surrogate y mapeos en las fact tables

Explique por qué: las fact tables deben referir a la dimensión conformada mediante la clave surrogate (cliente_sk). Cree un lookup para traducir la clave natural de las fuentes a la surrogate durante el ETL/ELT.

-- Exemplo: transformar fact_vendas para usar cliente_sk
INSERT INTO fact_vendas (venda_id, data_id, cliente_sk, produto_sk, quantidade, valor)
SELECT
  fv.venda_id,
  fv.data_id,
  dc.cliente_sk,
  fv.produto_sk,
  fv.quantidade,
  fv.valor
FROM stg_vendas fv
LEFT JOIN dim_cliente_conformed dc
  ON fv.customer_id = dc.cliente_nk;

Paso 5: Tratar diferencias y versión de atributos

Explique por qué: cuando las fuentes discrepan en los atributos, defina reglas de precedencia y mantenga historial cuando sea necesario. Para conservar historial considere Slowly Changing Dimension Tipo 2 o almacenar atributos anteriores en una tabla de historia.

-- Exemplo simplificado de SCD Type 2 (apenas lógica de marcação)
-- Assumindo colunas: effective_date, end_date, current_flag
UPDATE dim_cliente_conformed
SET current_flag = 'N', end_date = GETDATE()
WHERE cliente_nk = @cliente_nk AND current_flag = 'Y' AND (
  nome <> @nome OR pais <> @pais OR segmento <> @segmento
);

INSERT INTO dim_cliente_conformed (cliente_nk, nome, segmento, pais, data_registo, effective_date, current_flag)
VALUES (@cliente_nk, @nome, @segmento, @pais, @data_registo, GETDATE(), 'Y');

Verificar el resultado

Valide que las fact tables referencian la misma dimensión conformed y que los informes muestran valores consistentes. Ejemplos de comprobaciones: contar clientes únicos por fact table vs dimensión, confirmar que no hay cliente_sk NULL en las fact tables, y comparar atributos entre fuentes y dimensión.

-- Verificações úteis
-- 1. Clientes únicos na dimensão
SELECT COUNT(*) AS total_clientes FROM dim_cliente_conformed;

-- 2. Clientes usados nas fact tables sem correspondência
SELECT fv.customer_id, COUNT(*)
FROM stg_vendas fv
LEFT JOIN dim_cliente_conformed dc ON fv.customer_id = dc.cliente_nk
WHERE dc.cliente_sk IS NULL
GROUP BY fv.customer_id;

-- 3. Conferir consistência de atributo (ex.: segmento)
SELECT dc.cliente_nk, dc.segmento AS segmento_dim, fv.segmento AS segmento_fonte
FROM stg_vendas fv
JOIN dim_cliente_conformed dc ON fv.customer_id = dc.cliente_nk
WHERE dc.segmento <> fv.segmento;

Conclusión

Una Dimension Conformed reduce la duplicación, garantiza la consistencia de los informes y simplifica el mantenimiento del data warehouse. Próximos pasos: automatizar el proceso en ETL/ELT, aplicar SCD correctamente y documentar las reglas de precedencia. Consejo: comience por una dimensión conformed pequeña (p. ej.: Cliente) y expanda cuando las reglas estén estables — ¿qué dimensión tendría sentido conformar primero en su proyecto?