第二章 数据库基础理论:数据模型、关系模型、关系代数与关系演算

数据库理论的核心在于如何抽象、描述和操作现实世界中的数据。本章围绕四个递进层次展开:首先介绍用于描述数据结构与约束的数据模型;其次深入讲解当今商用数据库系统普遍采用的关系模型;随后引入用于查询和操作数据的关系代数;最后介绍以逻辑谓词为基础的元组关系演算与域关系演算。理解这些基础理论,是掌握SQL语言本质、进行查询优化和数据库设计的前提。

数据库基础理论体系结构图 数据模型(Data Model) 概念模型(E-R) → 逻辑模型(层次/网状/关系/面向对象) → 物理模型 核心三要素:数据结构、数据操作、完整性约束 关系模型(Relational Model) 关系(表)| 元组(行)| 属性(列)| 主键 | 外键 | 候选键 完整性规则:实体完整性、参照完整性、用户定义完整性 关系代数(Relational Algebra) 集合运算:∪ ∩ − × 专门运算:σ π ⋈ ÷ 关系演算(Relational Calculus) 元组关系演算:{ t | P(t) } 域关系演算:{ <x1,x2> | P(x1,x2) } 等价 SQL 语言(结构化查询语言) 关系代数与关系演算的具体实现 → 查询优化与执行计划

2.1 数据模型:从现实世界到机器世界的桥梁

2.1.1 核心原理:三级抽象与三要素

数据模型是数据库系统的核心和基础,它提供了一种抽象、表示和处理现实世界数据的方法。任何数据模型都必须满足三个基本要素:

  • 数据结构:描述数据的静态特征,包括数据的类型、内容、性质以及数据间的联系。这是刻画模型性质最重要的方面。
  • 数据操作:描述数据的动态特征,定义在数据结构上允许执行的操作集合(如查询、插入、删除、修改)及其操作规则。
  • 完整性约束:定义数据及其联系应满足的约束条件,以保证数据的正确性、有效性和相容性。

按照抽象层次的不同,数据模型通常分为三类:

模型类别代表模型主要用途典型用户
概念模型E-R模型(实体-联系)需求分析阶段,按用户观点建模系统分析师、DBA
逻辑模型层次、网状、关系、面向对象逻辑设计阶段,按计算机观点建模数据库设计人员
物理模型存储结构、索引、聚簇物理设计阶段,描述数据在存储介质上的组织DBA、系统运维

2.1.2 判断方法:如何选择合适的数据模型

在实际数据库设计中,选择逻辑模型需考虑以下因素:

  1. 数据间联系的复杂程度:若数据间存在大量多对多联系,关系模型优于层次和网状模型。
  2. 系统性能要求:层次模型(如IMS)在特定树形结构查询中性能较高,但灵活性差。
  3. 开发效率与维护成本:关系模型以集合论为基础,数学基础坚实,SQL标准化程度高,开发维护成本最低。
  4. 扩展性与分布式支持:关系模型天然支持水平扩展和分布式事务,是当前主流选择。
经验提醒:在四级考试中,概念模型(E-R图)与逻辑模型(关系模式)之间的转换是高频考点。核心规则是:实体转换为关系表,1:1联系可并入任一端,1:N联系并入N端,M:N联系必须单独建表。

2.1.3 案例拆解:高校选课系统的模型抽象

以高校选课系统为例,需求是管理学生、课程和选课成绩。在概念设计阶段,我们识别出两个实体(学生、课程)和一个联系(选课,M:N)。转换为关系模型后得到三个关系模式:

学生(学号,姓名,系别,入学年份)
课程(课程号,课程名,学分,任课教师)
选课(学号,课程号,成绩)   -- 主键为(学号,课程号),外键分别参照学生和课程

这一转换过程体现了从概念模型到逻辑模型的映射规则,同时通过外键约束实现了参照完整性。

2.1.4 常见误区与总结

易错点:混淆“关系模型”与“关系”。关系模型是一种逻辑数据模型,而“关系”在关系模型中特指一张二维表。此外,E-R图中的“联系”在转换为关系模式时,其主键由两端实体的主键组合而成,不能遗漏。

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. 确定实体与属性:从需求中提取所有名词性概念。
  2. 确定联系及基数:分析实体间的1:1、1:N、M:N关系。
  3. 定义主键与外键:确保每个关系有且仅有一个主键,外键正确指向被参照关系。
  4. 应用规范化理论:检查是否满足1NF、2NF、3NF或BCNF,消除数据冗余和更新异常。
实战要点:在SQL Server或MySQL中,实体完整性通过PRIMARY KEY约束实现,参照完整性通过FOREIGN KEY...REFERENCES实现,用户定义完整性通过CHECK约束实现。理解这些约束的底层逻辑,有助于诊断数据异常。

2.2.4 常见误区与总结

易错点:关系模型中的“关系”必须满足第一范式(属性不可再分)。例如,将“电话号码”设计为一个包含手机和座机的复合列,就违反了1NF。此外,外键不一定要与被参照关系的主键同名,但数据类型必须一致。

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’的学生姓名”为例,操作步骤如下:

  1. 确定涉及的关系:学生(Student)、选课(SC)。
  2. 先做选择:σ_课程号='C01'(SC),筛选出C01的选课记录。
  3. 再做投影:π_学号(σ_课程号='C01'(SC)),得到选修C01的学号集合。
  4. 最后连接:π_姓名(Student ⋈ (π_学号(σ_课程号='C01'(SC))))。

完整的代数表达式为:π_姓名(σ_Student.学号=SC.学号 ∧ SC.课程号='C01'(Student × SC))。实际优化中,应先做选择、投影以减少中间结果规模。

2.3.3 案例拆解:除运算的典型应用

查询“选修了全部课程的学生学号”。设课程关系为C(课程号),选课关系为SC(学号,课程号)。则表达式为:π_学号,课程号(SC) ÷ π_课程号(C)。除运算的步骤是:先求SC中每个学号对应的课程号集合,再找出包含全部课程号的学号。若学生S01选修了C01、C02、C03,而全部课程恰好是这三门,则S01入选。

优化技巧:在书写关系代数表达式时,应遵循“先选择、后投影、再连接”的原则。这对应SQL查询优化中的“谓词下推”策略,能显著减少中间结果的数据量。

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与之对应。这等价于关系代数中的除运算。

应试要点:在四级考试中,常要求将SQL语句改写为关系代数或关系演算表达式。掌握三者之间的转换关系至关重要。SQL的WHERE子句对应选择运算,SELECT子句对应投影运算,FROM子句对应笛卡尔积或连接,NOT EXISTS对应差运算或带¬的演算。

2.4.4 常见误区与总结

易错点:在元组关系演算中,量词的作用域必须明确。∀量词常与蕴含(→)搭配使用,∃量词常与合取(∧)搭配使用。若将∀误用为∧,会导致查询结果为空或错误。例如,“选修全部课程”必须用∀,而“选修某门课程”用∃即可。

2.5 本章总结与知识结构

本章从数据模型出发,经历了从概念抽象到数学定义的完整过程。核心知识结构如下:

层次核心概念关键操作/规则典型应用
数据模型概念模型、逻辑模型、物理模型E-R图转关系模式数据库设计
关系模型关系、元组、属性、键三大完整性规则表结构定义
关系代数σ、π、⋈、÷、∪、−先选择后投影再连接查询优化
关系演算元组变量、域变量、量词∀与→搭配,∃与∧搭配SQL语义分析

关系代数是过程性语言(描述“如何做”),关系演算是说明性语言(描述“做什么”),而SQL则综合了两者的优点,成为实际系统的标准语言。理解这些基础理论,不仅有助于通过四级考试,更能为后续的查询优化、事务管理和数据库设计打下坚实基础。