Thursday, May 17, 2012

Why I Left RavenDB

I've spent the last few months using RavenDB for Presto. I really enjoyed my experience. I fell in love with it for a while. But the more I used it, the more I discovered some things that were hard for me to accept.

It's important to note that I think RavenDB is great for certain scenarios, or for people who don't mind the issues I state below. For me, it just wasn't the right fit. Here's why:

1. The object model is supposed to match the document model in the database. The document model is not how I'm used to dealing with domain entities, and I don’t like that the persistence layer creeps into the domain layer.

2. RavenDB markets itself as “safe by default.” I once thought that was cool, but now I find it limiting. RavenDB only returns 128 documents (rows) by default. One actually has to make an explicit change to get more rows than that.

3. If one makes the change described in point 2, and one wants more than 1024 rows, then another change has to be made on the server side.

4. It is possible to use RavenDB and keep your domain model pure, but that goes directly against the design Zen of RavenDB. And then you have to map documents to your domain model, eliminating one of the main reasons for using it in the first place.

5. RavenDB markets itself as “eventually consistent.” I once thought that was interesting, but now I find it limiting. I don’t want my data to be consistent eventually. I want it to be consistent always.

6. RavenDB’s performance didn't do so well during a prototype.

Raven did have one, big, nice positive: no DB admin work. One doesn’t need to create tables, set foreign keys, etc… It’s a cool feeling to be working with an object variable and just save it. Saves time.