Files
clickstream-data-platform/docs/architecture/dds/README.md
T
ddadmin 9ea361d199 feat(dds): добавлен публичный контракт события
Зачем:
- Показать слой DDS как договор данных, которому не нужна физическая копия.
- Сохранить простой учебный стенд без отдельного маршрута ради узких прав.

Что:
- Добавлено кластерное представление dds.event_v с явными 44 колонками.
- Роли bi_reader разрешено чтение ODS, DDS и DM при договоре чтения через _v.
- Согласованы мастер-спека, ADR, справочники архитектуры и живые тикеты этапа.
- Зафиксировано исследование поведения DEFINER поверх Distributed.

Проверка:
- make config-test
- make smoke
- make check-clickhouse
- Приёмочные запросы: равенство ODS/DDS, состав колонок, коды устройств и права bi.
2026-08-25 17:13:35 -04:00

60 lines
4.8 KiB
Markdown

# Слой DDS: бизнес-модель хранилища
Устройство детального слоя: сущности, которыми хранилище говорит с
витринами, их связи и правила слоя. Набор собирается развилками карты #127
(этап 4) и правится по мере постройки.
Рамки заданы мастер-спекой [«Боевой реализм стенда
(v2)»](../../specs/2026-07-30-stand-v2-realism.md): карта таблиц и витрины —
раздел 7, сверка — раздел 4, склейка идентичностей — раздел 5. Дом выбран
развилкой #130 — первой, которой понадобилось записать резолюцию в доки:
записи этапа 4 живут здесь, по хранилищную сторону границы
«источник | хранилище». Устройство источников остаётся их
собственным наборам ([заказы бэкенда](../orders/README.md)) — генератор
переносим и о нашем DDS не знает.
## Карта модели
Целостность модели — связи и ко-локация — живёт в этом разделе; файлы
сущностей держат глубину и на карту ссылаются.
- **Заказ** (`dds.order_v`, хранение `dds.order_rep` / `_dist`) — физическая
сущность: одна строка — заказ в текущем состоянии, позиции массивами в
строке, наполняется заменой партиций — [модель заказа](order.md).
- **Сессия** (`dds.session_v`, хранение `dds.session_rep` / `_dist`) —
расчётная сущность: одна строка — визит,
нарезку по правилу визита стенд делает сам, `VisitID` генератора — эталон
сверки; наполнение заменой дневной партиции — [модель сессии](session.md).
- **Событие** (`dds.event_v`) — контракт над ODS, а не копия: представление,
переводящее событие на язык бизнес-модели, — [контракт события](event.md).
- **Карта идентичностей** (`dds.identity_map_v`, хранение
`dds.identity_map_rep` / `_dist`) — кука ↔ пользователь магазина —
[модель карты](identity.md).
Связи держатся двумя ключами моста (спека, разделы 4 и 5): `purchaseID[1]`
события равен `order_id` заказа — по нему идут сверка и сборка склейки;
`user_id` заказа связывает куки одного человека. Ко-локацию задаёт
шардирование: события и карта идентичностей раскладываются одним выражением
от куки, заказы — от `order_id`. Поэтому обогащение витрин склейкой
локально, а сверка и сборка карты ходят через GLOBAL JOIN с обеими
сторонами-подзапросами ([исследование
соединений](../../research/2026-08-22-distributed-join.md)).
## Правила слоя
- DDS обслуживает человека с дашбордом: время лежит в поясе счётчика,
пересчёт — один раз при наполнении слоя ([дока хранилища](../storage.md),
«Часовые пояса»).
- Публичный договор каждой сущности — `_v`; роли объектов и конвенция чтения
заданы [докой хранилища](../storage.md), «Имена объектов».
- Служебные колонки — координаты собственной загрузки слоя; чужие ярлыки не
переносятся, а спрашиваются у их слоя по ключу сущности. Вывод правила и
цепочка расследования — [модель заказа](order.md).
- Наполняет слой [дневной конвейер](../etl.md): запуск, объём прогона и
замена партиций на кластере — его устройство.
## Родословная
Дом набора и первая сущность собраны развилкой #130 карты #127; форма
набора — [ADR 0011](../../adr/0011-component-docs.md).