Собесов

SCD 0/1/2/3/4: какой тип когда применять

SQLХранилища и SCDСредняяMiddle

Условие

В классификации Кимбалла Slowly Changing Dimensions делятся на типы 0–4 (плюс 6 как гибрид). Объясните, в чём суть каждого, и приведите ситуации, когда его выбирают.

Решение

SCD (Slowly Changing Dimensions) — стратегии хранения изменяющихся атрибутов измерений в DWH.

Тип Что делает Когда применять
0 Атрибут не меняется никогда (заморожен в первоначальном виде) Дата открытия счёта, пол клиента в паспорте
1 Перезапись текущим значением, история теряется Опечатки в названии города, исправление ошибок
2 Новая строка на каждое изменение + start_date, end_date, is_current Тариф клиента, регион проживания — нужна полная история
3 Текущее + предыдущее значение в одной строке (отдельные колонки) Когда нужно видеть «было/стало», но без полной истории
4 Текущее значение в основной таблице, история — в отдельной Атрибуты с тысячами изменений (балансы, лимиты)

Пример SCD-2

CREATE TABLE dim_client (
  client_sk    BIGSERIAL PRIMARY KEY,   -- суррогатный ключ
  client_id    BIGINT,                  -- бизнес-ключ
  tariff       TEXT,
  region       TEXT,
  start_date   DATE,
  end_date     DATE,                    -- NULL или '9999-12-31' для текущей
  is_current   BOOLEAN
);

При смене тарифа: закрываем старую строку (end_date = today, is_current = false) и вставляем новую с start_date = today.

Когда что выбирать

  • Аналитика поведения «как клиент менялся» → SCD-2.
  • Атрибут с очень частыми обновлениями → SCD-4 (выносим историю, чтобы не раздувать dim).
  • Атрибут «потерянная история не страшна» → SCD-1.
  • Регуляторика требует «было/стало» только → SCD-3.

Подводные камни

  1. SCD-2 без суррогатного ключа — факты будут связываться по бизнес-ключу и «склеиваться» с разными версиями. Всегда вводят *_sk.
  2. end_date = NULL vs '9999-12-31' — выбор влияет на BETWEEN и индексы. Часто берут '9999-12-31', чтобы не писать OR end_date IS NULL.
  3. Одновременные изменения — если две колонки меняются в одной выгрузке, открывайте одну новую версию, а не две.

Эталонный ответ

SCD-0 не меняем; SCD-1 перезапись; SCD-2 новая строка + период действия (золотой стандарт для истории); SCD-3 «текущее/предыдущее» в одной строке; SCD-4 история в отдельной таблице (для часто меняющихся атрибутов).

Хочешь увидеть разбор?

Зарегистрируйся бесплатно — откроется развёрнутое решение этой задачи и ещё 4 на выбор.

Зарегистрироваться и увидеть разбор
Уже есть аккаунт? Войти