Объект портфолио
Хранилище бонусной программы на Greenplum
Сквозной конвейер от внешних таблиц до витрин: staging через postgres_fdw, размерная модель с историчностью, партиционированные факты и идемпотентная загрузка. Внутренний инструмент.
Задача и контекст
Собрать хранилище бонусной программы: справочники магазинов, клиентов, карт и программ, факты покупок и операций с баллами за расчётный день. Перед сборкой требовалось сравнить топологии хранилищ — Кимбалл, Инмон и Data Vault — и выбрать модель. Внутренний инструмент, не клиентский заказ.
Как было
Данные за расчётный день собирались из источников без истории: изменение карты или магазина перезаписывало значение, и прежнее состояние восстановить было нечем. Повторный запуск загрузки дублировал строки.
Что сделано
Собраны три слоя: staging на внешних таблицах postgres_fdw, DDS и витрины. В DDS — измерения dim_dates, dim_programs, dim_items и две историчные (dim_customers, dim_retailers) по SCD Type 2 с хэш-контролем изменений. Факты fact_purchases и fact_points распределены по сегментам и партиционированы по диапазону дат, ошибочные записи уходят в error_log. Загрузка — DAG в Airflow и функции PL/pgSQL с инкрементом по high-water mark.
Результат в числах
Прототип с идемпотентной загрузкой, карантином ошибочных записей и витринами поверх DDS. Состояние кластера проверяется по gp_toolkit: перекос распределения, раздувание таблиц, работа, ушедшая во временные файлы.
Ограничения
Это прототип на собственном стенде: объёмов и данных заказчика в нём нет, и выводы о производительности на промышленном объёме не заявляются.
Что дальше
Перенос на промышленный кластер по тем же шагам: сначала проверки качества на входе, затем история атрибутов, затем витрины под конкретных потребителей.
Нужен похожий объект?
Пришлите исходные данные — уточним состав работы и ответим по срокам.