Контракт события: представление dds.event_v #150

Closed
opened 2026-08-25 15:00:54 +03:00 by ddmitry · 0 comments
Owner

Part of #6.

Цель

dds.event_v — публичный договор события: обычное представление над
ods.event_v вторым уровнем, явный список колонок, язык бизнес-модели.
Учебный результат (event.md): первый на стенде пример правила «слой —
контракт, а не обязательно копия данных».

Потребительские запросы читают _v, но права доступа намеренно шире договора:
bi_reader технически читает ODS, DDS и DM целиком. Узкая граница поверх
Distributed потребовала бы отдельной межсерверной механики без нового урока;
решение и проверка ClickHouse 26.3 записаны в ADR 0007 и исследовании задачи.

Что войдёт

  • DDL в sql/ddl/ очередным номером: представление ON CLUSTER (база dds
    есть в 00-databases.sql), форма — по конвенции storage.md «Имена
    объектов».
  • Имена модели: WatchID → event_id; UTCEventTime → event_time в
    поясе счётчика, второй метки времени нет; event_date — переименование
    EventDate, не пересчёт (оговорка исследования #128: пересчёт ослепил
    бы индекс); client_id и client_timezone остаются.
  • Одна расшифровка: device_category — коды 1–4 в desktop / mobile /
    tablet / tv. Другие коды остаются кодами.
  • Скрыто: VisitID, Sign, сырой ecommerce, _load_id / _load_ts.
    Всё остальное отдаётся, включая ip_address, оба region_*_id и
    разобранные массивы purchase_* / product_*.
  • Роль bi_reader получает SELECT ON ods.*, dds.* и dm.*.
    Публичную поверхность задают _v, документация и ревью, а не отдельные
    гранты. ADR 0007 и storage.md уточняются тем же PR.

Границы

  • Витрины DM — тикеты витрин; сессии — свой тикет.
  • Материализация не строится; словарь регионов не заводится (лаба #143).
  • Отдельный межсерверный маршрут или пользователь ради узких прав не
    добавляется.

Кому что

Список колонок и DDL — Opus: контракт и есть урок. Codex — контрольные
прогоны по брифу.

Сначала прочитать

  • docs/architecture/dds/event.md — целиком, это спека тикета;
  • docs/formats/clickstream-event.md — нормализованные имена и состав
    выгрузки;
  • docs/research/2026-08-22-view-predicate-pushdown.md — обе оговорки
    контракта;
  • docs/research/2026-08-25-clickhouse-distributed-view-security.md — почему
    право bi_reader шире публичной поверхности;
  • docs/architecture/storage.md — «Имена объектов», «Часовые пояса».

Проверка

  • make config-test (правка access.xml); на стенде make smoke,
    make check-clickhouse зелёные.
  • event_id совпадает с WatchID, счёт строк равен ods.event_v;
    показания event_time — местные: смещены от показаний UTCEventTime
    на пояс счётчика (сравнение через toString).
  • Каждый из четырёх кодов DeviceCategory даёт свою строку
    device_category.
  • bi читает dds.event_v и ods.event_v, но получает отказ при
    чтении STG; SHOW GRANTS содержит SELECT на ODS, DDS и DM.
Part of #6. ## Цель `dds.event_v` — публичный договор события: обычное представление над `ods.event_v` вторым уровнем, явный список колонок, язык бизнес-модели. Учебный результат (event.md): первый на стенде пример правила «слой — контракт, а не обязательно копия данных». Потребительские запросы читают `_v`, но права доступа намеренно шире договора: `bi_reader` технически читает ODS, DDS и DM целиком. Узкая граница поверх `Distributed` потребовала бы отдельной межсерверной механики без нового урока; решение и проверка ClickHouse 26.3 записаны в ADR 0007 и исследовании задачи. ## Что войдёт - DDL в `sql/ddl/` очередным номером: представление ON CLUSTER (база `dds` есть в `00-databases.sql`), форма — по конвенции storage.md «Имена объектов». - Имена модели: `WatchID` → `event_id`; `UTCEventTime` → `event_time` в поясе счётчика, второй метки времени нет; `event_date` — переименование `EventDate`, не пересчёт (оговорка исследования #128: пересчёт ослепил бы индекс); `client_id` и `client_timezone` остаются. - Одна расшифровка: `device_category` — коды 1–4 в `desktop` / `mobile` / `tablet` / `tv`. Другие коды остаются кодами. - Скрыто: `VisitID`, `Sign`, сырой `ecommerce`, `_load_id` / `_load_ts`. Всё остальное отдаётся, включая `ip_address`, оба `region_*_id` и разобранные массивы `purchase_*` / `product_*`. - Роль `bi_reader` получает `SELECT ON ods.*`, `dds.*` и `dm.*`. Публичную поверхность задают `_v`, документация и ревью, а не отдельные гранты. ADR 0007 и storage.md уточняются тем же PR. ## Границы - Витрины DM — тикеты витрин; сессии — свой тикет. - Материализация не строится; словарь регионов не заводится (лаба #143). - Отдельный межсерверный маршрут или пользователь ради узких прав не добавляется. ## Кому что Список колонок и DDL — Opus: контракт и есть урок. Codex — контрольные прогоны по брифу. ## Сначала прочитать - docs/architecture/dds/event.md — целиком, это спека тикета; - docs/formats/clickstream-event.md — нормализованные имена и состав выгрузки; - docs/research/2026-08-22-view-predicate-pushdown.md — обе оговорки контракта; - docs/research/2026-08-25-clickhouse-distributed-view-security.md — почему право `bi_reader` шире публичной поверхности; - docs/architecture/storage.md — «Имена объектов», «Часовые пояса». ## Проверка - [x] `make config-test` (правка access.xml); на стенде `make smoke`, `make check-clickhouse` зелёные. - [x] `event_id` совпадает с `WatchID`, счёт строк равен `ods.event_v`; показания `event_time` — местные: смещены от показаний `UTCEventTime` на пояс счётчика (сравнение через `toString`). - [x] Каждый из четырёх кодов `DeviceCategory` даёт свою строку `device_category`. - [x] `bi` читает `dds.event_v` и `ods.event_v`, но получает отказ при чтении STG; `SHOW GRANTS` содержит `SELECT` на ODS, DDS и DM.
ddmitry added a new dependency 2026-08-25 15:01:21 +03:00
ddmitry self-assigned this 2026-08-25 22:59:52 +03:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Reference: ddmitry/clickstream-data-platform#150