Условие
В классификации Кимбалла 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.
Подводные камни
- SCD-2 без суррогатного ключа — факты будут связываться по бизнес-ключу и «склеиваться» с разными версиями. Всегда вводят
*_sk. end_date = NULLvs'9999-12-31'— выбор влияет наBETWEENи индексы. Часто берут'9999-12-31', чтобы не писатьOR end_date IS NULL.- Одновременные изменения — если две колонки меняются в одной выгрузке, открывайте одну новую версию, а не две.
Эталонный ответ
SCD-0 не меняем; SCD-1 перезапись; SCD-2 новая строка + период действия (золотой стандарт для истории); SCD-3 «текущее/предыдущее» в одной строке; SCD-4 история в отдельной таблице (для часто меняющихся атрибутов).