【系统设计面试必备系列】一文带你完全弄懂NoSQL和SQL!!!

在系统设计中,一旦谈论到数据库系统,SQL和NoSQL总是我们绕不开的话题。今天就跟大家聊聊这两种数据库的区别和具体的应用场景。

什么是SQL和NoSQL

严谨的社牛 — SQL

SQL(Structured Quert Luanguage) 是关系型数据库中的语言标准。对于SQL和关系型数据库来说,最重要的就是StrucutredRelationShip,所以我自己认为SQL就像是一个严谨的社牛!对于关系型数据库,它要求你存储的数据都要符合格式标准(Table Schema),所有数据都必须按照它定义好的标准来,这是它严谨性方面的直接体现。另一方面,它又鼓励各个数据之间可以随意的建立连接,互相认识交朋友,建立起庞大的关系网络,这是他社牛属性的体现。

假设我们想要在关系型数据库中存储一个员工的基本信息。

![[Pasted image 20231210193920.png]]

在员工信息的存储中,我们构建了两个Table,分别用来存储员工信息和部门信息。

可以发现,两章表中都包含了主键和数据类型,这是我们在构建Table时必须指定的内容。一旦指定了数据类型,这就意味着你想要存储的数据必须符合所规定的类型,如果你想新加入一个员工的信息,但是这个员工的性别却是一个数字,比如‘3’,这种操作是绝对不允许的,因为SQL已经规定了性别必须是varchar类型。

在关系型数据库中,我们还可以用外键把两个Table联系起来, 用来表示两个数据之间的联系,这也是关系型数据库中独有的特点。关系型数据库中的表关系包括一对一,一对多,多对一,多对多,这些关系构建了不同数据之间的复杂关系网络。

自由的艺术家 — NoSQL

NoSQL(Not only Structured Query Language) 代表了非关系型数据库的机制。对于NoSQL来说,他像是一个自由的艺术家。自由体现在他对数据的存储格式没有约束,你可以在NoSQL中存储各式各样的数据,比如文档、图等等。

假设我们同样想在NoSQL中存储员工信息,并且选择文档数据库来进行存储,那么它会是什么形式呢?
![[Pasted image 20231212211412.png]]

可以看到,员工信息由两个集合组成,分别是个人集合和部门信息集合,这里的集合(Collection)就相当于SQL中的Table概念。但是我们可以发现,集合内存储的东西是类似JSON格式的文本,并且第一个员工李峰存储了性别信息,但是第二个员工却没有存储性别信息。这就是NoSQL的自由性,它不会对数据的格式和存储的内容做出严格的约束

我们这里使用了文档数据库来存储JSON信息,不同于SQL,NoSQL不仅仅可以存储文档,还可以存储各种各样的数据,大体上NoSQL可以分为四类:

  • 文档数据库
  • Key-Value数据库
  • Graph图数据库
  • Column列数据库
    ![[Pasted image 20231211221324.png]]

总结

到这里大家应该已经基本了解了什么是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的区别总结成如下表格。

SQLNoSQL
Structured Query LanguageNot Only Structured Query Language
关系型数据库非关系型数据库
存储结构性数据,有固定的数据格式存储无结构或弱结构性数据
数据存储以行、列的方式存储数据存储在集合中
遵循ACID特性,支持事务管理无需遵循ACID特性
支持JOIN和复杂查询操作对JOIN和复杂查询的支持有限
通常使用垂直扩展来提升Capacity通常使用水平扩展来提升Capacity
MySQL,SqlServer,OracleMongoDB,Redis,HBase
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值