- Зачем:
- три холодных ревью и сверка с документацией ClickHouse нашли противоречия
между докой, ADR и спекой: исполнитель #37 получал два разных ответа на
один вопрос, а два утверждения о движке оказались неверными.
- Что:
- раскладка файлов DDL перестроена — сначала таблицы, матвью приёма
последней: иначе часть событий тихо минует ODS.
- синхронная вставка снята с пути приёма: настройка недостижима для потока
Kafka-движка и связывает шарды; на ETL-вставках осталась.
- у таблицы ошибок появился класс брака с порядком проверки, у сырья и
ошибок названы движки и ключи сортировки.
- в доку добавлен раздел «Что проверено»: сверенное с документацией,
проверяемое на стенде и сказанное по памяти разведены.
- в спеке выправлены источник матвью разбора, пять опорных колонок, имена
четырёх витрин и ссылка на несуществующую цель make.
- Проверка:
- make config-test
- grep по устаревшим именам файлов DDL и витрин — пусто
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
70 lines
6.1 KiB
Markdown
70 lines
6.1 KiB
Markdown
# ADR 0006. Имена объектов хранилища: суффикс вида
|
||
|
||
Дата: 4 августа 2026 года. Статус: принято.
|
||
|
||
## Решение
|
||
|
||
Имя объекта в ClickHouse заканчивается тем, что это за объект: `_rep` —
|
||
локальная таблица шарда, `_dist` — `Distributed` поверх неё, `_kafka` — чтец
|
||
топика, `_mv` — материализованное представление, `_v` — обычное представление.
|
||
|
||
Суффикс носит каждый физический объект, поэтому голого имени у таблицы не
|
||
существует: запрос к `stg.hits_raw` даёт ошибку «нет такой таблицы».
|
||
Единственное исключение — словари: воплощение у них одно, шардировать нечего, и
|
||
суффикс ничего не различал бы. В документах и разговоре голое имя означает
|
||
сущность, у которой этих объектов несколько.
|
||
|
||
Конвенция применена к мастер-спеке тем же решением: `stg.kafka_hits` стал
|
||
`stg.hits_raw_kafka`, `dds.v_event` — `dds.event_v`, витрины `dm.v_*` —
|
||
`dm.*_v`. Полная таблица суффиксов и следствия для DDL — в
|
||
[доке хранилища](../architecture/storage.md).
|
||
|
||
## Почему
|
||
|
||
Главный довод — как ошибается забытый суффикс. Распространённая конвенция, где
|
||
голое имя означает локальную таблицу, а распределённая получает `_all`,
|
||
ошибается молча: запрос к голому имени вернёт данные одного шарда и никак об
|
||
этом не скажет. Правило спеки «проверки и контрольные суммы — только по
|
||
`Distributed`» такую тишину не переживает: контрольная сумма, посчитанная по
|
||
половине кластера, выглядит как честное число. При суффиксе вида голого имени
|
||
нет вовсе, и та же ошибка становится громкой.
|
||
|
||
Второй довод — что группируется в списке по алфавиту. Суффикс группирует объекты
|
||
по сущности: все четыре объекта топика `hits` стоят рядом, потому что различаются
|
||
хвостом. Префиксный стиль, которым пользовался стенд-предшественник (`kafka_*`,
|
||
`mv_*`, `v_*`), группирует по технологии, и объекты одной сущности
|
||
расползаются по алфавиту. В хранилище, где у одной сущности живёт по три-четыре
|
||
воплощения, полезнее первое. Довод про дерево в клиенте и про `ORDER BY name`:
|
||
порядок выдачи `SHOW TABLES` документация не оговаривает, так что на него здесь
|
||
опираться нельзя.
|
||
|
||
Третий — преемственность: `_rep` и `_dist` уже используются владельцем в других
|
||
хранилищах на ClickHouse, и общий словарь между стендами стоит больше, чем
|
||
локальная стройность.
|
||
|
||
Отвергнуты, кроме `_all`: префиксный стиль предшественника — он не покрывает
|
||
пару локальная/распределённая, для неё префикса просто нет; голое имя как
|
||
`Distributed` с суффиксом `_local` у локальной — привычное имя ведёт в
|
||
правильную таблицу, но конвенция расходится с другими стендами владельца;
|
||
раскладка пары по разным базам (`stg` и `stg_dist`) — удваивает число баз в
|
||
каждом слое и разъезжается с таблицей слоёв спеки.
|
||
|
||
Цена решения — правка принятой спеки задним числом. Имена представлений и
|
||
витрин переехали с префикса на суффикс, хотя сами объекты спроектированы не
|
||
полностью и появятся только на этапах 4 и дальше. Размен принят осознанно:
|
||
конвенция, введённая после того, как по ней написан первый слой, обходится
|
||
дороже.
|
||
|
||
## Что проверено
|
||
|
||
Проверять здесь нечем — это соглашение, а не поведение системы. Вместо проверки
|
||
конвенция прогнана по карте таблиц спеки, раздел 7: суффикс выводится для всех
|
||
объектов слоёв STG, ODS, DDS и DM, включая пары локальная/распределённая,
|
||
представления и матвью. Единственным объектом без выводимого суффикса оказался
|
||
словарь `products` — отсюда исключение в решении.
|
||
|
||
Первый прогон был неполным: четыре витрины из восьми остались с префиксом, и
|
||
заметило это холодное ревью, а не автор. Имена приведены в порядок 5 августа
|
||
2026 года. Урок не про имена: «прогнал по документу» — такое же утверждение,
|
||
как утверждение о поведении системы, и проверять его надо так же.
|