NoSQL数据库总共有4种大的类别,但是更高层次可以分为两个类别。
1.面向聚合
1.1键值数据库,比如说redis,是基于哈希表实现的,一般用作缓存系统。这种数据库会把每一个记录绑定一个key,如果基于key来操作数据库,效率十分快,但是如果基于内容取查询,那么就必须全表扫描,效率很低。
所以键值数据库一般用于做缓存,内容会与一个id相关连,比如session,购物车这种的。
1.2文档数据库,存储结构是bson类似json,内部的数据结构没有任何限制,可以包含集合类型。同键值数据库一样,文档数据库也有类似主键的概念,但是除此之外,文档数据库可以基于内容检索,可以建立基于文档内容的索引,这是键值数据库所缺乏的。
另外有一点需要注意,文档数据库并不是完全不支持事务,对单个文档的修改是ACID的,但是跨了多个文档就不是了,比如说我们会有订单和顾客,因为二者都有查询请求,所以需要单独设计两个文档,但是顾客需要有订单的信息,所以需要一个list存所有的该顾客的订单,这时如果删除一条订单,就需要先删除订单文档,再删除顾客文档里的订单id,这就是跨文档的操作,不支持事务。
文档数据库一般用于关联较少的场景,可以通过聚合手段把全部信息封在一个文档里面,比如说帖子和回贴,这种情况可以把回帖作为帖子的一个list来存在文档里面,因为一般回帖是要依附于帖子出现的。还有就是能够利用文档无类型的特性,比如相同的数据可能来自不同的机器,那么存在文档里没有问题,典型的就是日志,可能不同机器不同应用的日志结构不一样,但是都可以存到文档日志中。
1.3列族数据库,一般的数据库都是一行一行存,但是列族数据库的思想是一列一列存。所以最后相邻的数据都是某一列的。一般的数据库读写操作都是基于某一列或者某几列来进行的,那么如果基于行存放,一次性就需要把一行的数据全拿出来,但是我们只用其中的几列,所以需要进行更多次的IO,但是基于列就需要操作更少的数据量,在这种情况下,读写效率很高。这也就是列族数据库的应用场景。比如说博客系统,我们可以按标题存一列,按作者一列,类别一列,内容一列。这样,“查询所有的文章标题”这样的操作就会执行的很快。
2.面向图
这种数据库主要基于数据结构与算法中的图类型来构建,主要的使用场景是关系查询比较多。以往的关系型数据库也可以做这个,但是需要为每一种关系都定义一个关系表,而且查找操作比较费时,如果基于图来构建,那么查找起来就只是一次邻边的获取,在诸如用户关系,喜好之类的场景可以用图数据库。
参考:http://www.csdn.net/article/2013-07-24/2816330-how-to-choose-nosql-db