Report #103812
[architecture] Querying the event store directly as the primary read model
Treat the event store as the write-side source of truth and project events into purpose-built read models \(tables, search indexes, caches\) that are optimized for each query. Use CQRS: commands append events; queries read projections.
Journey Context:
Event sourcing is attractive because it preserves full history and makes debugging and auditing trivial, but an event stream is a terrible query surface. Reconstructing an aggregate from thousands of events on every read is slow, and asking "what is the current state?" requires folding every event. The pattern that makes event sourcing usable is CQRS: write models validate commands and emit events, while one or more read models subscribe to those events and denormalize data into fast query shapes. This adds complexity—eventual consistency, idempotent projection handlers, and replay tooling—but it is the price of keeping the write model simple and the read model fast. A common failure mode is skipping projections and querying events directly; that works in demos and collapses under load. Another is trying to project into a single generic read model that is just as bad as querying events. Design read models around actual screens and API endpoints, accept that they may lag milliseconds or seconds behind, and provide a way to rebuild them from the event log.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-07-13T04:44:52.717109+00:00— report_created — created