Схемы ClickHouse
NOTE
Статус: Target schemas. Описание целевых схем данных. Миграции и реальные таблицы в
backend/migrations/могут отставать от документа. Правила маркировки — в50-processes/documentation-standard.md.
DDL для аналитических таблиц и time-series данных.
Назначение
ClickHouse используется для:
- Истории цен (
price_history). - Истории остатков (
stock_history). - Агрегатов по ingestion (
ingestion_stats). - Аналитики поисковых запросов (
search_queries). - Метрик матчинга (
matching_metrics).
Структура
clickhouse/
├── README.md # ← этот файл
├── ddl/
│ ├── 001_price_history.sql
│ ├── 002_stock_history.sql
│ ├── 003_ingestion_stats.sql
│ ├── 004_search_queries.sql
│ └── 005_matching_metrics.sql
└── descriptions/
└── ...
Основные таблицы
price_history
CREATE TABLE price_history (
observed_at DateTime64(3) CODEC(Delta, ZSTD),
supplier_id LowCardinality(String),
supplier_sku String,
canonical_id Nullable(UUID),
currency LowCardinality(String),
price_base Decimal64(4),
price_retail Nullable(Decimal64(4)),
price_tariff Nullable(Decimal64(4)),
pricing_mode LowCardinality(String),
raw_payload_ref Nullable(String)
) ENGINE = MergeTree
ORDER BY (supplier_id, supplier_sku, observed_at)
PARTITION BY toYYYYMM(observed_at)
TTL observed_at + INTERVAL 3 YEAR;stock_history
CREATE TABLE stock_history (
observed_at DateTime64(3) CODEC(Delta, ZSTD),
supplier_id LowCardinality(String),
supplier_sku String,
warehouse_code LowCardinality(String),
warehouse_type LowCardinality(String),
quantity UInt32,
delivery_days Nullable(UInt16),
raw_payload_ref Nullable(String)
) ENGINE = MergeTree
ORDER BY (supplier_id, supplier_sku, warehouse_code, observed_at)
PARTITION BY toYYYYMM(observed_at)
TTL observed_at + INTERVAL 2 YEAR;Kafka → ClickHouse
Рекомендация: Kafka Engine в CH с материализованными представлениями, пишущими в MergeTree таблицы.
CREATE TABLE kafka_price_history_raw (
...
) ENGINE = Kafka
SETTINGS kafka_broker_list = '...',
kafka_topic_list = 'offer.price_changed.v1',
kafka_group_name = 'ch-price-history',
kafka_format = 'JSONEachRow';
CREATE MATERIALIZED VIEW price_history_mv TO price_history AS
SELECT ... FROM kafka_price_history_raw;Срок хранения
price_history: 3 года hot, затем downsample (hourly/daily).stock_history: 2 года hot.ingestion_stats: 1 год.- Остальное — по необходимости.
Что ещё предстоит оформить
- Downsample-задачи (daily aggregation).
- Backup-стратегия (clickhouse-backup).