From 92d834761c935c1247e63989e861f298c5d5ee9f Mon Sep 17 00:00:00 2001 From: Dmitry Dementev Date: Tue, 25 Aug 2026 06:33:10 -0400 Subject: [PATCH] =?UTF-8?q?docs(dm):=20=D1=80=D0=B8=D1=82=D0=BC=20=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D0=B5=D1=81=D0=B1=D0=BE=D1=80=D0=BA=D0=B8=20=D0=B2?= =?UTF-8?q?=D0=B8=D1=82=D1=80=D0=B8=D0=BD=20=D0=B2=D1=8B=D0=B2=D0=B5=D0=B4?= =?UTF-8?q?=D0=B5=D0=BD=20=D0=B8=D0=B7=20=D0=BF=D0=BE=D0=B4=D0=B2=D0=B8?= =?UTF-8?q?=D0=B6=D0=BD=D0=BE=D1=81=D1=82=D0=B8=20=D0=B8=D1=81=D1=82=D0=BE?= =?UTF-8?q?=D1=87=D0=BD=D0=B8=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Зачем: - обсуждение горячего ревью показало: «окно K для всех» — ритм заказов, натянутый на слой, а замерзание daily_traffic обесценивало витрину. - Что: - раздел «Объём пересборки» заменён «Ритмом пересборки»: три ритма — хвост / окно K / целиком; daily_traffic наследует у карты полный пересчёт в ReplacingMergeTree, дневные партиции ей не положены. - в отклонённые добавлены замерзание за окном K и инкремент по first_matched_at; инкремент стал идеей лабы повышенной сложности #149. - Проверка: - make config-test. Co-Authored-By: Claude Fable 5 --- docs/architecture/dm.md | 43 +++++++++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 15 deletions(-) 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 спеки.