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

Cómo crear una Bridge Table de tipo variante para atributos multivalorados en Modelado de Datos (Kimball)

João Barros 11 de October de 2026 4 min de lectura

Vamos a crear una Bridge Table para modelar atributos multivalorados (ej.: productos con múltiples categorías) en un esquema en estrella Kimball. Esta solución mantiene la integridad del star schema y facilita análisis con recuentos, filtros y agregación por categoría.

Prerequisitos

  • Conocimientos básicos de Modelado de Datos (Kimball) y star schema.
  • SQL (por ejemplo SQL Server, PostgreSQL u otra RDBMS).
  • Ejemplos de tablas source: una fact table con product_id y una dimensión Product.

Paso 1: Detectar el patrón multivalorado y elegir el tipo de bridge

Identificar el atributo multivalorado (ej.: categorías de producto). Decidir entre Bridge simple (solo relaciona keys) o Bridge con pesos/orden si es necesario ponderar o preservar prioridad. Aquí hacemos una Bridge con peso simple (1 por relación) y una columna de role para futuras extensiones.

Paso 2: Modelar las tablas involucradas

Definir las columnas mínimas: Dimension Product, Dimension Category y la Bridge ProductCategory_Bridge. En el enfoque Kimball mantenemos surrogate keys en las dimensiones y guardamos las foreign keys en la bridge y en la fact.

-- Dimensão Product (simplificada)
CREATE TABLE dim_product (
  product_sk INT PRIMARY KEY,
  product_id VARCHAR(50) UNIQUE,
  product_name VARCHAR(200)
);

-- Dimensão Category
CREATE TABLE dim_category (
  category_sk INT PRIMARY KEY,
  category_id VARCHAR(50) UNIQUE,
  category_name VARCHAR(200)
);

-- Bridge entre Product e Category
CREATE TABLE bridge_product_category (
  product_sk INT NOT NULL,
  category_sk INT NOT NULL,
  role VARCHAR(50) DEFAULT 'primary', -- permite diferentes tipos de relação
  weight DECIMAL(10,4) DEFAULT 1.0,
  PRIMARY KEY (product_sk, category_sk)
);

Paso 3: Extraer y transformar los datos multivalorados

Extraer del sistema source donde el atributo está en una lista separada por comas, JSON o en una tabla relacional. El objetivo es normalizar a pares (product_id, category_id) antes de cargar a dim y bridge.

-- Exemplo: source_products com coluna categories = 'cat1,cat2'
WITH exploded AS (
  SELECT p.product_id,
         TRIM(value) AS category_id
  FROM source_products p,
       UNNEST(string_to_array(p.categories, ',')) AS value
)
SELECT * FROM exploded;

Paso 4: Cargar / actualizar dimensiones

Cargar dim_category y dim_product usando surrogate keys. Para dimensiones conformed, asegurar que category_id y product_id son únicos y crear/upsert.

-- Inserir categories novas (pseudo-upsert, sintaxe varia por RDBMS)
INSERT INTO dim_category (category_sk, category_id, category_name)
SELECT nextval('seq_cat_sk'), c.category_id, c.category_name
FROM staging_categories c
ON CONFLICT (category_id) DO NOTHING;

-- Similar para dim_product

Paso 5: Poblar la Bridge Table

Hacer un join entre los pares normalizados y las dimensiones para obtener product_sk y category_sk, luego insertar en la bridge. Evitar duplicados y mantener weight/role según necesidad.

-- Exemplo de carga da bridge
INSERT INTO bridge_product_category (product_sk, category_sk, role, weight)
SELECT p.product_sk, c.category_sk, 'primary', 1.0
FROM staging_product_category sc
JOIN dim_product p ON p.product_id = sc.product_id
JOIN dim_category c ON c.category_id = sc.category_id
ON CONFLICT (product_sk, category_sk) DO UPDATE
  SET weight = EXCLUDED.weight;

Paso 6: Ajustar la Fact table para análisis

Mantener la fact table con product_sk (o product_id) y, en consultas analíticas, unir con la bridge para distribuir medidas por categorías. Para recuentos no duplicados usar distinct o medidas ponderadas con weight.

-- Agregar ventas por categoria usando la bridge
SELECT c.category_name, SUM(f.amount * b.weight) AS amount_by_category
FROM fact_sales f
JOIN bridge_product_category b ON f.product_sk = b.product_sk
JOIN dim_category c ON b.category_sk = c.category_sk
GROUP BY c.category_name;

Verificar el resultado

Confirmar que cada product_sk tiene las categorías correctas en la bridge y que la suma de pesos por producto tiene sentido (ej.: 1 por relación o total 1 si normalizado). Probar consultas de informe: agregación por categoría, filtro por categoría y recuentos distintos por producto.

Conclusión

Una Bridge Table para atributos multivalorados mantiene el star schema limpio y flexible: permite análisis por categoría sin inflar la fact table. Próximos pasos: implementar lógica para pesos dinámicos, gestionar histórico de cambios en la bridge, o crear una view para simplificar consultas en Power BI. Consejo: empieza con bridge simple y añade role/weight solo si es necesario — ¿cuál es el caso multivalorado más común en tu organización?