结构化查询语言/数据库管理系统 (DBMS)
外观
< 结构化查询语言
计算机应用的最初目标之一是将大量数据存储在海量存储设备上,并在以后的某个时间点检索它们。随着时间的推移,用户需求不断增加,不仅包括顺序访问,还包括对数据记录的随机访问,并行(写入)进程的并发访问,硬件和软件故障后的恢复,高性能,可扩展性等等。在 1970 年代和 1980 年代,科学和计算机行业开发了技术来满足这些需求。
高效数据存储的基本要素——也是所有数据库管理系统 (DBMS) 的核心——是对存储在中央内存和海量存储设备(如 B 树、索引顺序访问方法 (ISAM) 以及其他索引技术)中的数据的快速读写访问算法的实现,以及对脏块和非脏块的缓冲。这些算法并非 DBMS 独有。它们也适用于文件系统、某些编程语言、操作系统、应用程序服务器等等。
除了采用这些例程之外,DBMS 还保证符合 ACID 范式。这种符合意味着在多用户环境中,一次事务中对数据的任何更改都将是
- 原子性:所有更改全部发生,或者都不发生。
- 一致性:更改将数据库从一个有效状态转换为另一个有效状态。
- 隔离性:同时工作于同一数据的不同用户的交易不会互相影响。
- 持久性:即使系统随后崩溃,数据库仍将保留已提交的更改。
可以区分以下几代 DBMS 设计和实现
- 层次式 DBMS:数据结构在层次化的父子模型中设计,其中每个子节点只有一个父节点(根结构除外,它没有父节点)。结果是数据被建模并存储为树。子行在物理上直接存储在拥有它们的父行之后。因此,无需在子行中存储父节点的 ID 或类似信息(XML 实现类似的方法)。如果应用程序以完全相同的层次化方式处理数据,则它速度快且效率高。但如果需要以偏离此顺序的顺序处理数据,则访问效率较低。此外,层次式 DBMS 不提供 n:m 关系的建模。另一个缺点是无法直接导航到存储在较低级别的數據。您必须首先遍历给定的层次结构才能到达该数据。
- 最著名的层次式 DBMS 是 IBM 的 IMS。
- 网络型 DBMS:网络模型将数据结构设计为一个复杂的网络,其中从一个或多个父节点到一个或多个子节点都有链接。甚至循环也是可能的。不需要单个根节点。通常,术语“父节点”和“子节点”会失去它们的层次化意义,可以称为“链接源”和“链接目标”。由于这些链接在数据库中实现为物理链接,因此遵循这些链接的应用程序将表现出良好的性能。
- 关系型 DBMS:关系模型 将数据结构设计为具有属性(列)的关系(表),以及这些关系之间的关系。该模型中的定义以纯声明式方式表达,不预先确定任何实现问题,如从一个关系到另一个关系的链接或数据库中行的特定顺序。关系完全基于内容。在运行时,所有链接和连接都是通过评估实际数据值来完成的,例如:
... WHERE employee.department_id = department.id ...
。结果是——除了显式的外键——没有父/子或所有者/成员的意义。该模型中的关系没有方向。
- 关系模型和 SQL 基于 关系代数 的数学理论。
- 在 1980 年代和 1990 年代,基于关系设计范式的专有和开源 DBMS 成为市场领导者。
- 面向对象 DBMS:如今,大多数应用程序都是用面向对象编程语言 (OOP) 编写的。在这种情况下,如果底层 DBMS 属于关系型 DBMS 类,则会出现所谓的 对象关系阻抗不匹配。也就是说,与应用程序语言相比,纯关系型 DBMS (prDBMS) 不支持 OOP 的核心概念
- 类型系统:OOP 不仅知道基本数据类型。作为其语言的核心概念,它们提供了定义具有复杂内部结构的类的功能。类构建在基本类型、系统类、对其他类或同一类的引用之上。prDBMS 只知道预定义的类型。次要的 prDBMS 坚持第一范式,这意味着属性必须是标量的。在 OOP 中,它们可以是集合、列表或所需类型的数组。
- 继承:OOP 的类可以从其超类继承属性和方法。prDBMS 不知道此概念。
- 多态性:运行时系统可以通过后期绑定来决定将在具有相同名称和参数类型的多个方法组中调用哪个方法。prDBMS 不知道此概念。
- 封装:数据和对数据的访问方法存储在同一个类中。无法直接访问数据——唯一的方法是使用该类的访问方法。prDBMS 不知道此概念。
- 面向对象 DBMS 被设计用来弥合 prDBMS 和 OOP 之间的差距。在鼎盛时期,它们在 1990 年代中期和后期占据了较弱的市场地位。之后,它们的一些概念被纳入 SQL 标准以及 rDBMS 实现中。
- NoSQL:NoSQL 代表新兴的 DBMS 组,它们在核心概念上与其他 DBMS 不同
- 它们不一定支持 ACID 范式的所有方面。
- 数据不必按照任何模式进行结构化。
- 它们的目的是支持容错、分布式数据和海量数据,参见:CAP 定理。
- 实现方式在存储技术方面存在很大差异:您可以看到 键值存储、面向文档的数据库、面向图的数据库 等等。
- 它们不提供 SQL 接口。
- 一些产品:MongoDB,Firebase 实时数据库 (Google),Cloud Firestore (Google)
- NewSQL:这种类型的 DBMS 试图提供与 NoSQL 系统相同的可扩展性能,同时保持 ACID 范式、关系模型和 SQL 接口。它们试图通过避免重量级恢复或并发控制来实现可扩展性。