I've been asked about my opinion on the CouchDb (MongoDb) multiple times. Here's my current analysis and opinion.
As any .NET developer I've tried working with the document-oriented databases. In my case the introduction started with the CouchDB. There was some research and development including the NCouch project.
CouchDB is a database famous for its distributed nature, great read performance and schema-less nature of the documents (CouchDb overview and introduction for .NET).
These nice features come right of the box, when you deploy CouchDB. And they are actually available out there for you because CouchDB partially implements Command-Query Responsibility Segregation principles. These benefits are inherent to the CQRS:
- Free schema
- High read performance
- Free schema in CouchDb - persistence ignorance in the CQRS.
- Multiple view engines in CouchDb - multiple subscribed event denormalizers in the CQRS.
- High read performance of CouchDb views - high read performance against denormalized query tables.
- Auto replication in CouchDb - Publish/Subscribe in CQRS.
From this standpoint CouchDb is an extremely nice base for building lightweight and high-performance document-oriented web applications, since you get all the performance features packed nicely with the REST API, JSON and ability to write view engines in multiple languages.
CouchDb might work for you even if you are not working on the web. If your solution is heavily into the domain of documents and unstructured data, then CQRS has chances of fitting nicely there.
However, if your domain deals with the business processes, where changes could be more important than just the data, then it is better to implement a CQRS-based solution yourself. You'd get similar performance and scalability benefits as CouchDb.
Let's take a moment to think about the logical differences between the data (state) and changes.
State is a version of a document, static snapshot or immutable representation of something. Change is a step in the process, that describes "how did we get to the version 2 from version 1" or "what happened between the lines". As such, change captures much more contextual information about the process, than the mere difference between the two versions.
In business contextual information is the king. It is so important, that changes are often treated like full-class citizens. Sometimes you can meet them under the names of events, commands or workflows. We even got persistence pattern that is based on events, rather than on the state - Event Sourcing.
Given all that, my impression about CouchDB is: CouchDB is a young document-oriented database that leans towards the web applications and is based on the CQRS principles. The latter gives it nice performance, distribution and scalability.
Unfortunately, as a .NET developer focused on the distributed enterprise applications targeting business scenarios, I don't have a lot of use cases for such an interesting tool.