Короткий ответ
CQRS — разделение модели записи (команды) и модели чтения (запросы), часто с отдельным денормализованным хранилищем для чтения; оправдан, когда профиль чтения сильно отличается от профиля записи по нагрузке или структуре данных.
Как это работает подробнее
Команды изменяют «источник правды» (write model) по доменным правилам; события об изменениях асинхронно проецируются в read-модель, заранее денормализованную под конкретные запросы интерфейса.
Пример кода
Схема
Write model: нормализованные таблицы orders, order_items, доменная валидация
Read model: денормализованная таблица order_summary_view (order_id, user_name, total, status),
обновляется асинхронно по событию "order.changed"Что использовать на практике
- Практика. Применяют там, где чтение требует агрегации из многих источников с высокой частотой и низкой допустимой задержкой, тогда как запись — относительно редкая и сложная операция; read-модель обычно eventually consistent относительно write-модели.
Подводные камни
- Риск. Вводить CQRS «по умолчанию» для простых CRUD-сценариев; не учитывать задержку синхронизации read-модели в UX.