关系型数据库与非关系型数据库如何选型


写在前面

这个问题在面试中经常遇到,在工作中也会遇到数据库选型的问题,本文将从定义、优缺点方面介绍关系型数据库和非关系型数据库。

关系型数据库

定义

关系型数据库指的是使用关系模型(二维表格模型)来组织数据的数据库。

关系数据库具有严格的、静态的预定义逻辑架构(schema)。可以将数据库架构视为一个组织蓝图——一组规则:哪些可以插入表、哪些不能插入表、以及如何设置数据。

在每个表中,至少有一个列(column)。这些列具有特定的数据类型,例如 INTEGER 或 VARCHAR。在 employees 表中,一些列可能是 employee_id、name、department、email 和 salary。

所有列和其数据类型构成架构。

特点

  • 是表格格式
  • 非常有条理,并且数据以某种结构存储
  • 具有严格、预定义的架构
  • 使用 SQL 执行数据库查询和操作数据

此外,一个关系数据库可以有多个表,正如数据库管理系统的名称所暗示的那样,这些表可以是相互关联的。

由于表和存储在其中的信息之间存在连接和关联,可以使用命令来连接表。

关系数据库有一个主键,它作为标识符,确保表中的每一项都是唯一的,从而确保表中没有重复和冗余的数据。

外键 用于表示在表之间的关系。

不同表中的数据可以有不同的关系:

  • 一对一的关系:在这种情况下,一个表中的记录仅与另一个表中的一条记录相关。电商网站中一对一关系的示例是,一个用户只能拥有一个电子邮件地址,且一个电子邮件地址只能属于一个用户。
  • 一对多关系:在这种情况下,一张表中的一条记录与另一张表中的多条其他记录相关。例如,在电商网站中,一个用户可以下许多订单,但每个订单都是由一个用户下的。
  • 多对多关系:在这种情况下,一个表中的一个或多个记录可以与另一个表中的一个或多个记录相关。例如,在电商网站中,一个订单可以有很多产品,而一个产品可以被购买多次。

关系数据库中的 ACID 属性

关系数据库提供 ACID 数据一致性模型。

ACID 是原子性(Atomicity)、一致性(Consistency)、事务隔离(Isolation)、持久性(Durability) 的首字母缩写词。

原子性意味着事务是原子的并且采取 “all or nothing” 的方法。

也就是,要么整个操作成功,从头到尾完成,要么不成功,整个操作“回滚”。

所有操作都保证以成功或失败结束,不存在部分成功。

一致性是确保数据库结构从事务开始到结束保持不变。一致性确保进入数据库的任何数据都遵循已设置的规则和约束。它可以保护和维护关系数据库中数据的完整性。

事务隔离意味着尽管在任何时候都发生了许多事务,但每个事务都被视为一个原子的、独立的单元,并且事务似乎是按顺序发生的。

例如,如果两个事务同时发生,此属性可确保一个事务以及那里发生的更改不会以任何方式影响另一个事务。

最后,持久性意味着事务的任何结果和更改都已提交,因此是永久性的,并且将持续存在,即使出现系统故障也是如此。

ACID 模型可确保数据库可靠且安全。

常见数据库

  • PostgreSQL
  • Microsoft SQL Server
  • MySQL
  • Oracle
  • SQLite

优点

  • 采用二维表结构非常贴近正常开发逻辑(关系型数据模型相对层次型数据模型和网状型数据模型等其他模型来说更容易理解);
  • 支持通用的SQL(结构化查询语言)语句;
  • 丰富的完整性大大减少了数据冗余和数据不一致的问题。并且全部由表结构组成,文件格式一致;
  • 可以用SQL句子多个表之间做非常繁杂的查询;
  • 关系型数据库提供对事务的支持,能保证系统中事务的正确执行,同时提供事务的恢复、回滚、并发控制和死锁问题的解决。
  • 数据存储在磁盘中,安全可靠。

缺点

  • 高并发读写能力差:网站类用户的并发性访问非常高,而一台数据库的最大连接数有限,且硬盘 I/O 有限,不能满足很多人同时连接。
  • 海量数据情况下读写效率低:对大数据量的表进行读写操作时,需要等待较长的时间等待响应。
  • 可扩展性不足:不像web server和app server那样简单的添加硬件和服务节点来拓展性能和负荷工作能力。
  • 数据模型灵活度低:关系型数据库的数据模型定义严格,无法快速容纳新的数据类型(需要提前知道需要存储什么样类型的数据)。

非关系型数据库

定义

非关系数据库不以表格式存储和组织数据。不同数据点之间没有表、行、列或关系。

相反,数据存储在集合中。数据库通常是非结构化的并使用动态架构。

类型

有四种主要类型的非关系数据库:

  • 列式数据库

列式数据库在概念上类似于关系数据库,但它们使用组或列集(也称为列族)而不是行来逻辑组织相关数据。可以通过使用与单个列关联的唯一行键来独立访问列族。列式数据库搜索特定数据的速度很快,因为无需通过不相关的信息行来查找要搜索的内容。

  • 键-值数据库

键-值数据库是最简单的非关系数据库类型之一。数据以键值对集合的形式存储在字典或哈希表中。这种类型的数据库具有唯一的键。键充当指向特定值的指针并与该值相关联。分配给键的值可以是任何信息和数据类型。要检索和访问该值,请使用唯一键作为引用。

  • 面向文档的数据库

面向文档的数据库也以键值对的方式存储数据。但是其值是一个文档,它有一个唯一的键作为它的标识符。文档可以是任何格式,例如 XML、YAML 或二进制,通常采用 JSON 格式。这种类型的数据库以半结构化的方式存储数据。没有架构或预定义的结构。正因为如此,它更灵活,可以在项目需求发生变化时重新安排和重新设计数据库结构。它还提供了类似 SQL 的查询语言或者通过 API 来对数据执行查询以及 CRUD 操作。

  • 图数据库

图数据库是最复杂的非关系数据库类型,它们可以处理大量数据。图数据库专注于数据元素之间的连接和关系,并使用图论来存储、搜索和管理这些关系。图数据库使用 nodes 来存储数据,用 nodes 表示单个实体或数据。一个节点连接到另一个节点。为了表示实体之间的连接或关系,图数据库还用到了 edges。

特点

非关系数据库中的 BASE 属性

非关系数据库提供 BASE 数据库一致性模型。该模型不像关系数据库的 ACID 模型那样严格。

BASE 是以下的首字母缩写词:

  • Basic Availability 基本可用,该模型不关注数据的即时一致性。但是,该系统似乎在持续工作,并始终保证数据的可用性。
  • Soft 软状态,由于缺乏即时一致性,系统的状态可能会随着时间而改变。软状态意味着系统不需要写一致性。
  • Eventual 最终一致性,主要优先事项是数据的持续可用,而不是数据一致性。但是,最终在某个时候,可以期望数据是一致的。当系统停止接收输入时,可能会发生这种情况。

常见数据库

  • 键值数据库:Redis、Memcached、Riak
  • 列族数据库:Bigtable、HBase、Cassandra
  • 文档数据库:MongoDB、CouchDB、MarkLogic
  • 图形数据库:Neo4j、InfoGrid

优点

  • 非关系型数据库存储数据的格式可以是 key-value 形式、文档形式、图片形式等。使用灵活,应用场景广泛,而关系型数据库则只支持基础类型。
  • 速度快,效率高。 NoSQL 可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘。
  • 海量数据的维护和处理非常轻松,成本低。
  • 非关系型数据库具有扩展简单、高并发、高稳定性、成本低廉的优势。
  • 可以实现数据的分布式处理。

缺点

  • 非关系型数据库暂时不提供 SQL 支持,学习和使用成本较高。
  • 非关系数据库没有事务处理,无法保证数据的完整性和安全性。适合处理海量数据,但是不一定安全。
  • 功能没有关系型数据库完善。
  • 复杂表关联查询不容易实现。

如何在 SQL 和 NoSQL 数据库之间进行选择

两种数据库都有优点和缺点,这在很大程度上取决于正在构建的应用程序的类型、将使用的数据的类型以及的未来目标。

通常在产品中都会涉及到这两种类型的数据库。

以下是它们特征的快速摘要,可帮助决定哪一个可能更适合。

类别 关系数据库 非关系数据库
数据模型 表格式。 键值、文档或图形。
数据类型 结构化。 结构化、半结构化和非结构化。
数据完整性 高,完全符合 ACID 标准。 最终一致性模型。
性能 经过改进,向服务器添加更多资源。 经过改进,添加了更多服务器节点。
扩展 横向扩展需要额外的数据管理策略。 横向扩展很简单。

总结:关系型数据库和非关系型数据库记住五个关键词:数据模型、数据类型、完整性、性能、扩展

何时使用 SQL 数据库

  • 需要分布在多个表中的高度结构化的数据,需要数据遵守严格的、可预测的、预定义的和已经计划好的模式。
  • 数据将保持相对不变。如果不打算频繁更改数据库的结构并且不需要定期更新项目,SQL 数据库会很方便。请记住,它们提供的灵活性很小。
  • 需要一致的数据。
  • 数据完整性和安全性是重中之重。
  • 需要复杂查询的准确结果。

SQL 数据库的一个缺点是它们是垂直扩展的。当存储变多时,需要增加当前机器上的硬件和提高计算能力。这可能代价高昂。需要增加处理能力和内存存储来处理增加的负载以提高性能。

何时使用 NoSQL 数据库

  • 在一个快速的开发环境中工作,需要经常调整需求并不断更改数据库结构。
  • 正在处理大量性质不同但不需要大量结构或准确性的数据。
  • 正在处理需要频繁更新的数据。NoSQL 数据库提供了一个松散、灵活和动态的模式,允许对数据进行定期更改。
  • 需要快速的查询结果和系统的持续可用性。
  • 不想对数据库进行任何前期规划、准备或设计,而是想立即开始构建。
    NoSQL 数据库的一大优势是它们可以水平扩展。

它们的设计方式可以将更多机器添加到现有机器(例如云服务器)中。与需要额外 CPU(中央处理单元)或 RAM(随机存取存储器)资源的垂直缩放相比,这种行为更可取。

但当然,NoSQL 数据库的一个缺点是它们不能确保数据的完整性和一致性。

参考

[1]非关系型数据库(NOSQL)和关系型数据库(SQL)区别详解

[2]面对NoSQL和关系型数据库怎么选型?

[3]关系数据库和非关系数据库有什么区别?

[4]关系型数据库 VS 非关系型数据库——SQL DB 和 NoSQL DB 的区别



文章作者: Alex
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Alex !
  目录