文章目录
在系统设计中,一旦谈论到数据库系统,SQL和NoSQL总是我们绕不开的话题。今天就跟大家聊聊这两种数据库的区别和具体的应用场景。
什么是SQL和NoSQL
严谨的社牛 — SQL
SQL(Structured Quert Luanguage) 是关系型数据库中的语言标准。对于SQL和关系型数据库来说,最重要的就是Strucutred和RelationShip,所以我自己认为SQL就像是一个严谨的社牛!对于关系型数据库,它要求你存储的数据都要符合格式标准(Table Schema),所有数据都必须按照它定义好的标准来,这是它严谨性方面的直接体现。另一方面,它又鼓励各个数据之间可以随意的建立连接,互相认识交朋友,建立起庞大的关系网络,这是他社牛属性的体现。
假设我们想要在关系型数据库中存储一个员工的基本信息。
在员工信息的存储中,我们构建了两个Table,分别用来存储员工信息和部门信息。
可以发现,两章表中都包含了主键和数据类型,这是我们在构建Table时必须指定的内容。一旦指定了数据类型,这就意味着你想要存储的数据必须符合所规定的类型,如果你想新加入一个员工的信息,但是这个员工的性别却是一个数字,比如‘3’,这种操作是绝对不允许的,因为SQL已经规定了性别必须是varchar类型。
在关系型数据库中,我们还可以用外键把两个Table联系起来, 用来表示两个数据之间的联系,这也是关系型数据库中独有的特点。关系型数据库中的表关系包括一对一,一对多,多对一,多对多,这些关系构建了不同数据之间的复杂关系网络。
自由的艺术家 — NoSQL
NoSQL(Not only Structured Query Language) 代表了非关系型数据库的机制。对于NoSQL来说,他像是一个自由的艺术家。自由体现在他对数据的存储格式没有约束,你可以在NoSQL中存储各式各样的数据,比如文档、图等等。
假设我们同样想在NoSQL中存储员工信息,并且选择文档数据库来进行存储,那么它会是什么形式呢?
可以看到,员工信息由两个集合组成,分别是个人集合和部门信息集合,这里的集合(Collection)就相当于SQL中的Table概念。但是我们可以发现,集合内存储的东西是类似JSON格式的文本,并且第一个员工李峰存储了性别信息,但是第二个员工却没有存储性别信息。这就是NoSQL的自由性,它不会对数据的格式和存储的内容做出严格的约束。
我们这里使用了文档数据库来存储JSON信息,不同于SQL,NoSQL不仅仅可以存储文档,还可以存储各种各样的数据,大体上NoSQL可以分为四类:
- 文档数据库
- Key-Value数据库
- Graph图数据库
- Column列数据库
总结
到这里大家应该已经基本了解了什么是SQL和NoSQL,在具体研究他们的区别之前,我们先简单的总结一下它们的基本特点。
SQL
- 对数据的格式有严格的约定
- Table必须定义每个属性的数据格式
- 每个Table必须含有主键
- 只能存储Table格式的数据
- 允许Table之间建立联系
- 支持不同Table之间建立一对一、一对多、多对一、多对多的关系
- 支持Join操作来基于关系进行联合查询
- 有统一的查询语言
- 所有的关系型数据库都支持基于SQL的查询语言
NoSQL
- 对数据格式没有约束
- 可以存储文档、图、Key-Value等等
- 每个存储对象是一个集合,集合内的元素可以是各种形式
- 数据之间一般没有或只有很少的关联
- 没有统一的查询语言,每个数据库都会提供自己的API接口
SQL和NoSQL的对比
在介绍完了SQL和NoSQL的基本概念后,相信大家对其都有了基本的了解,接下来我们就看看他们到底有什么具体的区别。
Query
SQL支持Table之间建立多种关系和固定的Table结构,因此SQL可以支持各种复杂多样的嵌套查询。比如在之前的员工信息表中,由于外键的存在,我们可以快速的查找到所有属于研发部门的员工。
NoSQL由于数据格式不统一并且没有统一个查询语言,因此很难实现复杂多样的嵌套查询。
Scalability
SQL数据库在增加capacity的时候,一般会选择垂直扩展,也就是增加的单台服务器的性能。不过,现在的SQL数据库也早已通过分shard来支持了水平扩展,通过对Table进行分区并部署在不同的server上来增加SQL数据库的capacity。但是,由于SQL中的Table之间包含复杂的联系,因此对Table进行分区时通常需要考虑很多因素,包括进行复杂查询时的性能因素等等。
NoSQL数据库在增加capacity的时候,通常会选择水平扩展,也就是通过增加服务器的数量来提升数据库的capacity。由于NoSQL中的数据相当于都是独立的个体,数据之间的联系很少,因此在进行水平扩展的时候更方便,不用考虑复杂的数据关联问题。
Online Processing
SQL数据库更适用于OLTP类的基于事务的处理分析任务,这类任务往往需要对数据进行大量的Update、Insert和Delete等操作,并且经常需要对多个数据进行联合查询。SQL数据库的ACID特性提供了对事务执行的强大支持,因此SQL最为适合处理基于事务的在线分析任务。
NoSQL数据库则没有ACID特性的保证,同时也没有固定的数据格式,这种近乎自由的数据存储给NoSQL带来了更高的性能。因此NoSQL更时候对访问性能有要求同时又不要求数据可靠性的场景,比如搜索,缓存等,都非常时候使用NoSQL来实现。
Property
SQL数据库具有ACID的特性,强调事务和数据的安全可靠性。
NoSQL则不考虑ACID特性,它更注重的是处理任务的性能和吞吐量,不会保证数据的可靠性。
总结
我们可以把SQL和NoSQL的区别总结成如下表格。
SQL | NoSQL |
---|---|
Structured Query Language | Not Only Structured Query Language |
关系型数据库 | 非关系型数据库 |
存储结构性数据,有固定的数据格式 | 存储无结构或弱结构性数据 |
数据存储以行、列的方式存储 | 数据存储在集合中 |
遵循ACID特性,支持事务管理 | 无需遵循ACID特性 |
支持JOIN和复杂查询操作 | 对JOIN和复杂查询的支持有限 |
通常使用垂直扩展来提升Capacity | 通常使用水平扩展来提升Capacity |
MySQL,SqlServer,Oracle | MongoDB,Redis,HBase |