- tradition, well-known recipes on how to do things
Basically, if you want to have low-latency access, your concurrency model allows eventual consistency, or you have a need to store your data in non-standard structure such as graphs/trees, use NoSQL and pre-process all data to be exactly in the format you require for reading.
If you need 99.999% guarantee of consistent data, amount of data you need to handle is under 50TB, you can put your data into a fixed schema and latency doesn't matter that much, use SQL.
I would recommend you to ask yourself a question - is your app/business read-heavy or write-heavy and decide accordingly.
NoSQL:
- reading is fast, writing is expensive (if all data are pre-processed/denormalized for reading during the writing phase)
- often schema-less
- low latency (for key-value storage)
- offline batch processing (classical Map Reduce)
- no ACID, choose 2 of 3 in CAP
- demanding on SW engineers to get client-side conflict resolution, tricky in general
- Petabytes of data can be suddenly processed
- huge variation of different paradigms, key-value, document, graph, batch etc.
- haywire indexing
SQL:
- writes are fast (normalization), reads are expensive (JOINs)
- ACID (well, only to some extent, clustering messes up many ACID properties unfortunately and conflicts arise in corner cases)
- set operations and a neat math theory behind them
- stable indexing, easily constructable real-time JOINs
- OLTP
- easier for developers
- non-flexible schema
- tradition, well-known recipes on how to do things
Basically, if you want to have low-latency access, your concurrency model allows eventual consistency, or you have a need to store your data in non-standard structure such as graphs/trees, use NoSQL and pre-process all data to be exactly in the format you require for reading.
If you need 99.999% guarantee of consistent data, amount of data you need to handle is under 50TB, you can put your data into a fixed schema and latency doesn't matter that much, use SQL.
I would recommend you to ask yourself a question - is your app/business read-heavy or write-heavy and decide accordingly.