第二章 数据库基础理论:数据模型、关系模型、关系代数与关系演算
数据库理论的核心在于如何抽象、描述和操作现实世界中的数据。本章围绕四个递进层次展开:首先介绍用于描述数据结构与约束的数据模型;其次深入讲解当今商用数据库系统普遍采用的关系模型;随后引入用于查询和操作数据的关系代数;最后介绍以逻辑谓词为基础的元组关系演算与域关系演算。理解这些基础理论,是掌握SQL语言本质、进行查询优化和数据库设计的前提。
2.1 数据模型:从现实世界到机器世界的桥梁
2.1.1 核心原理:三级抽象与三要素
数据模型是数据库系统的核心和基础,它提供了一种抽象、表示和处理现实世界数据的方法。任何数据模型都必须满足三个基本要素:
- 数据结构:描述数据的静态特征,包括数据的类型、内容、性质以及数据间的联系。这是刻画模型性质最重要的方面。
- 数据操作:描述数据的动态特征,定义在数据结构上允许执行的操作集合(如查询、插入、删除、修改)及其操作规则。
- 完整性约束:定义数据及其联系应满足的约束条件,以保证数据的正确性、有效性和相容性。
按照抽象层次的不同,数据模型通常分为三类:
| 模型类别 | 代表模型 | 主要用途 | 典型用户 |
|---|---|---|---|
| 概念模型 | E-R模型(实体-联系) | 需求分析阶段,按用户观点建模 | 系统分析师、DBA |
| 逻辑模型 | 层次、网状、关系、面向对象 | 逻辑设计阶段,按计算机观点建模 | 数据库设计人员 |
| 物理模型 | 存储结构、索引、聚簇 | 物理设计阶段,描述数据在存储介质上的组织 | DBA、系统运维 |
2.1.2 判断方法:如何选择合适的数据模型
在实际数据库设计中,选择逻辑模型需考虑以下因素:
- 数据间联系的复杂程度:若数据间存在大量多对多联系,关系模型优于层次和网状模型。
- 系统性能要求:层次模型(如IMS)在特定树形结构查询中性能较高,但灵活性差。
- 开发效率与维护成本:关系模型以集合论为基础,数学基础坚实,SQL标准化程度高,开发维护成本最低。
- 扩展性与分布式支持:关系模型天然支持水平扩展和分布式事务,是当前主流选择。
2.1.3 案例拆解:高校选课系统的模型抽象
以高校选课系统为例,需求是管理学生、课程和选课成绩。在概念设计阶段,我们识别出两个实体(学生、课程)和一个联系(选课,M:N)。转换为关系模型后得到三个关系模式:
学生(学号,姓名,系别,入学年份)
课程(课程号,课程名,学分,任课教师)
选课(学号,课程号,成绩) -- 主键为(学号,课程号),外键分别参照学生和课程
这一转换过程体现了从概念模型到逻辑模型的映射规则,同时通过外键约束实现了参照完整性。
2.1.4 常见误区与总结
2.2 关系模型:二维表的严谨数学定义
2.2.1 核心原理:关系模型的术语体系
关系模型由E.F.Codd于1970年提出,其核心概念包括:
- 关系(Relation):一张二维表,对应一个实体集合。关系具有以下性质:列同质(每列数据类型相同)、列序无关、行序无关、元组互异(无重复行)、分量原子(不可再分)。
- 元组(Tuple):表中的一行,表示一个具体实体。
- 属性(Attribute):表中的一列,表示实体的一个特征。每个属性有一个取值范围,称为域(Domain)。
- 键(Key):包括候选键(能唯一标识元组的最小属性集)、主键(选定的候选键)、外键(引用其他关系主键的属性)。
2.2.2 完整性规则:保证数据质量的三大约束
| 完整性规则 | 定义 | 违反示例 |
|---|---|---|
| 实体完整性 | 主键属性不能取空值(NULL) | 插入一条学号为NULL的学生记录 |
| 参照完整性 | 外键取值必须等于被参照关系中某个元组的主键值,或取空值(若外键自身允许) | 选课表中插入一个不存在的学号 |
| 用户定义完整性 | 针对具体应用定义的约束,如成绩在0~100之间 | 成绩录入为150分 |
2.2.3 操作流程:关系模型的规范化设计
- 确定实体与属性:从需求中提取所有名词性概念。
- 确定联系及基数:分析实体间的1:1、1:N、M:N关系。
- 定义主键与外键:确保每个关系有且仅有一个主键,外键正确指向被参照关系。
- 应用规范化理论:检查是否满足1NF、2NF、3NF或BCNF,消除数据冗余和更新异常。
2.2.4 常见误区与总结
2.3 关系代数:以集合运算为基础的查询语言
2.3.1 核心原理:八大关系运算
关系代数是一种抽象的查询语言,以集合运算为理论基础。运算对象是关系,运算结果也是关系。可分为两类:
- 传统集合运算:并(∪)、差(−)、交(∩)、笛卡尔积(×)。要求参与运算的两个关系具有相同的目(属性个数)且对应属性取自相同域。
- 专门关系运算:选择(σ)、投影(π)、连接(⋈)、除(÷)。
各运算的数学定义如下:
选择:σ_F(R) = { t | t ∈ R ∧ F(t) = true } -- 从行方向筛选
投影:π_A(R) = { t[A] | t ∈ R } -- 从列方向筛选
连接:R ⋈_θ S = { t_r ⌒ t_s | t_r ∈ R ∧ t_s ∈ S ∧ t_r[θ] t_s } -- 按条件组合
除:R ÷ S = { t[X] | t ∈ R ∧ π_Y(S) ⊆ Y_R } -- 用于“包含全部”类查询
2.3.2 操作流程:用关系代数表达查询
以“查询选修了课程号为‘C01’的学生姓名”为例,操作步骤如下:
- 确定涉及的关系:学生(Student)、选课(SC)。
- 先做选择:σ_课程号='C01'(SC),筛选出C01的选课记录。
- 再做投影:π_学号(σ_课程号='C01'(SC)),得到选修C01的学号集合。
- 最后连接:π_姓名(Student ⋈ (π_学号(σ_课程号='C01'(SC))))。
完整的代数表达式为:π_姓名(σ_Student.学号=SC.学号 ∧ SC.课程号='C01'(Student × SC))。实际优化中,应先做选择、投影以减少中间结果规模。
2.3.3 案例拆解:除运算的典型应用
查询“选修了全部课程的学生学号”。设课程关系为C(课程号),选课关系为SC(学号,课程号)。则表达式为:π_学号,课程号(SC) ÷ π_课程号(C)。除运算的步骤是:先求SC中每个学号对应的课程号集合,再找出包含全部课程号的学号。若学生S01选修了C01、C02、C03,而全部课程恰好是这三门,则S01入选。
2.3.4 常见误区与总结
2.4 元组关系演算与域关系演算:逻辑谓词的力量
2.4.1 核心原理:两种演算的表示形式
关系演算以数理逻辑中的谓词演算为基础,分为两种:
- 元组关系演算(Tuple Relational Calculus, TRC):以元组变量为基本单位,表达式形式为
{ t | P(t) },其中t是元组变量,P(t)是谓词公式。例如:{ t | Student(t) ∧ t.系别='CS' }表示查询计算机系的所有学生。 - 域关系演算(Domain Relational Calculus, DRC):以属性(域)变量为基本单位,表达式形式为
{ <x1, x2, ..., xn> | P(x1, x2, ..., xn) }。例如:{ <name> | ∃s (Student(s) ∧ s.姓名=name ∧ s.系别='CS') }。
两种演算均包含原子公式(如R(t)、t[i] θ u[j])和公式的连接词(∧、∨、¬)及量词(∃存在、∀任意)。
2.4.2 判断方法:关系代数与关系演算的等价转换
关系代数与关系演算在表达能力上是等价的。转换规则如下:
| 关系代数运算 | 元组关系演算等价表示 |
|---|---|
| 选择 σ_F(R) | { t | R(t) ∧ F' } |
| 投影 π_A(R) | { t[A] | R(t) } |
| 并 R ∪ S | { t | R(t) ∨ S(t) } |
| 差 R − S | { t | R(t) ∧ ¬S(t) } |
| 连接 R ⋈ S | { t | ∃u∃v (R(u) ∧ S(v) ∧ t[A]=u[A] ∧ t[B]=v[B]) } |
2.4.3 案例拆解:用元组关系演算表达复杂查询
查询“至少选修了学生S01选修的所有课程的学生学号”。该查询涉及“包含”语义,需使用蕴含量词:
{ t.学号 | Student(t) ∧ ∀u (SC(u) ∧ u.学号='S01' → ∃v (SC(v) ∧ v.学号=t.学号 ∧ v.课程号=u.课程号)) }
该表达式的含义是:对于S01选修的每一门课程u,都存在该学生的选课记录v与之对应。这等价于关系代数中的除运算。
2.4.4 常见误区与总结
2.5 本章总结与知识结构
本章从数据模型出发,经历了从概念抽象到数学定义的完整过程。核心知识结构如下:
| 层次 | 核心概念 | 关键操作/规则 | 典型应用 |
|---|---|---|---|
| 数据模型 | 概念模型、逻辑模型、物理模型 | E-R图转关系模式 | 数据库设计 |
| 关系模型 | 关系、元组、属性、键 | 三大完整性规则 | 表结构定义 |
| 关系代数 | σ、π、⋈、÷、∪、− | 先选择后投影再连接 | 查询优化 |
| 关系演算 | 元组变量、域变量、量词 | ∀与→搭配,∃与∧搭配 | SQL语义分析 |
关系代数是过程性语言(描述“如何做”),关系演算是说明性语言(描述“做什么”),而SQL则综合了两者的优点,成为实际系统的标准语言。理解这些基础理论,不仅有助于通过四级考试,更能为后续的查询优化、事务管理和数据库设计打下坚实基础。