ADR-0004: PostgreSQL как primary store и event store

Status: accepted Date: 2026-04-17 Deciders: команда проекта

Контекст

Нужно выбрать основное хранилище для:

  • операционных данных (canonical products, offers, rules);
  • event store (event sourcing);
  • outbox для Kafka publishing;
  • справочников (manufacturers, characteristics, units).

Также важна гибкая схема для характеристик товаров (разные наборы атрибутов для разных типов).

Решение

PostgreSQL 15+ как primary store, event store и outbox одновременно.

  • Стандартные таблицы + JSONB для flex-схемы характеристик.
  • Отдельные таблицы event_store, snapshot_store, outbox для event sourcing.
  • GIN-индексы по JSONB для faceted-фильтрации локально.
  • Full-text как fallback (основной search — Elasticsearch).

Последствия

Плюсы

  • ACID-транзакции для “записать event + outbox” атомарно.
  • JSONB устраняет необходимость в отдельной document-store (MongoDB).
  • Зрелый операционный опыт, широкая экспертиза.
  • Несложные миграции, git-friendly.

Минусы

  • Масштабирование вверх до определённого порога; горизонтальное — через sharding (не в Phase 0–2).
  • JSONB-индексы сложнее обновлять, чем обычные.

Нейтральные последствия

  • Для некоторых сценариев — возможен pgvector для embedding, но первичный выбор — Elasticsearch dense_vector.

Рассмотренные альтернативы

PostgreSQL + отдельный event store (Kafka-only)

Теряем транзакционность между событием и проекцией/outbox. Нужен хак с “write twice”. Отказались.

MongoDB

Не даёт ACID на нескольких документах (до 4.x), слабее транзакционность, меньше знакомства у команды.

ScyllaDB / Cassandra

Overkill по сложности для Phase 0–2.

Ссылки