CQRS (Command Query Responsibility Segregation) — разделение модели на запись (commands) и чтение (queries). Вместо одной модели для всего делаешь две: одна оптимизирована для записи, другая — для чтения.
Write Model (Command):
CreateOrder → INSERT в нормализованную БД
UpdateOrder → UPDATE
Read Model (Query):
GetOrderDashboard → SELECT из денормализованной view/таблицы
SearchOrders → Elasticsearch
Зачем: запись и чтение часто имеют разные требования. Для записи важна консистентность и нормализация. Для чтения — скорость и удобная структура. С CQRS можно читать из Redis/Elasticsearch, а писать в PostgreSQL.
Минусы: eventual consistency между моделями, сложность синхронизации, больше кода. Не нужен для простых CRUD-приложений — overkill. Оправдан когда паттерны чтения и записи сильно различаются, нагрузка на чтение в 10-100 раз больше записи.