关系型数据库 vs 非关系型数据库

结构化数据、非结构化数据与半结构化数据

结构化数据:
由二维表结构来逻辑表达和实现的数据,严格遵循数据格式与长度规范,也称作为行数据,特点为:数据以行为单位,一行数据表示一个实体的信息,每一行数据的属性是相同的。

非结构化数据:
指的是数据结构不规则或不完整,没有任何预定义的数据模型,不方便用二维逻辑表来表现的数据,例如图片、HTML、各类报表、视频音频等。

半结构化数据:
介于结构化与非结构化数据之间的数据就是半结构化数据了,它是结构化数据的一种形式,虽然不符合二维逻辑这种数据模型结构,但是包含相关标记,用来分割语义元素以及对记录和字段进行分层。常见的半结构化数据有XML和JSON

关系型数据库

关系型数据库是指采用了关系模型来组织数据的数据库。简单来说,关系模式就是二维表格模型。常见有Mysql、SQL Server、Oracle、PostgreSQL

优点:
数据一致性
支持ACID特性,可以维护数据之间的一致性,这是关系型数据库最大的优点

数据稳定
数据持久化到磁盘,没有丢失数据风险,支持海量数据存储

易理解
因为行 + 列的二维表逻辑是非常贴近逻辑世界的一个概念,关系模型相对网状、层次等其他模型更加容易被理解

操作方便
通用的SQL语言使得操作关系型数据库非常方便,支持join等复杂查询,Sql + 二维关系是关系型数据库最无可比拟的优点,这种易用性非常贴近开发者

缺点:

  • 读写开销大:
    关系型数据库最大的特点就是支持事务,维护数据的一致性,相应的代价就是其读写性能比差,在互联网早期数据量不大、数据结构简单的情况下,尚可应付。但随着互联网的发展,关系型数据库越来越难以满足高并发、大数据、非结构化的数据(视频图片)场景

  • 分布式事务比较难保证

  • 表结构扩展不方便
    由于数据库存储的是结构化数据,因此表结构schema是固定的,扩展不方便,如果需要修改表结构,需要执行DDL语句修改,修改期间会导致锁表,部分服务不可用

  • 全文搜索功能弱
    例如like “%中国真伟大%”,只能搜索到"2019年中国真伟大,爱祖国",无法搜索到"中国真是太伟大了"这样的文本,即不具备分词能力,且like查询在"%中国真伟大"这样的搜索条件下,无法命中索引,将会导致查询效率大大降低

非关系型数据库

NoSQL是什么?
基于以上关系型数据库的种种缺点,NoSQL诞生了。
NoSQL= Not Only SQL = 非关系型数据库
特点是去掉关系数据库的关系型特性,就是表与表之间没有直接关系,创建的话也不用遵循三大范式,
并且是以键值对存储,所以不用局限于固定的结构,可以减少一些时间和空间的开销。
并且NoSQL 的数据主要存储在内存中(部分可以持久化到磁盘),所以十分适合处理超大量的数据和高并发。

注意:NoSQL是对关系型数据库的一种补充,这意味着NoSql与关系型数据库并不是对立关系,二者各有优劣,取长补短,在合适的场景下选择合适的存储引擎才是正确的做法。

NoSQL与关系型数据库对比

1、存储格式

关系型数据库:高度组织化结构化,表、行、列

NoSQL:非结构化的 文档、键值对、图结构

2、事务

关系型数据库:支持事务,满足ACID

NoSQL:不支持事务强一致性,分布式场景下满足CAP&BASE

4、查询方式

关系型数据库:SQL结构化查询

NoSQL:非结构化查询

5、存储规范

关系型数据库:规范性,避免重复

NoSQL:允许冗余

6、性能

关系型数据库:为了保证事务,读写性能差

NoSQL:不需要满足强一致性,读写性能高

8、存储方式

关系型数据库:数据主要存储在磁盘中

NoSQL:数据主要存储在内存中(部分可以持久化到磁盘)

9、建表原则

关系型数据库:建立在关系模型基础上的数据库,依靠表、字段等关系模型,以列或字段构建关联

NoSQL:数据模型比较简单,用Key-Value的形式来存储数据,不需要高度的数据一致性

10、成本

关系型数据库:成本高

NoSQL:简单易部署,开源,成本低

KV型NoSql(代表:Redis)

KV型NoSql顾名思义就是以键值对形式存储的非关系型数据库,Redis是KV型NoSql中应用最广泛的

优点:
数据基于内存,读写效率高,查询时间复杂度O(1),TPS可达到10万的级别,性能非常强劲。

缺点:
内存是有限的,无法支持海量数据存储,且有丢失数据的风险

综上所述:KV型NoSql最合适的场景就是缓存

搜索型NoSql(代表:ElasticSearch)

传统关系型数据库主要通过索引来达到快速查询的目的,但是在全文搜索的场景下,索引是无能为力的,like查询一来无法满足所有模糊匹配需求,二来使用限制太大且使用不当容易造成慢查询,搜索型NoSql的诞生正是为了解决关系型数据库全文搜索能力较弱的问题,ES是搜索型NoSql的代表产品。

全文搜索的原理是倒排索引
什么是倒排索引?
先看下什么是正排索引,传统的正排索引是文档-->关键字的映射,例如"Tom is my friend"这句话,会将其切分为"Tom"、“is”、“my”、"friend"四个单词,在搜索的时候对文档进行扫描,符合条件的查出来。

倒排索引则完全相反,它是关键字-->文档的映射,举例理解:
现在这里有四个短句:

"Tom is Tom"
"Tom is my friend"
"Thank you, Betty"
"Tom is Betty's husband"

关键字-->文档的映射表格如下:
在这里插入图片描述
搜索引擎会根据一定的切分规则将这句话切成N个关键字,并以关键字的维度维护关键字在每个文本中的出现次数。这样下次搜索"Tom"的时候,由于Tom这个词语在"Tom is Tom"、“Tom is my friend”、"Tom is Betty’s husband"三句话中都有出现,因此这三条记录都会被检索出来,且由于"Tom is Tom"这句话中"Tom"出现了2次,因此这条记录对"Tom"这个单词的匹配度最高,最先展示。这就是搜索引擎倒排索引的基本原理

搜索型NoSql以ElasticSearch为例,它的优点为:

  • 支持分词场景、全文搜索,这是区别于关系型数据库最大特点
  • 支持条件查询,支持聚合操作,类似关系型数据库的Group By,但是功能更加强大,适合做数据分析
  • 数据写文件无丢失风险,在集群环境下可以方便横向扩展,可承载PB级别的数据
  • 高可用,自动发现新的或者失败的节点,重组和重新平衡数据,确保数据是安全和可访问的

因此,搜索型NoSql最适用的场景就是有条件搜索的场景,作为关系型数据库的一种替代方案。

列式NoSql(代表:HBase)

列式NoSql,大数据时代最具代表性的技术之一了,以HBase为代表。

列式NoSql是基于列式存储的,那么什么是列式存储呢?
列式NoSql和关系型数据库一样都有主键的概念,区别在于关系型数据库是按照行组织的数据,看下表,每行有name、phone、address三个字段,这是行式存储的方式,且可以观察id = 2的这条数据,即使phone字段没有,它也是占空间的。
在这里插入图片描述
而列式存储完全是另一种方式,它是按每一列进行组织的数据:
在这里插入图片描述
这么做有什么好处呢?大致有以下几点:

  • 查询时只有指定的列会被读取,不会读取所有列
  • 存储上节约空间,Null值不会被存储,一列中有时候会有很多重复数据(尤其是枚举数据,性别、状态等),这类数据可压缩。
  • 列数据被组织到一起,一次磁盘IO可以将一列数据一次性读取到内存中

文档型NoSql(代表:MongoDB)

文档型NoSql指的是将半结构化数据存储为文档的一种NoSql,文档型NoSql通常以JSON或者XML格式存储数据
因此文档型NoSql是没有Schema的,由于没有Schema的特性,我们可以随意地存储与读取数据,因此文档型NoSql的出现是解决关系型数据库表结构扩展不方便的问题的。

MongoDB从存储上来看:
在这里插入图片描述
与关系型数据库对比:
在这里插入图片描述
因此,对于MongDB,我们只要理解成一个Free-Schema的关系型数据库就完事了。

总结

1、何时选用关系型数据库,何时选用非关系型数据库?
——对数据一致性要求高的、结构化的、核心的数据(用户表、订单表等),适合关系型数据库,其他的适合非关系型

2、非关系型数据库总结
在这里插入图片描述

原文

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值