Хроники изменений: как отслеживать историю данных

В прошлом посте про Data Vault мы разобрали, как Сателлиты позволяют фиксировать изменения данных через hashdiff. Но как превратить этот поток версий в полноценную аналитическую историю?

Представьте задачу: аналитики просят посчитать конверсию продаж в разрезе городов, но с условием — если клиент месяц назад жил в Самаре, а вчера переехал в Москву, его старый заказ должен относиться к Самаре, а новый — к Москве.

Если ваше хранилище просто перезаписывает данные поверх старых (через UPDATE), вы навсегда потеряете этот контекст. Бизнес увидит искаженную аналитику.

Для решения этой проблемы используют концепцию SCD2 (Slowly Changing Dimensions) — медленно меняющихся измерений. Вместо перезаписи строки мы создаем её новую версию, разграничивая периоды жизни записи техническими полями effective_from и effective_to.

Если писать расчет таких интервалов вручную при каждой загрузке данных, вы быстро упретесь в тяжелые MERGE-конструкции и падение производительности базы данных.

В проекте eltdwh-airflow-dbt разделил хранение истории и её расчет на два этапа:

1. Core (Data Vault) — быстрая фиксация изменений: В сателлитах мы не высчитываем интервалы. dbt просто инкрементально дописывает новую строку с текущим load_dttm, только если изменился хэш данных (hashdiff). Мы получаем «сырой» лог версий без нагрузки на СУБД.

2. Marts (Star Schema) — расчет SCD2 для аналитиков: А вот при сборке финального измерения dim_... dbt с помощью оконной функции lead(load_dttm) over (...) на лету превращает этот лог версий в строгие аналитические интервалы effective_from / effective_to и проставляет актуальный флаг current_flag.

Итог: Разделение задач сработало и здесь: слой хранения (Core) остался легким и быстрым на запись, а слой витрин (Marts) получил полноценную, удобную для BI-инструментов SCD2-историю. И всё это управляется декларативным кодом dbt.

А где вы предпочитаете рассчитывать интервалы SCD2: сразу при загрузке в исторический слой или уже на этапе формирования витрин?

💻 Код SQL-моделей с оконными функциями для расчета SCD2: https://github.com/lelik-bolek/eltdwh-airflow-dbt

#DataEngineering #dbt #SCD2 #DataVault #StarSchema #DWH #SQL #eltdwh_pipeline

Хроники изменений: как отслеживать историю данных | Сетка — социальная сеть от hh.ru