5.NoSQL的简介

 

01.NoSQL的简介

1,什么是NoSQL

NoSQL 是 Not Only SQL 的缩写,意即”不仅仅是SQL”的意思,泛指非关系型的数据库。强调Key-Value Stores和文档数据库的优点。

NoSQL产品是传统关系型数据库的功能缩减版本,通过减少用不到或很少用的功能,来大幅度提高产品性能

2,NoSQL起源

过去,关系型数据库(SQL Server、Oracle、MySQL)是数据持久化的唯一选择,但随着发展,关系型数据库存在以下问题。

问题1:不能满足高性能查询需求

我们使用:Java、.Net等语言编写程序,是面向对象的。但用数据库都是关系型数据库。存储结构是面向对象的,但是数据库却是关系的,所以在每次存储或者查询数据时,我们都需要做转换。类似Hibernate、Mybatis这样的ORM框架确实可以简化这个过程,但是在对高性能查询需求时,这些ORM框架就捉襟见肘了。

问题2:应用程序规模的变大

网络应用程序的规模变大,需要储存更多的数据、服务更多的用户以及需求更多的计算能力。为了应对这种情形,我们需要不停的扩展。

扩展分为两类:一种是纵向扩展,即购买更好的机器,更多的磁盘、更多的内存等等。另一种是横向扩展,即购买更多的机器组成集群。在巨大的规模下,纵向扩展发挥的作用并不是很大。首先单机器性能提升需要巨额的开销并且有着性能的上限,在Google和Facebook这种规模下,永远不可能使用一台机器支撑所有的负载。鉴于这种情况,我们需要新的数据库,因为关系数据库并不能很好的运行在集群上

3,NoSQL数据库类型

3.1 键值(Key-Value)数据库[Redis/Memcached]

适用场景:

储存用户信息,比如会话、配置文件、参数、购物车等等。这些信息一般都和ID(键)挂钩,这种情景下键值数据库是个很好的选择。

不适用场景:

  1. 不通过键查询,而是通过值来查询。Key-Value数据库中根本没有通过值查询的途径
  2. 需要储存数据之间的关系。在Key-Value数据库中不能通过两个或以上的键来关联数据。
  3. 事务的支持。在Key-Value数据库中故障产生时不可以进行回滚。

3.2 面向文档(Document-Oriented)数据库[MongoDB]

数据可以使用XML、JSON或者JSONB等多种形式存储。

适用场景:

  1. 日志
  2. 分析

不适用场景:

  • 不支持事务

3.3 列存储(Wide Column Store/Column-Family)数据库[HBASE]

列存储数据库将数据储存在列族(column family)中,一个列族存储经常被一起查询的相关数据。举个例子,如果我们有一个Person类,我们通常会一起查询他们的姓名和年龄而不是薪资。这种情况下,姓名和年龄就会被放入一个列族中,而薪资则在另一个列族中。

适用场景:

  1. 日志
  2. 博客平台,我们储存每个信息到不同的列族中。举个例子,标签可以储存在一个,类别可以在一个,而文章则在另一个。

不适用场景:

  1. ACID事务
  2. 原型设计。在模型设计之初,我们根本不可能去预测它的查询方式,而一旦查询方式改变,我们就必须重新设计列族。

3.4 图(Graph-Oriented)数据库[Neo4J]

适用范围很小,主要用用网络拓扑分析 如脉脉的人员关系图等

4 传统RDBMS VS NOSQL

(1) RDBMS:

  • 高度组织化结构化数据
  • 结构化查询语言(SQL)
  • 数据和关系都存储在单独的表中。
  • 数据操纵语言,数据定义语言
  • 严格的一致性
  • 基础事务

(2) NoSQL:

  • 代表着不仅仅是SQL
  • 没有声明性查询语言
  • 没有预定义的模式
  • 键 - 值对存储,列存储,文档存储,图形数据库
  • 最终一致性,而非ACID【原子,一致,隔离,持久】属性
  • 非结构化和不可预知的数据
  • CAP定理【一致性,可用性,容错性】
  • 高性能,高可用性和可伸缩性