In this chapter, we took CQRS to a whole new level and learned how to query data that we initially stored as streams of events. Since event streams are hard to query on demand, we need to build snapshots of data that we can show to our users. The power of event-sourced read models is that we can build virtually an unlimited number of use case-specific read models, with very precise sets of data. We could avoid things such as joins across object collections or tables, or even between remote services. We can remove all read models at once and rebuild them from scratch, using only events. If we somehow created our projection in a way that it showed the wrong data on screen, then we can quickly catch the bug and fix the read models by removing and rebuilding them.
Of course, everything has its trade-offs. Sometimes, we can't receive all the data that we need for a read...