第一章 走进MongoDB

1.1NoSQL是什么?
     
1.1.1NoSQL简介

       对于不了解NoSQL的人都会认为NoSQL为No SQL,即不是SQL。但是这种理解是错误的,NoSQL应该是Not Only SQL,翻译过来为不仅仅是SQL。从这个翻译中我们可以看出来,NoSQL仍然还是SQL。

NoSQL是一场反SQL的革命性的数据库运动,在很早就有人提出来,但是一直没有很好地发展,直到互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。

今天NoSQL泛指这样一类数据库和数据存储,它们不遵循经典关系型数据库(RDBMS)原理,且常与Web规模的大型数据集有关。

     
1.1.2NoSQL发展背景及优势


随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,暴漏许多问题,例如:


1、
High performance - 对数据库高并发读写的需求


web2.0网站要根据用户个性化信息来实时生成动态页面和提供动态信息,所以基本上无法使用动态页面静态化技术,因此数据库并发负载非常高,往往要达到每秒上万次读写请求。关系数据库应付上万次SQL查询还勉强顶得住,但是应付上万次SQL写数据请求,硬盘IO就已经无法承受了。其实对于普通的BBS网站,往往也存在对高并发写请求的需求。


2、
Huge Storage - 对海量数据的高效率存储和访问的需求


对于大型的SNS网站,每天用户产生海量的用户动态,以国外的Friendfeed为例,一个月就达到了2.5亿条用户动态,对于关系数据库来说,在一张2.5亿条记录的表里面进行SQL查询,效率是极其低下乃至不可忍受的。再例如大型web网站的用户登录系统,


3、
High Scalability && High Availability- 对数据库的高可扩展性和高可用性的需求


在基于web的架构当中,数据库是最难进行横向扩展的,当一个应用系统的用户量和访问量与日俱增的时候,你的数据库却没有办法像web server和app server那样简单的通过添加更多的硬件和服务节点来扩展性能和负载能力。对于很多需要提供24小时不间断服务的网站来说,对数据库系统进行升级和扩展是非常痛苦的事情,往往需要停机维护和数据迁移,为什么数据库不能通过不断的添加服务器节点来实现扩展呢?

在上面提到的“三高”需求面前,关系数据库遇到了难以克服的障碍,而对于web2.0网站来说,关系数据库的很多主要特性却往往无用武之地,例如:


1 数据库事务一致性需求


2 数据库的写实时性和读实时性需求


3 对复杂的SQL查询,特别是多表关联查询的需求


因此,关系数据库在这些越来越多的应用场景下显得不那么合适了,为了解决这类问题的非关系数据库应运而生。


NoSQL 是非关系型数据存储的广义定义。它打破了长久以来关系型数据库与ACID理论大一统的局面。NoSQL 数据存储不需要固定的表结构,通常也不存在连接操作。在大数据存取上具备关系型数据库无法比拟的性能优势。该术语在 2009 年初得到了广泛认同。


NoSQL数据库有以下优点:


1 简单的扩展


2 快速的读写


3 低廉的成本


4 灵活的数据类型


NoSQL虽然优点众多,但是它还是有缺点的,例如:


1 不提供对SQL的支持

2 产品混乱,许多缺乏厂商的支持

1.1.3NoSQL现状
随着web2.0的发展和更多的NoSQL数据库的努力,现在越来越多的NoSQL数据库变得更加的完善,功能更加的强大,部分数据库已经完全能够达到商用的要求了。越来越多的企业开始使用NoSQL数据库了,例如下面列出的部分企业:
新浪微博  redis
Google    BigTable
Amazon   SimpleDB
视觉中国网站  MongoDB
优酷运营数据分析  MongoDB
豆瓣社区   BeansDB
……

目前NoSQL数据库主要分为key-value数据库、文档型数据库、列式数据库、图形数据库。
Key-value数据库是一种以键值对存储数据的一种数据库,类似java中的map。可以将整个数据库理解为一个大的map,每个键都会对应一个唯一的值。Key-value数据库代表的有redis。Redis是一个Key-Value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。另外redis是一种内存型的数据库,所以可以对外提供很好地读写操作,但是同样也暴露出内存占用高,数据持久化不易等问题。
列式数据库是以列相关存储架构进行数据存储的数据库,主要适合与批量数据处理和即席查询。传统的行式数据库,是按照行存储的,维护大量的索引和物化视图无论是在时间(处理)还是空间(存储)方面成本都很高。而列式数据库恰恰相反,列式数据库的数据是按照列存储,每一列单独存放,数据即是索引。只访问查询涉及的列,大大降低了系统I/O,每一列由一个线来处理,而且由于数据类型一致,数据特征相似,极大方便压缩。行式数据库擅长随机读操作,列式数据库则更擅长大批量数据量查询。
图形数据库又称图数据库,是一种非关系型数据库,它应用图形理论存储实体之间的关系信息。最常见的一个例子,就是社会网络中人与人之间的关系。关系型数据库用于存储“关系型”数据的效果并不好,其查询复杂、缓慢、超出预期,而图形数据库的独特设计恰恰弥补了这个缺陷。比较有名的图数据库是Neo4j。。它是一个可嵌入,基于磁盘的Java持久化引擎,其数据存储采用图形结构来代替表格。一张graph就是一种网状的结构图更适合于敏捷、快速开发。特性:能够以直观,面向图形的方式展示数据,网状结构图由节点,关联和属性组成。Neo能够在单一计算机上处理几十亿个节点,关联和属性。
文档数据库不是文档管理系统。刚接触NoSQL的开发者常会混淆文档数据库和文档/内容管理系统。文档数据库中的文档一词意指文档中松散结构的键/值对集合,通常是JSON(JavaScript Object Notation,JavaScript对象表示法),而非一般意义的文档或表格(尽管它们也能被存储)。文档数据库把文档当作一个整体,不会将文档分割成多个键/值对。在集合层面上,这使得不同结构的文档可以放在同一个集合里。文档数据库支持文档索引,不仅包括主标识符,还包括文档的属性。当今为数不多的开源文档数据库中,最声名远扬的要数MongoDB和CouchDB。

04-17 07:01