转载自 freeCodeCamp ,有所修改。
原文:Relational VS Nonrelational Databases
作者: Dionysia Lemonaki
什么是数据库?
在计算机里,数据是以不同形式出现的信息片段。它可以是文本、数字、图像、音频片段或视频。
信息集合需要被存储、处理和解释。这时就需要一种可按需轻松搜索、访问、提取和检索已保存资源的方法。
该方法可以使计算机或人类分析可访问的数据、执行计算和比较、做出逻辑决策得出结论。
当然可以使用 Excel 电子表格等软件将数据存储在文件中,这样也可以完成有限的工作。
但是,如果数据量很大,使用 Excel 处理就捉襟见肘了。在数据量增大时,Excel 无法快速检索。并且 Excel 很难固定其数据结构。
数据库是一种更易于访问、更高效且更有条理的长期存储和处理信息的方式。
数据库存储数据的规范性和系统性以及其检索数据的便捷性使其成为基于 Web 的应用程序中重要的部分。
数据库几乎可以用于所有应用程序。它们可以用来存储用户信息,例如用户名、电子邮件地址、加密密码和物理地址。它们还存储用户行为。例如,在电商网站中,数据库会保存并跟踪“收藏”的商品。
一般使用数据库管理系统(或简称 DBMS)来管理数据库。
数据库管理系统是一个软件程序,充当最终用户和数据库中间的媒介。可以通过数据库管理系统创建和管理数据库。也可以执行查询来访问、修改和操作存储在数据库中的数据。只需通过一些命令就可以方便轻松地存储、检索、更新和删除数据。
谈到数据库管理系统,通常有两种类型可供选择:
- 关系型数据库(也就是 SQL 数据库)
- 非关系型数据库(也就是 NoSQL 数据库)
SQL 是什么?
SQL 是 Structured Query Language 的缩写。
你可能会听过它以两种发音方式 - “S. Q. L.”(ess-kew-ell)或“se-quel”(/ˈsēkwəl/)。
无论哪种方式,SQL 都代表数据库处理的语言。
具体来说,使用 SQL,可以编写数据库“查询”(queries)以和数据库进行通信。“查询”可以是用于执行任何 CRUD(Create、 Read、 Update、Delete)操作的命令。
SQL 是关系数据库管理系统的首选语言。
什么是关系数据库?
关系数据库(或 SQL 数据库)已经存在了一段时间。第一个关系数据库出现在 1970 年,关系数据库至今仍然很流行,一些最常见的如:
- PostgreSQL
- Microsoft SQL Server
- MySQL
- Oracle
- SQLite
关系数据库以结构化和表的方式存储数据。也就是说,它将信息存储在表中,可以将其视为数据的存储容器。例如,一家公司可以有一个 employees 表来存储其员工的数据。
关系数据库具有严格的、静态的预定义逻辑架构(schema)。可以将数据库架构视为一个组织蓝图———一组规则:哪些可以插入表、哪些不能插入表、以及如何设置数据。
在每个表中,至少有一个列(column)。这些列具有特定的数据类型,例如 INTEGER 或 VARCHAR。在 employees 表中,一些列可能是 employee_id
、name
、department
、email
和 salary
。
所有列和其数据类型构成架构。
EMPLOYEES
+-------------+------+------------+-------+--------+
| employee_id | name | department | email | salary |
+-------------+------+------------+-------+--------+
一个表也会包含行(rows) 或 记录(records)。记录是遵守预定义架构的单个数据条目。本质上,它是一个数据项。
EMPLOYEES
+-------------+------------------+------------+-----------------------+--------+
| employee_id | name | department | email | salary |
+-------------+------------------+------------+-----------------------+--------+
| 1 | John Doe | IT | johndoe@company.com | 3500 |
| 2 | Kelly Kellinson | Marketing | kelly@company.com | 1500 |
| 3 | Mike Manson | Product | mikekane@company.com | 2300 |
+-------------+------------------+------------+-----------------------+--------+
由于关系数据库支持 SQL,所以可以直接执行查询。例如,如果想 view 月薪 greater than 2000 dollars 的 employees 的 names,那么可以编写如下 SQL 查询:
SELECT name FROM employees
WHERE salary > 2000;
执行上面的查询,会获得以下输出:
+-------------+
| name |
+-------------+
| John Doe |
| Mike Manson |
+-------------+
关系数据库的特点
现在,我们已经了解关系数据库有这些特点:
- 是表格格式
- 非常有条理,并且数据以某种结构存储
- 具有严格、预定义的架构
- 使用 SQL 执行数据库查询和操作数据
此外,一个关系数据库可以有多个表,正如数据库管理系统的名称所暗示的那样,这些表可以是相互关联的。
例如,一家电商公司可能有一个 products
表、一个 users
表、一个 emails
表和一个 orders
表。
由于表和存储在其中的信息之间存在连接和关联,可以使用命令来连接表。
关系数据库有一个主键(primary key),它作为标识符,确保表中的每一项都是唯一的,从而确保表中没有重复和冗余的数据。
外键(foreign key)用于表示在表之间的关系。
不同表中的数据可以有不同的关系:
- 一对一的关系:在这种情况下,一个表中的记录仅与另一个表中的一条记录相关。电商网站中一对一关系的示例是,一个用户只能拥有一个电子邮件地址,且一个电子邮件地址只能属于一个用户。
- 一对多关系:在这种情况下,一张表中的一条记录与另一张表中的多条其他记录相关。例如,在电商网站中,一个用户可以下许多订单,但每个订单都是由一个用户下的。
- 多对多关系:在这种情况下,一个表中的一个或多个记录可以与另一个表中的一个或多个记录相关。例如,在电商网站中,一个订单可以有很多产品,而一个产品可以被购买多次。
外键一般是数据库表中的一列或多列,用于链接到另一个表中的列,通常是另一个表的主键。
这种链接建立了一种“父子”关系,其中包含外键的表是“子表”,被引用的表是“父表”。 外键确保子表中的值必须与父表中已存在的对应值匹配。
例如,orders 表中的 user_id 列可以作为外键,引用 users 表中的 user_id 列(主键),从而确保每个订单都与一个有效存在的用户关联。
关系数据库中的 ACID 属性
关系数据库提供 ACID 数据一致性模型。
ACID 是原子性(Atomicity)、一致性(Consistency)、事务隔离(Isolation)、持久性(Durability) 的首字母缩写词。
原子性意味着事务是原子的(足够小,且不可再分)并且采取 “all or nothing” 的方法。
也就是,要么整个操作成功,从头到尾完成,要么不成功,整个操作“回滚”。
所有操作都保证以成功或失败结束,不存在部分成功。
一致性是确保数据库结构从事务开始到结束保持不变。一致性确保进入数据库的任何数据都遵循已设置的规则和约束。它可以保护和维护关系数据库中数据的完整性。
事务隔离意味着,尽管在任何时候都发生了许多事务,但每个事务都被视为一个原子的、独立的单元,并且事务似乎是按顺序发生的。
例如,如果两个事务同时发生,事务隔离可确保一个事务以及那里发生的更改不会以任何方式影响另一个事务。
最后,持久性意味着事务的任何结果和更改都已提交,是永久性的,将持续存在,即使出现系统故障也是如此。
ACID 模型可确保数据库可靠且安全。
什么是非关系数据库?
非关系型数据库也称为 NoSQL 数据库。经常会看到 NoSQL 代表“Not only SQL”和“Non-SQL”。
无论从哪种角度阐述,非关系数据库都是指不使用关系数据模型的数据库。
尽管这个术语和这种类型的数据库已经存在了几十年,但 NoSQL 数据库在 1990 年代后期才开始受欢迎,当时 Internet 也变得越来越流行。
关系数据库已无法满足互联网海量且复杂的数据。
一些最流行的非关系数据库:
- MongoDB
- Redis
- Apache Cassandra
- Google Cloud Bigtable
- Amazon DynamoDB
非关系数据库不以表格式存储和组织数据。不同数据点之间没有表、行、列或关系。
相反,数据存储在集合中。数据库通常是非结构化的,并使用动态架构。
非关系数据库的类型
有四种主要类型的非关系数据库:
- 列式数据库
- 键-值数据库
- 面向文档的数据库
- 图数据库
列式数据库在概念上类似于关系数据库,但它们使用组
或列集
(也称为列族)而不是行来逻辑组织相关数据。可以通过使用与单个列关联的唯一行键来独立访问列族。列式数据库搜索特定数据的速度很快,因为无需通过不相关的信息行来查找要搜索的内容。
键-值数据库是最简单的非关系数据库类型之一。数据以键值对集合
的形式存储在字典或哈希表中。这种类型的数据库具有唯一的键。键充当指向特定值的指针并与该值相关联。分配给键的值可以是任何信息和数据类型。要检索和访问该值,请使用唯一键作为引用。
面向文档的数据库也以键值对
的方式存储数据。但是其值是一个文档,它有一个唯一的键作为它的标识符。文档可以是任何格式,例如 XML、YAML 或二进制,通常采用 JSON 格式。这种类型的数据库以半结构化的方式存储数据。没有架构或预定义的结构。正因为如此,它更灵活,可以在项目需求发生变化时重新安排和重新设计数据库结构。它还提供了类似 SQL 的查询语言或者通过 API 来对数据执行查询以及 CRUD 操作。
图数据库是最复杂的非关系数据库类型,它们可以处理大量数据。图数据库专注于数据元素之间的连接和关系,并使用图论
来存储、搜索和管理这些关系。图数据库使用 nodes 来存储数据,用 nodes 表示单个实体或数据。一个节点连接到另一个节点。为了表示实体之间的连接或关系,图数据库还用到了 edges。
非关系数据库中的 BASE 属性
非关系数据库提供 BASE 数据库一致性模型。该模型不像关系数据库的 ACID 模型那样严格。
BASE 是以下的首字母缩写词:
- Basic Availability 基本可用,该模型不关注数据的即时一致性。但是,该系统似乎在持续工作,并始终保证数据的可用性。
- Soft 软状态,由于缺乏即时一致性,系统的状态可能会随着时间而改变。软状态意味着系统不需要写一致性。
- Eventual 最终一致性,主要优先事项是数据的持续可用,而不是数据一致性。但是,最终在某个时候,可以期望数据是一致的。当系统停止接收输入时,可能会发生这种情况。
如何在 SQL 和 NoSQL 数据库之间进行选择?
在学习了 SQL 和 NoSQL 数据库的基础知识之后,可能想知道如何为项目选择适合类型的数据库。
嗯,这个问题没有明确的答案。
两种数据库都有优点和缺点,这在很大程度上取决于正在构建的应用程序的类型、将使用的数据的类型以及的未来目标。
通常在产品中都会涉及到这两种类型的数据库。
以下是它们特征的快速摘要,可帮助决定哪一个可能更适合。
何时使用 SQL 数据库?
- 需要分布在多个表中的高度结构化的数据,需要数据遵守严格的、可预测的、预定义的和已经计划好的模式。
- 数据将保持相对不变。如果不打算频繁更改数据库的结构并且不需要定期更新项目,SQL 数据库会很方便。请记住,它们提供的灵活性很小。
- 需要一致的数据。
- 数据完整性和安全性是重中之重。
- 需要复杂查询的准确结果。
SQL 数据库的一个缺点是它们是垂直扩展的。当存储变多时,需要增加当前机器上的硬件和提高计算能力。这可能代价高昂。需要增加处理能力和内存存储来处理增加的负载以提高性能。
何时使用 NoSQL 数据库?
- 在一个快速的开发环境中工作,需要经常调整需求并不断更改数据库结构。
- 正在处理大量性质不同但不需要大量结构或准确性的数据。
- 正在处理需要频繁更新的数据。NoSQL 数据库提供了一个松散、灵活和动态的模式,允许对数据进行定期更改。
- 需要快速的查询结果和系统的持续可用性。
- 不想对数据库进行任何前期规划、准备或设计,而是想立即开始构建。
NoSQL 数据库的一大优势是它们可以水平扩展。
它们的设计方式可以将更多机器添加到现有机器(例如云服务器)中。与需要额外 CPU(中央处理单元)或 RAM(随机存取存储器)资源的垂直缩放相比,这种行为更可取。
但当然,NoSQL 数据库的一个缺点是它们不能确保数据的完整性和一致性。