АРХИТЕКТУРА EDWHP0L3

Моделирование финансовых данных: зерно, ключи, история

Как отличать документы, транзакции, строки проводок и снимки остатков и не нарушать смысл финансовых мер.

Справочный материал. Контракты данных, архитектурные решения и ограничения применения. Источники приведены в материалах, где используются внешние основания.

Сначала зерно, потом таблицы#

Зерно факта - строгое определение того, что представляет одна строка. Для финансовой системы это должно быть решено до проектирования таблиц и составления SQL.

Примеры:

  • fact_source_transaction: одна строка на операционное событие в конкретной системе.
  • fact_journal_line: одна строка на бухгалтерскую строку проводки.
  • fact_daily_account_balance: одна строка на счёт, валюту и дату среза (с учётом юридического лица и других измерений, если требуются).

Эти факты нельзя безусловно объединять в одну таблицу: разный уровень детализации может приводить к удвоению сумм при соединениях.

Ключи и происхождение#

Не смешиваем идентификатор в источнике и сквозной идентификатор EDWH. Бизнес-ключ может иметь вид (source_system, source_event_id); технический суррогатный ключ используют для эффективного хранения связей или версий.

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

Минимальная модель:

source_event 1 ─── n journal_entry 1 ─── n journal_line
                         │                       │
                         └── document_id          └── account_code

account / currency / financial_period - справочные измерения

В учебном стенде отношение упрощено: одному событию соответствует одна двухстрочная запись. Это осознанное ограничение лаборатории, а не универсальное свойство финансовых систем.

Движения и снимки#

  • Транзакционный факт хранит произошедшие события и допускает естественную агрегацию движения по разрешённым измерениям.
  • Снимок остатка фиксирует состояние на дату. Остатки обычно неаддитивны по времени.
  • Агрегат оборотов ускоряет расчёт, но не заменяет атомарных записей, необходимых для сверок и аудита.

Отдельно нужно определить валюту, правила знаков и единицы измерения. Факты в различных валютах нельзя суммировать без явной конвертации.

Историзация#

Для справочников обычно рассматривают варианты SCD, включая SCD Type 2, где сохраняются прежние версии атрибутов. Но история бухгалтерских событий и история справочников - разные задачи. Позднее сторно лучше представлять как самостоятельное финансовое событие, когда это соответствует контракту источника, а не как молчаливое обновление исходной проводки.

У каждого уровня следует описать, что означает «действует на дату», и отдельно - «было известно системе на дату».

Контрольный пример#

Если одна операция создаёт четыре строки проводок, соединение transaction с journal_line даёт четыре строки. Суммирование суммы исходной операции после такого соединения без изменения зерна завысит результат в четыре раза.

Нужно либо считать показатель на уровне transaction, либо агрегировать journal_line к нужному зерну до соединения с другими источниками.

Подробнее: временная семантика и финансовые инварианты.

Источники и документация

  1. Kimball Group - Declaring the Grain ↗
  2. Kimball Group - Four-Step Dimensional Design Process ↗

Источники нужны для самостоятельной проверки. Примеры и интерпретации на сайте могут быть учебными упрощениями.