Files
clickstream-data-platform/sql/ddl/05-dic-catalog.sql
T
ddadminandClaude Opus 5 5cc0ede75a fix(clickhouse): починена проверка словаря, выметены хвосты переноса
Зачем: ревью в три линии нашло настоящий дефект. Девятая проверка кластера
звала dictGet('dds.products', …) — объекта после переноса не существует, и
make check-clickhouse падал. Промах вырос из недосчёта: упоминания dds.products
я искал с фильтром по расширениям, .sh туда не попал, и в ADR уехало «четыре
упоминания» вместо семи.

Что: проверка переведена на dic.products и сверяет цену, умножив её обратно на
сто, — так утверждается ещё и точность приведения к Decimal. Раздел 3
мастер-спеки и список пользователей README догнали перенос: оба описывали
отменённое устройство. В ADR 0012 добавлено условие пересмотра для дома — для
него его не было, хотя ради дома тикет и заводился; недосчёт записан в
«Что проверено» как урок. Разнобой обозначений сведён: карта таблиц в доке
хранилища перешла на имена баз строчными, таблица мастер-спеки — на заголовок
«Где», зону всюду зовут зоной, а не слоем. Термин «Справочник» переписан без
метафоры и уложен в формат глоссария. Вычтено лишнее: комментарии DDL
сократились вдвое, из ADR 0006 и 0007 убраны самооправдание и дублирующие
абзацы, отраслевой образец получил честную оговорку о непроверяемости.

Проверка: make config-test, make lint, make smoke и make check-clickhouse —
все зелёные, десять проверок кластера из десяти.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-20 12:10:03 +03:00

49 lines
2.6 KiB
SQL

-- Каталог товаров: подложка на файловом движке и словарь поверх неё.
--
-- Словарь читает не файл, а таблицу хранилища. Это намеренное усложнение ради
-- урока: в бою справочник приезжает процессом, и предложение SOURCE с запросом
-- и учётной записью — та форма, которую менти встретит. Доводы, отвергнутые
-- варианты и условия пересмотра — ADR 0012.
-- Подложка ничего не хранит: движок File перечитывает CSV на каждом запросе,
-- поэтому правка каталога доезжает до словаря сама. Путь считается от
-- user_files, а не от корня данных. Типы повторяют файл, а не модель: цена
-- лежит целыми копейками, приведение делает словарь.
CREATE TABLE IF NOT EXISTS dic.products_file ON CLUSTER clickstream_cluster
(
sku String,
name String,
category String,
brand String,
price Int64,
demand String
)
ENGINE = File(CSVWithNames, './catalog/products.csv');
-- Пользователь dict умеет одно — читать dic. Назвать его обязательно: без user
-- словарь идёт как default с пустым паролем и падает. Хост локальный, поэтому
-- запрос к подложке идёт без сети.
--
-- Форма query, а не table: словарь приводит копейки каталога к Decimal(18, 2)
-- прямо на входе, то есть нормализует, а не зеркалит подложку. Ключ строковый,
-- поэтому COMPLEX_KEY_HASHED: числовой FLAT здесь неприменим.
--
-- Окно вместо LIFETIME(0): словарь обновляется сам, а цена этому — ноды
-- расходятся почти на всё окно (ADR 0012).
CREATE DICTIONARY IF NOT EXISTS dic.products ON CLUSTER clickstream_cluster
(
sku String,
name String,
category String,
brand String,
price Decimal(18, 2),
demand String
)
PRIMARY KEY sku
SOURCE(CLICKHOUSE(
host 'localhost' port 9000 user 'dict'
query 'SELECT sku, name, category, brand, toDecimal64(price, 2) / 100 AS price, demand FROM dic.products_file'
))
LAYOUT(COMPLEX_KEY_HASHED())
LIFETIME(MIN 60 MAX 90);