文章目录
结构化数据、非结构化数据与半结构化数据
结构化数据:
由二维表结构来逻辑表达和实现的数据,严格遵循数据格式与长度规范,也称作为行数据,特点为:数据以行为单位,一行数据表示一个实体的信息,每一行数据的属性是相同的。
非结构化数据:
指的是数据结构不规则或不完整,没有任何预定义的数据模型,不方便用二维逻辑表来表现的数据,例如图片、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、非关系型数据库总结