为什么需要NOSQL

来源:互联网 发布:北京科瑞明软件招聘 编辑:程序博客网 时间:2024/05/01 03:52


传统的数据库确实有很多不适合的场景和技术局限性,其中主要的局限性包括数据模型僵硬,

可扩展性差,处理海量数据时的性能瓶颈,缺乏处理半结构和非结构化数据的能力。

关系型数据库的核心是强一致性的关系模型,当初的设计理念将ACID放在首位,其次考虑性能与可扩展性。而当人们发现并不是所有的数据都要求那么强的一致 性,同时对于性能和数据量的需求越来越高时,NoSQL就开始登场了。NoSQL主要将可扩展性放在首位(也就是P基本是所有NoSQL的必备条件),而高可用或一致性则放到了第二档(A或者C)。这种设计自然和原本的关系模型产生了极大的差异,这也就是为什么说NoSQL叫做Not Only SQL。因为既然已经不是关系模型了,有些场景下使用关系查询语言SQL,可能并不能够最有效地发挥出NoSQL的优势。


NoSQL与关系型数据库的对比:关系模型把过去混乱的数据存储关系用一种严格的数学模型描述出来,而其查询语言SQL则可以用简单直观的语法, 把各个实体之间的关系明确地表达出来。

而NoSQL与传统数据库的发展历史相比还非常年轻,因此NoSQL现在主要是作为一种对关系型数据库的补充,在关系型数据库不适用的领域填补进去。那么这个“关系型数据库不适用的领域”,这个范围到底有多大呢?这个就要看所谓的大数据到底能走多远。

大数据领域强调的是分布式计算,而关系型数据库为了维持强一致性需要在实体间进行非常多的数据交互。因此分布式计算就是关系模型的一个不大适用的领域。

所以我认为可以这样总结,当需要强一致性的场景,最好使用关系型数据库

在分布式计算和高性能存储的场景,考虑使用NoSQL。


实际上NoSQL里面也有很多不同的类型。一般来说我们把它分为四类,包括key/value,文档型,宽表,与graph。graph的应用范围相对比较窄,用于描述实体之间的关系,我们在这里不多说。key/value,文档型和宽表,各有各的特 点,和传统关系型数据库比起来也拥有各自的典型应用场景:

key/value:redis就是一个非常典型的keyvalue内存式数据库,它的用途主要就是在高性能访问的时候。但是一般来说key/value 数据库因为数据模型简单,所以更多时候被看做是一个键值存储引擎,而不是拥有强大计算能力的数据库引擎。因此key/value数据库在简单的高性能数据模型的场景下很实用,但是当业务逻辑越来越复杂的时候就会凸显其劣势了。

文档型数据库一般来说被认为是最接近传统关系型数据库的NoSQL。这也要归功于MongoDB所引领的潮流。文档型数据库的核心是数据嵌套,将原本一些星形模式(Star Schema)的数据嵌套在同一条记录中以减少表之间关联的需求。这种设计可以从某种程度上大大简化传统数据库复杂的关联问题,同时由于摆脱了关系模型里面的强一致性限制,文档型数据库还可以做到水平扩张与高可用。

宽表是google bigtable引领的潮流,本质就是把数据切成多个块(也叫做column family),存放在不同的地方。应用程序的典型用法,是根据某种条件找到记录后,只在里面搜索有限数量个字段,这样的话宽表能够有效地利用切分的数据块,尽可能减少I/O。宽表一般被用于拥有大量字段的场景,比如每条记录拥有成千上万的字段,用这种方式能够有效地减少I/O。不过大部分的应用可能都到不了这种规模。



Redis
所用语言:C/C++
特点:运行异常快
使用许可: BSD
协议:类 Telnet
有硬盘存储支持的内存数据库,
但自2.0版本以后可以将数据交换到硬盘(注意, 2.4以后版本不支持该特性!)
Master-slave复制(见编注3)
虽然采用简单数据或以键值索引的哈希表,但也支持复杂操作,例如 ZREVRANGEBYSCORE。
INCR & co (适合计算极限值或统计数据)
支持 sets(同时也支持 union/diff/inter)
支持列表(同时也支持队列;阻塞式 pop操作)
支持哈希表(带有多个域的对象)
支持排序 sets(高得分表,适用于范围查询)
Redis支持事务
支持将数据设置成过期数据(类似快速缓冲区设计)
Pub/Sub允许用户实现消息机制
最佳应用场景:适用于数据变化快且数据库大小可遇见(适合内存容量)的应用程序。
例如:股票价格、数据分析、实时数据搜集、实时通讯。
(编注3:Master-slave复制:如果同一时刻只有一台服务器处理所有的复制请求,这被称为 Master-slave复制,通常应用在需要提供高可用性的服务器集群。)


MongoDB
所用语言:C++
特点:保留了SQL一些友好的特性(查询,索引)。
使用许可: AGPL(发起者: Apache)
协议: Custom, binary( BSON)
Master/slave复制(支持自动错误恢复,使用 sets 复制)
内建分片机制
支持 javascript表达式查询
可在服务器端执行任意的 javascript函数
update-in-place支持比CouchDB更好
在数据存储时采用内存到文件映射
对性能的关注超过对功能的要求
建议最好打开日志功能(参数 --journal)
在32位操作系统上,数据库大小限制在约2.5Gb
空数据库大约占 192Mb
采用 GridFS存储大数据或元数据(不是真正的文件系统)
最佳应用场景:适用于需要动态查询支持;需要使用索引而不是map/reduce功能;需要对大数据库有性能要求;需要使用CouchDB但因为数据改变太频繁而占满内存的应用程序。
例如:你本打算采用MySQL或PostgreSQL,但因为它们本身自带的预定义栏而让你望而却步。


HBase
(配合 ghshephard使用)
所用语言: Java
特点:支持数十亿行X上百万列
使用许可: Apache
协议:HTTP/REST (支持 Thrift,见编注4)
在 BigTable之后建模
采用分布式架构 Map/reduce
对实时查询进行优化
高性能 Thrift网关
通过在server端扫描及过滤实现对查询操作预判
支持 XML, Protobuf, 和binary的HTTP
Cascading, hive, and pig source and sink modules
基于 Jruby( JIRB)的shell
对配置改变和较小的升级都会重新回滚
不会出现单点故障
堪比MySQL的随机访问性能
最佳应用场景:适用于偏好BigTable:)并且需要对大数据进行随机、实时访问的场合。
例如: Facebook消息数据库


参考:http://www.cnblogs.com/smileberry/p/3805905.html

http://www.dataguru.cn/article-3448-1.html

0 0
原创粉丝点击