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.