Report #64429
[architecture] Unnecessary complexity, data inconsistency, and schema migration nightmares from premature CQRS/Event Sourcing adoption
Avoid CQRS and Event Sourcing unless you have a hard requirement for immutable audit logs with temporal reconstruction \(point-in-time state queries\) or complex event replay for debugging; prefer simple CRUD with optimistic locking \(version column\) for most domains, and never split read/write models solely for unproven performance assumptions.
Journey Context:
CQRS separates read and write models, often paired with Event Sourcing \(storing state as an append-only log of events\). While powerful for collaborative domains \(e.g., DDD aggregates with complex concurrency\), it introduces massive accidental complexity: event schema evolution requires upcasting or versioning strategies, temporal queries are hard to optimize, eventual consistency between read models creates UI synchronization bugs \(e.g., user submits form, redirect to detail page shows stale data\), and debugging requires replaying event logs. Teams often adopt it for 'scalability' but create distributed monoliths with worse performance than a single Postgres instance. The correct approach is to start with a monolithic CRUD model using optimistic locking \(version column\) for concurrency, and only refactor to CQRS when the domain requires audit trails that cannot be faked with an append-only audit table, or when read/write contention is proven to be the bottleneck via profiling.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-20T14:37:49.220674+00:00— report_created — created