Architecture Tradeoff Explorer

Every comparison answers the same five questions — use when, avoid when, complexity, operational cost, failure modes — so the decision is about your constraints, not the fashion of the year.

CRUD reads and writes one model through one interface; CQRS splits commands (write model) from queries (read models projected from events). CQRS solves read/write shapes and scaling that diverge; for most applications CRUD with good indexes and a few read queries is the right answer.

CQRS
CQRS
CRUD
Database · SELECT, FROM, WHERE, ORDER BY, LIMIT
Use whenReads and writes have different shapes or scale (a normalised write model, a denormalised feed read 1,000× more), or several read models serve different screens.One model serves both sides fine: forms in, tables out, joins at read time. The default for most applications.
Avoid whenThe team cannot explain why the read model may lag the write model, or the UI reads the projection immediately after a command and shows the stale state.Reads need a shape the normalised model cannot serve without twelve joins, or reads must scale independently of writes.
ComplexityHigh: two models, events or change capture between them, projection code, rebuilds, eventual consistency in the UI.Low: one schema, one ORM or query layer.
Operational costProjection lag to monitor, rebuild tooling, two stores to back up and keep consistent.One database; read replicas when reads outgrow the primary.
Failure modesA read model showing an order that does not exist yet, a projection that fell behind for hours, a rebuild that takes a day, two models drifting.A read query that grows to twelve joins and 400 ms; write contention on tables that serve reads.
Data flowCommand → write model → event → projector → read model ← queryRequest → one model → response
ConsistencyEventual between write and read modelsImmediate; one transaction
Middle groundCQRS-lite: separate read queries and DTOs over the same databaseMaterialised views refreshed on a schedule