We're starting a new project and looking for an appropriate storage solution for our case. Main requirements for the storage are as follows:
- Ability to support highly flexible and connected domain
- Ability to support queries like "give all children of that item and items linked to that children" in ms
- Full text search
- Ad hoc analytics
- Solid read and write performance
- Scalability (as we want to offer a Saas version of our product)
First of all we eliminated all RDBMS, since we have really flexible schema which can also be changed by the customer (add new fields etc.), so supporting such solution in any RDBMS can become a nightmare... And we came to NoSQL. We evaluated sevaral NoSQL storage engines and chose 3 most appropriate (as we think).
MongoDB
Pros:
- Appropriate to store aggregates with flexible structure (as we have them)
- Scalability/Maturity/Support/Community
- Experience with MongoDB on previous project
- Drivers, cloud support
- Analitycs
- Price (it's free)
Cons:
- No support for relationships (relly important for us as we have a lot of connected items)
- Slow retrieval of connected data (all joins happen in app)
Neo4j:
Pros:
- Support of conencted data in modeling, flexibility
- Fast retrieval of interconnected data
- Drivers, cloud support
- Maturity/Support/Comminity (if we compare with other graph Dbs)
Cons:
- No support for aggregate storage (we would like to have aggregates in one vertex than in several)
- Scalability (as far as I know, now all data is duplicated on other servers)
- Analitics ?
- Write performance ? (read several blogs where customers complained on its write performance)
- Price (it is not free for commercial software)
OrientDB
Pros:
- It seems that OrientDB has all the features that we need (aggregates and graphdb in one solution)
- Price (looks like is't free)
Cons:
- Immaturity (comparing with others)
- Really small company behind the technology (In particular one main contributor), so questions about support, known issues etc.
- A lot of features, but do they work pretty well
So now, the main dilemma for as is between Neo4j and OrientDB (MongoDb is a third option because its lack of relationships that are really important in our case - this post explains the pitfalls). I've searched for any benchmarks/comparison of these dbs, but all all of them are old. Here is a comparison by features http://vschart.com/compare/neo4j/vs/orientdb. So now we need an advice from people who already used these dbs, what to choose. Thanks in advance.