Как декомпозировать широкую таблицу на сателлиты в Data Vault?

«Как декомпозировать широкую таблицу на сателлиты в Data Vault?» — вопрос из категории Моделирование данных и DWH, который задают на 33% собеседований Data Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Data Vault 2.0 сателлиты (Satellites) хранят контекстные атрибуты и историю изменений для хабов (Hubs) или линков (Links). Широкую таблицу (wide table) декомпозируют по следующим принципам:

  1. Выделение сущностей (Hubs): Определите бизнес-ключи (например, CustomerID, OrderID) и создайте для них отдельные хабы.
  2. Выделение связей (Links): Если между ключами есть много-ко-многим отношения (например, Order-Product), создайте линк-таблицу.
  3. Группировка атрибутов по темпоральности и источнику (Satellites):
    • По скорости изменения: Атрибуты, меняющиеся с разной частотой (например, email vs last_login_date), можно вынести в разные сателлиты.
    • По источнику системы (Record Source): Атрибуты из разных систем-источников (CRM, ERP) размещаются в отдельных сателлитах. Это сохраняет трассируемость.
    • По семантической группе: Например, все адресные данные клиента (street, city, zip) — в один сателлит, демографические (birth_date, gender) — в другой.

Пример декомпозиции таблицы Customer:

-- Хаб
CREATE TABLE Hub_Customer (
    CustomerHashKey CHAR(32) PRIMARY KEY,
    CustomerID VARCHAR(50),
    LoadDate TIMESTAMP,
    RecordSource VARCHAR(20)
);

-- Сателлит с основными данными (из CRM)
CREATE TABLE Sat_Customer_Core (
    CustomerHashKey CHAR(32),
    LoadDate TIMESTAMP,
    FirstName VARCHAR(100),
    LastName VARCHAR(100),
    Email VARCHAR(255),
    HashDiff CHAR(32),
    PRIMARY KEY (CustomerHashKey, LoadDate)
);

-- Сателлит с адресом (из другой системы)
CREATE TABLE Sat_Customer_Address (
    CustomerHashKey CHAR(32),
    LoadDate TIMESTAMP,
    Street VARCHAR(200),
    City VARCHAR(100),
    Country VARCHAR(50),
    HashDiff CHAR(32),
    PRIMARY KEY (CustomerHashKey, LoadDate)
);

Такой подход повышает гибкость, упрощает загрузку новых источников и улучшает производительность, так как запросы часто затрагивают только нужные группы атрибутов.