3 min read

Event Sourcing vs CQRS

Event Sourcing and CQRS (Command Query Responsibility Segregation) are two distinct architectural patterns that are frequently mentioned together. While they are often used in tandem to solve complex distributed system problems, they are not the same thing, nor do they strictly require each other.

1. The Relationship

  • CQRS is about separating the Read model from the Write model.
  • Event Sourcing is about how you store the state of your application (as a sequence of events).

You can have CQRS without Event Sourcing, and (theoretically) Event Sourcing without CQRS, but they have a symbiotic relationship.

2. CQRS without Event Sourcing

This is a very common pattern.

  • Write Side: Uses a normalized relational database (3NF) optimized for data integrity and updates.
  • Read Side: Uses a denormalized NoSQL database (e.g., Elasticsearch, Redis) or a separate SQL view optimized for fast queries.
  • Sync: A background process or domain events sync the data from Write DB to Read DB.
  • Storage: The Write DB stores the current state (e.g., Balance: 100), not the history.

3. Event Sourcing without CQRS

This is rare and often inefficient.

  • Storage: You store state as a log of events (Deposited, Withdrawn).
  • Querying: To answer "What is the balance of Account X?", you load all events for Account X and replay them. This is fine for a single entity lookup by ID.
  • The Problem: How do you answer "Give me all accounts with a balance > $1000"? You would have to load every event for every account and replay them all. This is impossibly slow.

4. Why they are best friends

Event Sourcing introduces a massive problem: Querying is hard. CQRS solves this problem: Create a dedicated Read Model.

When combined:

  1. Write Side (Event Store): Appends MoneyDeposited event. Fast, simple, audit trail.
  2. Projection (The Glue): An event handler listens to MoneyDeposited.
  3. Read Side (View DB): The handler updates a UserBalance table in a SQL/NoSQL database (UPDATE Accounts SET Balance = Balance + 100).
  4. Query: The client queries the Read Side directly.

5. Summary Table

Feature CQRS Only Event Sourcing Only Combined
Source of Truth Current State DB Event Log Event Log
Complex Queries Fast (Read DB) Very Slow (Replay) Fast (Read DB)
Audit Trail No (unless added manually) Native (100%) Native
Complexity Medium Medium High

6. Projections

In the context of Event Sourcing and CQRS, a Projection is the mechanism that bridges the gap between the Event Log (Write Side) and the Read Model.

  • Definition: A projection is a function that listens to the stream of domain events and updates a specific read database or view.
  • Disposable: Since the Event Log is the source of truth, projections can be deleted and rebuilt from scratch by replaying the events. This is powerful for changing requirements (e.g., "We need a new report format").
  • Multiple Views: You can have multiple projections for the same data.
    • Events: OrderPlaced, OrderShipped.
    • Projection A (User History): Shows a list of past orders for the user.
    • Projection B (Warehouse Dashboard): Shows items pending shipment.

programming/cqrs programming/event-sourcing programming/microservices-architecture