第1章:引言(Introduction)
一、导读
1.1 本章学习目标
第1章是整本《数据库系统概念》的开篇之作,它介绍了数据库系统的基本概念、数据模型的演进、以及数据库体系结构。通过本章的学习,你将建立起数据库系统的全局视图。
本章的核心学习目标包括:
- 理解数据库系统 vs 文件系统:为什么需要数据库系统?
- 掌握数据模型的演进:从层次模型到关系模型再到对象模型
- 理解数据库体系结构:物理层、逻辑层、视图层
- 了解数据库语言:DDL、DML、DCL
- 认识数据库管理员的职责
1.2 为什么第一章如此重要
很多初学者急于跳到 SQL 语法,觉得第一章"太泛"。这种想法是错误的。正如建筑设计师需要理解整栋建筑的结构蓝图,数据库工程师也需要理解数据库系统的完整图景。没有全局观,后续学习就容易陷入"只见树木,不见森林"的困境。
Silberschatz 反复强调一个观点:数据库系统的核心价值是数据独立性。这意味着应用程序不应该依赖于数据的物理存储方式。这种抽象是通过数据库体系结构实现的。
1.3 核心问题引导
在阅读本章时,请带着以下问题思考:
为什么不能直接用文件系统存储数据?
数据库系统解决了哪些文件系统无法解决的问题?
什么是数据独立性?为什么它如此重要?
数据库的三层体系结构是什么?
DBA 的日常职责有哪些?
二、核心概念详解
2.1 数据库系统 vs 文件系统
2.1.1 文件系统的缺陷
早期的数据存储使用文件系统,但存在诸多问题:
- 数据冗余和不一致:相同数据在多个文件中重复存储,不仅浪费存储空间,还容易导致数据不一致。例如,员工的地址信息可能同时存在于人事文件和薪资文件中,一旦地址变更需要同时更新两个文件,否则就会出现数据矛盾。
- 数据访问困难:需要编写专门的程序来访问数据,每次查询都需要开发新的应用程序,开发效率低下。
- 数据隔离:数据分散在各种文件和格式中,难以统一管理,也很难实现跨文件的数据关联查询。
- 完整性问题:难以保证数据的一致性约束,例如无法自动检查账户余额不能为负数。
- 原子性问题:难以保证操作的原子性,例如转账操作中,扣款成功但存款失败时,无法自动回滚。
- 并发访问异常:多个用户同时访问时可能出现数据不一致的问题,缺乏有效的并发控制机制。
- 安全性问题:难以实施细粒度的访问控制,无法精确控制哪些用户可以访问哪些数据字段。
2.1.2 数据库系统的优势
数据库系统解决了上述所有问题:
- 数据独立性:应用程序与数据的物理存储分离,当存储结构改变时,应用程序无需修改。
- 高效数据访问:通过索引、查询优化等技术,可以快速定位和检索数据。
- 数据完整性:通过约束、触发器等机制,自动维护数据的正确性。
- 数据安全:通过授权、审计等机制,控制用户对数据的访问。
- 并发控制:通过锁、多版本控制等技术,保证多个用户同时访问数据的一致性。
- 崩溃恢复:通过日志、检查点等技术,在系统故障后恢复数据到一致状态。
2.2 数据模型的演进
数据模型是对现实世界数据的抽象。
2.2.1 层次模型(Hierarchical Model)
数据组织成树形结构,每个节点可以有多个子节点,但只能有一个父节点。
公司
/ \
部门A 部门B
/ \
员工1 员工2代表系统:IMS(Information Management System)
层次模型的优点是结构简单直观,缺点是难以表示多对多关系,数据操作复杂。
2.2.2 网状模型(Network Model)
数据组织成有向图结构,节点之间可以有多对多的关系。
学生 ←→ 课程
↓ ↓
成绩 ←→ 教师代表系统:CODASYL
网状模型比层次模型更灵活,但数据操作仍然复杂,需要导航式的指针操作。
2.2.3 关系模型(Relational Model)
数据组织成二维表(关系),简单、数学基础扎实。
┌─────────┬─────┬────────┐
│ 学号 │ 姓名 │ 系别 │
├─────────┼─────┼────────┤
│ 001 │ 张三 │ 计算机 │
│ 002 │ 李四 │ 数学 │
└─────────┴─────┴────────┘代表系统:Oracle、MySQL、PostgreSQL
关系模型由 E.F. Codd 于 1970 年提出,具有坚实的数学基础(关系代数),使用声明式的查询语言 SQL,是目前应用最广泛的数据模型。
2.2.4 对象模型(Object Model)
数据组织成对象,支持继承、封装等面向对象特性。
代表系统:ObjectStore、Versant
对象模型适合处理复杂数据类型(如多媒体、CAD 数据),但查询语言不够直观。
2.3 数据库体系结构
数据库系统采用三层体系结构:
┌─────────────────────────────────────┐
│ 视图层(View Level) │ ← 用户看到的数据
├─────────────────────────────────────┤
│ 逻辑层(Logical Level) │ ← 数据的逻辑结构
├─────────────────────────────────────┤
│ 物理层(Physical Level) │ ← 数据的物理存储
└─────────────────────────────────────┘- 物理层:描述数据在磁盘上的存储方式,包括文件组织、索引结构、数据压缩等底层细节。
- 逻辑层:描述数据的逻辑结构(表、列、约束),是数据库管理员和应用程序员主要关注的层次。
- 视图层:描述用户看到的数据子集,不同用户可以看到不同的视图,从而实现数据的安全性控制。
2.4 数据库语言
数据库系统提供多种语言:
- DDL(Data Definition Language):定义数据库结构
```sql
CREATE TABLE Student (
id INT PRIMARY KEY,
name VARCHAR(50),
dept VARCHAR(20)
);
```
- DML(Data Manipulation Language):操作数据
```sql
SELECT * FROM Student WHERE dept = '计算机';
INSERT INTO Student VALUES (001, '张三', '计算机');
```
- DCL(Data Control Language):控制访问权限
```sql
GRANT SELECT ON Student TO user1;
REVOKE INSERT ON Student FROM user2;
```
2.5 数据库管理员(DBA)
DBA 的职责包括:
- 模式定义:设计和维护数据库的逻辑结构
- 存储结构定义:决定数据的物理存储方式
- 授权:管理用户的访问权限
- 完整性约束定义:维护数据的一致性
- 性能调优:优化查询性能、调整索引
- 备份与恢复:定期备份、灾难恢复
三、深入分析
3.1 数据独立性的深层理解
数据独立性是数据库系统的核心价值,分为两个层次:
- 逻辑数据独立性:修改逻辑模式(如添加新表、修改列)而不影响应用程序。例如,在 Student 表中添加一个新列 email,已有的查询程序不需要修改。
- 物理数据独立性:修改物理存储(如更换索引类型、改变文件组织方式)而不影响逻辑模式。例如,将 B+ 树索引替换为哈希索引,SQL 查询语句不需要改变。
物理数据独立性比逻辑数据独立性更容易实现,因为物理层的变化对上层完全透明。
3.2 数据库实例 vs 数据库模式
- 数据库模式(Schema):数据库的逻辑结构,很少改变。模式相当于数据库的"蓝图"。
- 数据库实例(Instance):某一时刻数据库中的数据,频繁变化。实例相当于数据库的"快照"。
这种区分类似于编程中"类"与"对象"的关系:模式是类型定义,实例是具体的数据值。
3.3 查询语言 vs 编程语言
- 查询语言:声明式,描述"要什么"(如 SQL)。用户只需指定查询目标,不需要指定实现步骤。
- 编程语言:过程式,描述"怎么做"(如 Java、Python)。程序员需要详细指定每一步操作。
声明式语言的优势在于:数据库优化器可以自动选择最优的执行策略,用户无需关心底层实现细节。
四、实践案例
4.1 案例一:从文件系统迁移到数据库系统
某小型企业原本使用文件系统管理客户信息,存在以下问题:
- 客户信息在销售、客服、财务三个部门各存一份,数据冗余严重
- 修改客户地址需要同时更新三个文件
- 无法快速查询"某地区消费超过1万元的客户"
迁移到数据库系统后:
- 客户信息集中存储,消除冗余
- 通过视图为不同部门提供不同的数据视角
- 一条 SQL 即可完成复杂查询
4.2 案例二:使用 MySQL 创建数据库
CREATE DATABASE university;
USE university;
CREATE TABLE Student (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
dept VARCHAR(20),
gpa DECIMAL(3,2)
);
INSERT INTO Student VALUES (001, '张三', '计算机', 3.8);
INSERT INTO Student VALUES (002, '李四', '数学', 3.5);
SELECT * FROM Student WHERE gpa > 3.6;4.3 案例三:使用 EXPLAIN 分析查询
EXPLAIN SELECT * FROM Student WHERE dept = '计算机';EXPLAIN 命令显示查询的执行计划,包括是否使用索引、扫描行数等信息,是性能优化的重要工具。
五、常见误区
5.1 误区一:"数据库就是表"
数据库不仅仅是表的集合,还包括约束、索引、视图、存储过程、触发器等。表只是数据的容器,数据库系统的真正价值在于其提供的管理机制。
5.2 误区二:"数据库管理员只是备份数据"
DBA 的职责远不止备份,还包括性能调优、安全管理、容量规划、模式设计、故障诊断等。优秀的 DBA 是数据库系统高效运行的关键。
5.3 误区三:"文件系统已经完全够用了"
对于小规模数据,文件系统确实可以工作。但当数据量增长、并发用户增多、安全性要求提高时,文件系统的局限性就会暴露无遗。
5.4 难点:理解数据独立性
数据独立性是抽象的,需要通过实践来理解。例如,修改索引不应该影响查询结果,更换存储引擎不应该影响 SQL 语句。
六、本章小结
第1章建立了数据库系统的全局视图:
数据库系统 解决了文件系统的诸多缺陷
数据模型 从层次模型演进到关系模型
三层体系结构 实现了数据独立性
数据库语言 包括 DDL、DML、DCL
DBA 负责数据库的设计、维护、优化
后续章节将深入讲解关系代数、SQL、数据库设计、事务处理等核心主题。
七、思考题
请列举文件系统的至少五个缺陷,并说明数据库系统是如何解决这些问题的。
比较层次模型、网状模型和关系模型的优缺点,说明为什么关系模型最终成为主流。
解释逻辑数据独立性和物理数据独立性的区别,各举一个实际例子说明。
数据库模式与数据库实例有什么区别?请用类比的方式说明。
假设你是一家中型企业的 DBA,请描述你一天的工作内容可能包括哪些方面。
声明式查询语言(如 SQL)与过程式编程语言(如 Java)有什么本质区别?声明式语言的优势在哪里?
为什么说数据独立性是数据库系统最重要的特性?如果没有数据独立性,会带来什么问题?