深入理解数据库系统(一):数据库系统的基本概念

本文将带你进入数据库系统的世界,带你了解数据库系统的核心概念,一览数据库系统的全貌。通过本文你将了解数据库系统是什么,它有哪些功能,它的组成结构,它是如何实现的,以及其它和数据库相关的知识。

介绍数据库系统

数据库系统是什么

数据库管理系统(Database-Management System,DBMS)是一组相互关联的数据的集合和一组用于访问这些数据的程序。数据库管理系统也可以简称为数据库系统。这些被管理的数据的集合称为数据库。数据库系统的主要目的是为了提供一种既方便又高效地存储和检索数据库信息的方法。

数据库系统是为了管理大量信息而设计的。管理数据的工作主要涉及:定义信息的结构;提供一个操作信息的机制;以及保证信息的安全,如防止未授权访问。

数据库系统的应用

数据库的使用是十分广泛的。常见的应用场景如:企业日常信息,银行和金融,大学,航空公司,和通信等。这些企业和机构需要利用数据库来存储和检索大量的数据信息。数据库已成为当今每个企业必不可少的组成部分。

20世纪90年代,网络的快速发展,大量的在线服务和应用被人们广泛的使用,这些应用的数据几乎都是存在数据库系统中。虽然应用接口隐藏了访问数据库的细节,大部分人在使用网络应用时没有意识到自己在操作数据库,实际上,访问数据库已成为每个人生活中不可缺少的一部分。

为什么需要数据库系统

在数据库系统出现之前,人们使用文件处理系统(File-Processing System)来存储和检索信息。文件处理系统简单地用一个文件和一个程序来管理一个实体的数据,它不适应数据结构的灵活改变和处理数据之间的关联关系。文件处理系统主要的缺点如下:

  • 数据冗余(Data Redundancy)和不一致性(Inconsistency)。一个数据项出现在多个文件中,因为不同的文件由不同的程序处理的,所以出现数据冗余和不同文件的数据不一致。
  • 访问数据很困难。程序不能实现复杂的信息检索功能。
  • 数据隔离(Data Isolation)问题。数据分散在不同的文件,可能不同的格式。
  • 完整性(Integrity)问题。很难实现数据的完整性约束条件。如账户余额不能少于零。
  • 原子性(Atomicity)问题。很难实现原子操作,很难恢复和保证数据一致性。
  • 并发访问异常。没有并发控制,导致并发访问数据异常。
  • 安全问题。不能实现安全访问约束。

文件处理系统存在以上大量的问题,它不能满足企业对大量数据高效快速处理的需求,人们迫切需要一个更高效、便捷、安全的数据管理系统。所以需要开发一个数据库管理系统来解决这些问题。

数据的表现形式

数据库系统给用户提供了数据的抽象视图,它隐藏了数据是如何存储和如何维护的细节。

数据抽象

数据库系统需要高效的检索数据,这往往需要设计一个复杂的数据结构去表示数据。为了简化用户与数据库系统的交互,通常将数据抽象成不同的层级,如下所示:

  • 物理层(Physical Level)。物理层是最低的抽象层描述了数据的实际存储方式,以及详细地描述了复杂的底层数据结构。
  • 逻辑层(Logical Level)。逻辑层描述了哪些数据存储在数据库中,数据之间存在什么关系。
  • 视图层(View Level)。简化用户与系统的数据交互,仅提供一部分重要的信息给用户,隐藏一些次要的信息。

物理层,它通过编译器向数据库程序员隐藏了底层存储的细节。逻辑层,它通过编程语言向程序员隐藏了数据存储的细节。视图层,它通过应用程序向用户隐藏了数据类型的细节。

不同的用户在不同的抽象层与数据库进行交互,使得每一个用户都可以方便和高效的管理数据。

实例和模式

实例(Instances)是某一个时刻存储在数据库中的信息的集合。

模式(Schema)是全部的数据库的设计。

数据模型

数据模型(Data Models)是数据库结构和基础。它是一个用于描述数据、数据关系、数据语义和一致性约束的概念性工具的集合。数据模型提供了一种方式去描述数据库在物理层、逻辑层、视图层的设计。

常见的数据模型:

  • 关系型模型(Relational Model)。使用一组表(Table)来表示数据和数据之间的关系。每个表有多个列(Columns)每个列有唯一的名称。表也称为关系(Relation)。
  • 实体关系模型(Entity-Relationship Model)
  • 基于对象的数据模型(Object-Based Data Model)
  • 半结构化的数据模型(Semistructured Data Model)

以上数据模型中,关系型模型应用最为广泛,大部分数据库系统是采用关系型模型实现的。

数据库语言

数据库系统提供了数据定义语言去指定数据库的模式(Schema),以及数据操纵语言去表示数据库查询和更新操作。数据定义语言和数据操纵语言不是两种单独的语言,它们都是数据库语言的组成部分。被广泛使用的数据库语言,如 SQL(Structured Query Language)语言。

数据操纵语言

数据操纵语言(Data-Manipulation Language, DML)能够访问和操作数据。基本的操作类型为:查询,插入,删除和修改。

数据操纵语言可以分为两种类型:程序式的(Procedural),声明式的(Declarative)。声明式的更简单,不需要指定如何获取数据。

数据定义语言

数据定义语言(Data-Definition Language, DDL)指定了数据库的模式,也指定了数据的属性。

数据存储在数据库中必须要满足某些一致性约束(Consistency Constraints)。如,账户余额不能少于0。数据定义语言(DDL)可以指定数据的完整性约束(Integrity Constraints),完整性约束是一致性约束的一部分,它防止不符合规范的数据进入数据库。常见的完整性约束如下:

  • 域约束(Domain Constraints)。约束数据的取值范围和精度等。
  • 参考约束(Referential Constraints)。关系 A 的一个属性参考关系 B 的属性,参考的属性必须出现在被参考的关系中。
  • 断言(Assertions)。数据需要满足断言的约束条件。

数据定义语言的输出结果保存在数据库系统的数据字典(Data Dictionary)中,它包含了数据库的元数据(Metadata)即描述数据的数据。

关系型数据库

关系型数据库(Relational Database)是基于关系模型(Relational Model)的和使用一系列的表(Table)来表示数据和数据之间的关系。

一张(Table)包含多个列,每个列有唯一的名称。一个表的结构示例,如下图所示。

数据库的表是由一些类型固定的记录(Record)构成的,一行数据称为一个记录。每个记录有固定数量的字段(Field)或属性(Attribute)。表的每一列与记录的每一个字段是相对应的。

表的操作

我们可以使用 SQL 语言来对数据库进行操作。如创建一张表:

create table department
(dept_name char(20),
building char(15),
budget numeric(12,2));

查询数据

select department.dept_name
from department
where department.budget > 95000;

应用程序访问数据库

SQL 语言不是图灵完备的,一些计算不能通过 SQL 语言完成,但是操作数据库必须使用数据库语言如 SQL 语言。由于应用程序不能通过 SQL 语言来实现,一般使用如 C, C++ 或者 Java 来实现,应用程序访问数据库一般是通过嵌入 SQL 语句来与数据库进行交互的。

应用程序访问数据库的两种方式:

  • 应用程序接口。通过它发送 DML 和 DDL SQL 语句给数据库,和取回执行结果。
  • 嵌入 DML 调用。

数据库设计

数据库设计主要任务是数据库模式(Schema)的设计。

设计过程

  • 需求分析。与用户和领域专家进行交流,设计如何让数据库的结构满足用户的数据需求。收集需求,用文字的形式描述数据结构,最后得出一个用户需求规格说明书。

  • 概念设计(Conceptual Design)。选择一个数据模型,将用户需求转换为数据库概念模式。这个阶段主要是专注于描述数据和数据之间的关系。用专业的概念的数据模型去描述数据结构,主要使用 entity-relationship model 和 normalization 方式去设计。

  • 逻辑设计(Logical Design)。将抽象的数据模型转换为数据库的实现。将概念模型转换为数据库系统使用的模型,如将 entity-relationship model 转换为 relational model。

  • 物理设计(Physical Design)。设计物理存储的细节。包括文件组织的形式和内部的存储结构等。

实体关系模型

Entity-Relationship (E-R) 数据模型使用一组对象称为实体(Entity)和对象之间的关系(Relationship)来表示数据和它们之间的关系。每个实体由一组属性组成。E-R 模型可以表示数据约束。一个实体类型的所有实例称为实体集(Entity Set),两个实体类型的所有的实例之间的关系称为关系集(Relationship Set)。

E-R 模型中一个重要的约束是映射基数(Mapping Cardinality)它表示一个实体关联另一个实体的数量。

标准化

标准化(Normalization)可以让我的数据减少不必要的冗余。它使用范式(Normal Form)来设计数据库的模式(Schema)。常见的范式有:First normal form (1NF), Second normal form (2NF), Third normal form (3NF), Boyce-Codd normal form (BCNF).

数据的存储和查询

数据库系统分为多个模块,它们分别处理不同的任务。数据库系统的功能可以大致分为存储管理器(Storage Manager)和查询处理器(Query Processor)。存储管理器负责管理数据的物理存储空间,查询处理器负责简化和优化数据的访问。

存储管理器

存储管理器是数据库的一个组件,它提供了底层存储和应用程序之间的接口。它与操作系统的文件系统进行交互。它将 SQL 语句转换为底层的文件系统的命令。存储管理器的主要职责是:存储、取出和更新数据库中的数据。

存储管理器的组件包括:

  • 授权和完整性管理器(Authorization and Integrity Manager)

  • 事务管理器(Transaction Manager)

  • 文件管理器(File Manager)

  • 缓存管理器(Buffer Manager)

存储管理器实现的物理结构

  • 数据文件(Data File)。存储数据库的数据的文件。
  • 数据字典(Data Dictionary)。存储元数据即数据库的结构或模式。
  • 索引(Index)。提供快速访问数据库数据的一种数据结构。

查询处理器

查询处理器(Query Processor)的组件包括:

  • DDL 解释器(DDL Interpreter)
  • DML 编译器(DML Compiler)
  • 查询评估引擎(Query Evaluation Engine)

事务管理

真实场景中的数据操作往往需要具备一些基本的特性。如:

  • 原子性(Atomicity)。一组数据操作组成一个逻辑的单元,这些操作必须全部完成或者全部失败。
  • 一致性(Consistency)。数据的操作必须是正确的。如 A 转账给 B,A 和 B 的总金额必须是不变的。
  • 持久性(Durability)。数据可以长久的保存。

事务(Transaction)是在数据库应用程序中执行单个逻辑功能的操作的集合。事务是一个原子性和一致性的单元。事务管理器由并发控制管理器(Concurrency-Control Manager)和恢复管理器(Recovery Manager)组成。其中,并发控制管理器负责的是:当多个事务同时修改数据库时,保证每个事务都是正确的。恢复管理器负责的是:当事务发生错误时恢复原始数据状态。

为了确保数据的一致性,程序员有责任去定义合适的事务。确保数据的原子性和持久性则是数据库系统本身的职责。

数据库的架构

数据库系统由多个组件构成,它的系统结构如下图所示:

数据库的体系结构可以是中心化的 client-server 结构,也可以是平行的、分布式的结构。

数据库应用程序通常划分为两层或者三层结构。如下图所示:

其它

数据挖掘和信息检索

数据挖掘(Data Mining)是指半自动分析大型数据库,从中找到有用的模式的过程。数据挖掘不同于机器学习,机器学习是处理大量的磁盘中的数据文件,而数据挖掘指的是处理数据库中的数据。由于很多查询是十分复杂的,很难使用 SQL 进行查询,所以需要使用数据挖掘技术。数据挖掘可以从数据中分析出有价值的规律,它可以帮助企业执行更好的决策。

数据仓库(Data Warehouse)可以在一个站点中一统一的模式收集不同来源的数据。提供为用户提供了一个统一的数据接口。

信息检索(Information Retrieval)是指查询无结构的文本数据。

其它特性(非关系型)数据库

在某些数据库系统的应用领域,关系型数据模型是受限制的。我们需要其它的数据模型来处理这些应用领域。常见的非关系型模型,如

  • 对象基于的数据模型(Object-Based Data Model)。它可以便捷的实现面向对象编程的数据存储。

  • 半结构化的数据模型(Semistructured Data Model)。它的特点是相同类型的单个数据项可能具有不同的属性集。

  • 键值数据模型(Key-value Data Model)。它是使用 map 或字典实现的。每一个 key 关联一个集合。键值数据模型没有查询语言,它使用简单的 get, put, 和 delete 命令去操作数据。它具有快速存取,可扩展性和可靠性等特点。

数据库的用户和管理员

与数据库系统进行交互的人群可以以分为:数据库用户和数据库管理员。

不同类型的数据库用户的不同交互方式为:

  • 普通的用户。通过应用程序与数据库系统进行功能。
  • 应用开发人员。通过编程语言与数据库系统交互,开发应用程序,提供用户接口。
  • 专业人员。直接使用数据库查询语言操作数据库系统。

数据库管理员的作用:

  • 定义模式。通过执行 DDL 来创建数据库模式(Schema)。
  • 定义存储结构和访问方式。
  • 修改模式和物理组织。
  • 授权数据的访问。
  • 日常维护。周期性的备份数据库。确保有充足的磁盘空间。监控数据库系统的运行状态等等。

小结

  • 首先认识了数据库系统,知道了它是什么和为什么,以及了解数据的表现形式、数据库语言等基本的数据库系统相关的概念。

  • 然后介绍了具体类型的数据库,了解了关系型数据库。以及如何设计数据库。

  • 接着介绍了数据库系统的内部结构,了解了存储,查询和事务等核心的数据库系统的组件。

  • 最后讲了一些和数据库系统相关的其它概念。

References

[1] Database System Concept (6th) by Avi Silberschatz, Henry F. Korth, and S. Sudarshan