diff --git a/docs/architecture/dm.md b/docs/architecture/dm.md index c56cb26..d59881d 100644 --- a/docs/architecture/dm.md +++ b/docs/architecture/dm.md @@ -10,8 +10,7 @@ Витрина, меняющая зерно источника — дневной агрегат, сверка по заказам, — материализуется: `dm.<имя>_rep` / `_dist` и публичное `dm.<имя>_v` с явным списком колонок, по общим [конвенциям хранилища](storage.md). Наполняет её -`dm_transform` заменой дневных партиций — той же механикой, что у сущностей -DDS ([конвейер](etl.md)); объём пересборки — ниже. Витрина, сохраняющая зерно +`dm_transform`; ритм и механика пересборки — ниже. Витрина, сохраняющая зерно источника — переименование, обогащение строки, — остаётся обычным представлением: копию событий ради других имён колонок не держит ни один боевой склад. @@ -49,21 +48,27 @@ DDS ([конвейер](etl.md)); объём пересборки — ниже. от выполненных домашек. Расширение дашборда визуализациями по своим витринам — отдельная домашка после этапа 8. -## Объём пересборки +## Ритм пересборки -Все материализованные витрины пересобираются одним окном — дышащим окном K -от позиции мира, тем же, что у заказов. Витринам от заказов окна хватает по -построению: день за окном закрыт, его классы и суммы не меняются. Витринам -от событий и сессий окно даже избыточно — их дни замерзают сразу. +Партиция витрины пересобирается, пока может измениться её источник, — +поэтому ритмов три, по числу источников: -Одно следствие названо явно. `daily_traffic` обогащается картой -идентичностей, а карта пересчитывается целиком, и склейка ретроспективна: -покупка сегодня делает куку «известной» во всех прошлых днях карты. Дни за -окном K в витрину эту новость уже не получат — они хранят число известных -на момент закрытия окна. Это решение, а не недосмотр: живое окно показывает -текущую склейку, замороженные дни — какой она была тогда, и расхождение -между витриной и картой само по себе урок ретроспективности (историю -склейки стенд сознательно не хранит — issue #145). +- **от событий и сессий** — день замерзает сразу; пересборка догоняет + хвост несобранных дней заменой дневных партиций; +- **от заказов** — день дышит окном K и закрывается; пересборка заменяет + партиции окна, дни за ним закрыты по построению; +- **от карты идентичностей** — не замерзает никогда: склейка + ретроспективна, покупка сегодня делает куку известной во всех её прошлых + днях, а карта пересчитывается целиком. + +Поэтому `daily_traffic` наследует у своего источника и ритм, и механику: +полный пересчёт всех дней каждый прогон в `ReplacingMergeTree(_load_ts)`, +как у самой карты. Дневные партиции ей не положены — строка в дне одна, и +партиция на строку плодила бы микрокуски на ровном месте. Пересчёт дешёв: +витрина читает сессии и карту локальным соединением по ключу ко-локации. +Пересчитывать точечно только затронутые дни не из чего: для этого надо +знать, какие связки новые, а полный пересчёт карты этот след затирает — +восстановление следа оставлено лабе повышенной сложности (issue #149). ## `dm.dq_summary` @@ -128,6 +133,14 @@ Airflow. Партиция — день данных; прогон звена DQ расшифровывать. Красное «ещё не построено» честнее. - **Самопроверка пишет в `dq_summary`.** Попытки менти смешались бы с историей качества конвейера. +- **Окно K для `daily_traffic` — прошлое замерзает.** Дни за окном хранили + бы число известных на момент закрытия — витрина тихо расходится с картой + и протаскивает обратно «знание на дату», отвергнутое развилкой карты + (#133). +- **Инкрементальный пересчёт затронутых дней по `first_matched_at`.** + Производственный ход, но на объёмах стенда он экономит неизмеримое, а + след новых связок требует вернуть колонку, выкинутую в #133. Стал лабой + повышенной сложности — issue #149. - **Superset поверх DDS без слоя DM.** Терялся бы урок «витрина — контракт под потребителя», против раздела 7 спеки.