NoSQL stands for Not Only Structured Query Language and was created to solve many of SQL problems which became increasingly critical due to the growth in the amount of data stored. Such problems include: concurrency, durability, scalability, clustering, strict ACID nature, etc.

Still, NoSQL is not as mature as SQL, and the future is yet uncertain for many emerging databases, but it overcomes most of the problems with relational databases. NoSQL is highly scalable, very easy to use and does not consist of schemas. It is a good thing that it can solve many problems, but it is still not perfect and has many cons such as: consistency is not guaranteed, suffers the same durability problems of SQL, still not as mature as SQL, does not fit for every problem so different types of NoSQL storage are generally required for bigger systems.

There are 4 types of NoSQL databases each one with their own specific advantages and disadvantages, and they'll be explained below.

Key-Value Stores

Think of Key-Value Stores as big hash tables. To access data you must know the key for that specific information. From the NoSQL models it is the least complex and the one that can hold the biggest amount of data, but it fails to solve most of the problems due to the lack of complexity and the fact that you must know the key to find the pair. Looking for the information you want is extremely fast, but if you need a database for querying, it will not satisfy your needs.

Big examples of key-value store databases include redis, riak, voldemort and Oracle BDB

Column Family Stores

Column family stores, often called BigTable, is a type of structure created by Google. We could say that from all NoSQL types it is the one that is the most scalable and probably mature. The reason for that is that information is spread on different shards, each shard is stored with three dimensions in mind, and each of these dimensions are a key to find the data you need. Also, data is spread on different nodes with string ordering, so when you are querying and you just need two shards, your request will only visit the shards you need. BigTable structures do what is called MapReduce, which is not the objective of this article to explain.

Column Family Stores are definitely great but they have a drawback since we're talking about a distributed storage system, and all distributed systems fall to the CAP Theorem. The CAP Theorem states that all distributed systems cannot be the three of the following: consistent, available and partition tolerant, so all BigTable databases must choose at most two of the three characteristics.

Big names on this type of NoSQL are definitely HBase and Cassandra. HBase follows CP from the CAP theorem, while Cassandra prefers AP, which makes Cassandra better for real time applications and HBase better in cases where consistency is fundamental.

Document Stores

Document databases were inspired on Lotus Notes and work with collections of versioned documents. Documents on such databases are stored on formats like JSON and BSON (binary json) and have a huge advantage on nesting and easy data modelling. They are quite complex but tend to hold less data than the two previous ones mentioned as many meta-data are required. The biggest advantage of this type of database is the fact that querying is much easier and can perform more efficiently.

Two huge examples of document stores and probably the most popular ones are MongoDb and CouchDb.

Graph Databases

Graph databases are the most complex type of data storage, which grants it a big advantage on performance and flexibility. Graph databases are easy to scale but suffer from the lack of an easy language to program such as SQL which makes it suffer some overhead due to the fact that the programmer might not make the most efficient program. From all NoSQL types, graph databases are the ones that can store the least amount of data since a lot of metadata is required, but in contrast to that, offers great flexibility due to its high complexity.

Common examples of graph databases include Neo4j and Infinite Graph.