Схемы 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).