We have recently been trying to find a decent database scaling solution for a product we are building, and have been coming up with lots of solutions, many of them seem fun and interesting, but none of them seemed to get our complete agreement. So we set out to have a structured way to choose which road we go down, when trying to build a distributed application with distributed persistance.Brewer's (CAP) Theorem states:

There are three core systemic requirements that exist in a special relationship when it comes to designing and deploying applications in a distributed environment: Consistency, Availability and Partition Tolerance. You can only optimize for two at the expense of the third