Объект портфолио

Хранилище бонусной программы на 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: перекос распределения, раздувание таблиц, работа, ушедшая во временные файлы.

Ограничения

Это прототип на собственном стенде: объёмов и данных заказчика в нём нет, и выводы о производительности на промышленном объёме не заявляются.

Что дальше

Перенос на промышленный кластер по тем же шагам: сначала проверки качества на входе, затем история атрибутов, затем витрины под конкретных потребителей.

Нужен похожий объект?

Пришлите исходные данные — уточним состав работы и ответим по срокам.

Связаться