关系型数据和文档型数据库有什么区别
关系数据库
关系数据库(Relational Database)是建立在关系模型基础上的数据库,借助于集合数学等概念来处理数据库中的数据,
所谓关系模型是一对一、一对多或者多对多等关系,常见的关系型数据库有 Oracle、SQL Server、DB2、MySQL 等。
文档型数据库
而文档型数据库是一种非关系型数据库,非关系型数据库(Not Only SQL,NoSQL)正好与关系型数据库相反,它不是建立在“关系模型”上的数据库。文档型数据库的典型代表是 MongoDB。
典型回答
ACID特性
关系型数据库属于早期的传统型数据库,它有着标准化的数据模型,以及事务和持久化的支持, 关系型数据库都会支持ACID特性 原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)
-
原子性
是指一个事务中的所有操作,要么全部完成、要么全部不完成,不会存在中间的状态。也就是说事务在正常的情况下会执行完成;异常的情况下,比如在执行的过程中如果出现问题,会回滚成最初的状态,而非中间状态。
-
一致性
是指事务从开始到结束执行之间的中间状态不会被其他事务看到
-
隔离性
是指数据库允许多个事务同时对数据进行读写或修改的能力,并且整个过程对各个事务来说是相互隔离的。
-
持久性
是指每次事务提交之后都不会丢失。
三范式
关系型数据库一般会遵循三范式设计思想 具体如下
- 一范式(确保每列保持原子性)
第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。
- 第二范式(确保表中的每列都和主键相关)
第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。
- 第三范式(确保每列都和主键列直接相关,而不是间接相关)
第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。
非关系型数据库和文档型数据库有什么区别?
非关系型数据库和文档型数据库属于包含关系,非关系型数据库包含了文档型数据库,文档型数据库属于非关系型数据。
非关系型数据通常包含3钟数据库: 文档型数据库、键值型数据库和全文搜索型数据库,下面分别来看每种类型的具体用途。
文档型数据库
文档型数据库以 MongoDB 和 Apache CouchDB 为代表,文档型数据库通常以 JSON 或者 XML 为格式进行数据存储。
文档型数据库的使用场景如下。
- 敏捷开发,因为 MongoDB 拥有比关系型数据库更快的开发速度,因此很多敏捷开发组织,包括纽约时报等都采用了 MongoDB 数据库。使用它可以有效地避免在增加和修改数据库带来的沟通成本,以及维护和创建数据库模型成本,使用 MongoDB 只需要在程序层面严格把关就行,程序提交的数据结构可以直接更新到数据库中,并不需要繁杂的设计数据库模型再生成修改语句等过程。
- 日志系统,使用 MongoDB 数据库非常适合存储日志,日志对应到数据库中就是很多个文件,而 MongoDB 更擅长存储和查询文档,它提供了更简单的存储和更方便的查询功能。
- 社交系统,使用 MongoDB 可以很方便的存储用户的位置信息,可以方便的实现查询附近的人以及附近的地点等功能。
键值型数据库
键值数据库也就是 Key-Value 数据库,它的典型代表数据库是 Redis 和 Memcached,而它们通常被当做非持久化的内存型数据库缓存来使用。当然 Redis 数据库是具备可持久化得能力的,但是开启持久化会降低系统的运行效率,因此在使用时需要根据实际的情况,选择开启或者关闭持久化的功能。
键值型数据库以极高的性能著称,且除了 Key-Value 字符串类型之外,还包含一些其他的数据类型。以 Redis 为例,它提供了字符串类型(String)、列表类型(List)、哈希表类型(Hash)、集合类型(Set)、有序集合类型(ZSet)等五种最常用的基础数据类型,还有管道类型(Pipeline)、地理位置类型(GEO)、基数统计类型(HyperLogLog)和流类型(Stream),并且还提供了消息队列的功能。
全文搜索型数据库
传统的关系型数据库主要是依赖索引来实现快速查询功能的,而在全文搜索的业务下,索引很难满足查询的需求。因为全文搜索需要支持模糊匹配的,当数据量比较大的情况下,传递的关系型数据库的查询效率是非常低的;
全文搜索型数据库以 ElasticSearch 和 Solr 为代表,它们的出现解决了关系型数据库全文搜索功能较弱的问题。