关系型数据和⽂档型数据库有什么区别?
⽬录
关系数据库
关系数据库(Relational Database)是建⽴在关系模型基础上的数据库,借助于⼏何代数等数学概念和⽅法来处理数据库中的数据。所谓关系模型是⼀对⼀、⼀对多或者多对多等关系,常见的关系型数据库有 Oracle、SQL Server、DB2、MySQL 等。
⽽⽂档型数据库是⼀种⾮关系型数据库,⾮关系型数据库(Not Only SQL,NoSQL)正好与关系型数据库相反,它不是建⽴在“关系模型”上的数据库。⽂档型数据库的典型代表是 MongoDB。
ACID特性
关系型数据库属于早期的传统型数据库,它有着标准化的数据模型,以及事务和持久化的⽀持、例如,关系型数据库都会⽀持的 ACID 特性,也就是原⼦性(Atomicity)、⼀致性(Consistency)、隔离性(Isolation)和持久性(Durability),具体含义如下。
原⼦性(Atomicity):是指⼀个事务中的所有操作,要么全部完成、要么全部不完成,不会存在中间的
状态。也就是说事务在正常的情况下会执⾏完成;异常的情况下,⽐如在执⾏的过程中如果出现问题,会回滚成最初的状态,⽽⾮中间状态。
⼀致性(Consistency):是指事务从开始执⾏到结束执⾏之间的中间状态不会被其他事务看到。
隔离性(Isolation):是指数据库允许多个事务同时对数据进⾏读写或修改的能⼒,并且整个过程对各个事务来说是相互隔离的。
持久性(Durability):是指每次事务提交之后都不会丢失。
关系数据库的三范式
关系型数据库⼀般遵循三范式设计思想,具体内容如下。
第⼀范式(The First Normal Form,1NF):要求对属性的原⼦性,也就是说要求数据库中的字段需要具备原⼦性,不能再被拆分。⽐如,⽤户表中有字段:⽤户 ID、⽤户名、电话;⽽其中电话⼜可以分为:家庭电话和移动电话等。因此,此表不符合第⼀范式,如下图所⽰:
第⼆范式(The Second Normal Form,2NF):例如订单详情表有这些字段:订单 ID、产品 ID、产品名称、产品单价、折扣。其中,订单 ID 和产品 ID 为联合主键,但这个表中的产品名称和产品单价两个字段只依赖产品 ID,和订单 ID 就没有任何关系了,因此这个表也不符合第⼆范式。
我们可以把原来的订单表拆分为订单表和产品表,其中订单表包含:订单 ID、产品 ID、折扣等字段;⽽产品表包含:产品 ID、产品名称、产品单价等字段。这样就消除了产品名称和产品单价多次重复出现的情况了,从⽽避免了冗余数据的产⽣。
第三范式(The Third Normal Form,3NF):想要满⾜第三范式必须先满⾜第⼆范式,第三范式要求所有的⾮主键字段必须直接依赖主键,且不存在传递依赖的情况。
例如,有⼀个学⽣表中包含了:学⽣ ID、姓名、所在学院 ID、学院电话、学院地址等字段。这个表的所有字段(除去主键字段)都完全依赖唯⼀的主键字段(学⽣ ID),所以符合第⼆范式。但它存在⼀个问题,学院电话、学院地址依赖⾮主键字段学院 ID,⽽不是直接依赖于主键,它是通过传递才依赖于主键,所以不符合第三范式。
我们可以把学⽣表分为两张表,⼀张是学⽣表包含了:学⽣ ID、姓名、所在学院 ID 等字段;另⼀张为学院表包含了:学院 ID、学院电话、学院地址等字段,这样就满⾜第三范式的要求了。
可以看出,使⽤三范式可以避免数据的冗余,⽽且在更新表操作时,只需要更新单张表就可以了。
但随着互联⽹应⽤的快速发展,我们需要应对⽇益复杂且快速迭代的数据库,以应对互联⽹快速发展的趋势,于是诞⽣了以 MongoDB 为代表的⽂档型数据库。它提供了更⾼效的读/写性能以及可⾃动容灾的数据库集,还有灵活的数据库结构,从⽽给系统的数据库存储带来了更多可能性。
当然 MongoDB 的诞⽣并不是为了替代关系型数据库,⽽是为系统的快速开发提供⼀种可能性,它和关系型数据库是⼀种互补的关系,可供开发者在不同的业务场景下选择相对应的数据库类型。
⾮关系型数据库 VS ⽂档型数据库
⾮关系型数据和⽂档型数据库属于包含关系,⾮关系型数据包含了⽂档型数据库,⽂档型数据库属于⾮关系型数据。
⾮关系型数据通常包含 3 种数据库类型:⽂档型数据库、键值型数据库和全⽂搜索型数据库,下⾯分别来看每种类型的具体⽤途。
1. ⽂档型数据库
⽂档型数据库以 MongoDB 和 Apache CouchDB 为代表,⽂档型数据库通常以 JSON 或者 XML 为格式进⾏数据存储。
以 MongoDB 为例,它是由 C++ 编写的⼀种⾯向⽂档的数据库管理系统,在 2007 年 10 ⽉ 由 10gen 团队所开发,并在 2009 年 2⽉⾸度推出。MongoDB 是以⼆进制 JSON 格式存储数据的,MongoDB 对 JSON 做了⼀些优化,它⽀持了更多的数据类型,这种⼆进制存储的 JSON 我们也可以称之为 BSON(Binary JSON)。
BSON 具备三个特点:轻量、可遍历以及⾼效,它的缺点是空间利⽤率不是很理想。MongoDB 使⽤ BSON 进⾏存储的另⼀个重要原因是BSON 具备可遍历性。
{"_id":ObjectId(“57ce2d4cce8685a6fd9df3a3"),"name":"⽼王","email":['java@qq','java@163']}
其中,“_id”为 MongoDB 默认的主键字段,它会为我们⽣成⼀起全局唯⼀的 id 值,并且这个值在做数据分⽚时⾮常有⽤。
⽂档型数据库的使⽤场景如下。
敏捷开发,因为 MongoDB 拥有⽐关系型数据库更快的开发速度,因此很多敏捷开发组织,包括纽约时报等都采⽤了 MongoDB 数据库。使⽤它可以有效地避免在增加和修改数据库带来的沟通成本,以及维护和创建数据库模型成本,使⽤ MongoDB 只需要在程序层⾯严格把关就⾏,程序提交的数据结构可以直接更新到数据库中,并不需要繁杂的设计数据库模型再⽣成修改语句等过程。
⽇志系统,使⽤ MongoDB 数据库⾮常适合存储⽇志,⽇志对应到数据库中就是很多个⽂件,⽽ MongoDB 更擅长存储和查询⽂档,
它提供了更简单的存储和更⽅便的查询功能。
社交系统,使⽤ MongoDB 可以很⽅便的存储⽤户的位置信息,可以⽅便的实现查询附近的⼈以及附近的地点等功能。
2. 键值型数据库
键值数据库也就是 Key-Value 数据库,它的典型代表数据库是 Redis 和 Memcached,⽽它们通常被当做⾮持久化的内存型数据库缓存来使⽤。当然 Redis 数据库是具备可持久化得能⼒的,但是开启持久化会降低系统的运⾏效率,因此在使⽤时需要根据实际的情况,选择开启或者关闭持久化的功能。
键值型数据库以极⾼的性能著称,且除了 Key-Value 字符串类型之外,还包含⼀些其他的数据类型。以 Redis 为例,它提供了字符串类型(String)、列表类型(List)、哈希表类型(Hash)、集合类型(Set)、有序集合类型(ZSet)等五种最常⽤的基础数据类型,还有管道类型(Pipeline)、地理位置类型(GEO)、基数统计类型(HyperLogLog)和流类型(Stream),并且还提供了消息队列的功能。
此数据库的优点是性能⽐较⾼,缺点是对事务的⽀持不是很好。
3. 全⽂搜索型数据库
传统的关系型数据库主要是依赖索引来实现快速查询功能的,⽽在全⽂搜索的业务下,索引很难满⾜查询的需求。因为全⽂搜索需要⽀持模糊匹配的,当数据量⽐较⼤的情况下,传递的关系型数据库的查询效率是⾮常低的;另⼀个原因是全⽂搜索需要⽀持多条件随意组合排序,如果要通过索引来实现的话,则需要创建⼤量的索引,⽽传统型数据库也很难实现,因此需要专门全⽂搜索引擎和相关的数据库才能实现此功能。
全⽂搜索型数据库以 ElasticSearch 和 Solr 为代表,它们的出现解决了关系型数据库全⽂搜索功能较弱的问题.
MongoDB 事务
MongoDB 在 4.0 之前是不⽀持事务的,不⽀持的原因也很简单,因为⽂档型数据库和传统的关系型数据库不⼀样,不需要满⾜三范式。⽂档型数据库之所以性能⽐较⾼的另⼀个主要原因,就是使⽤⽂档型数据库不⽤进⾏多表关联性查询,因为⽂档型数据库会把相关的信息存放到⼀张表中。因此,⽆需关联多表查询的 MongoDB,在这种情况下的查询性能是⽐较⾼的。
把所有相关的数据都放⼊⼀个表中,这也是 MongoDB 之前很长⼀段时间内不⽀持事务的原因,它可以保证单表操作的原⼦性,⼀条记录要么成功插⼊,要么插⼊失败,不会存在插⼊了⼀半的数据。因此,在这种设计思路下,MongoDB 官⽅认为“事务功能”的实现没有那么紧迫。
但在 MongoDB 4.0 之中正式添加了事务的功能,并且在 MongoDB 4.2 中实现了分布式事务的功能,⾄此 MongoDB 开启了⽀持事务之旅。
>redis支持的五种数据类型
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论