CQRS (Command Query Responsibility Segregation) separates read and write operations into different models. Commands (writes) update one database optimized for writes. Queries (reads) read from a different database optimized for reads. Often paired with Event Sourcing. Allows independent scaling of reads/writes, different data models per use case. Adds complexity—eventual consistency, maintaining sync, more code. Only use when reads/writes have very different needs.
Use CQRS when read and write workloads are vastly different (100:1 read/write ratio), when you need different data models for reads vs writes, when paired with Event Sourcing (event store for writes, projections for reads), or in complex domains where write validation differs from read optimization. Don't use for simple CRUD—adds huge complexity. Most apps don't need CQRS.
System Design Patterns
Separate reads from writes