概述
- 目前应用最广泛的数据库
- 数据的逻辑模型是 关系模型
- 数据库操作建立在关系代数基础上
基本特征:使用关系模型组织数据
时间轴:
· 20世纪70年代末,关系方法的理论研究和系统软件(IBM 的 SystemR 和 SQL/DS)研制取得重大突破
· 20世纪80年代,关系模型逐渐取代网状模型和层次模型
关系数据模型
关系模型三要素:关系数据结构、关系操作集合、关系完整性约束。
关系数据结构
关系数据模型仅包含单一数据结构:关系。以学生表为例:
学号 | 姓名 | 性别 | 班级 |
---|---|---|---|
001 | 张三 | 男 | A |
002 | 李四 | 女 | A |
003 | 小明 | 女 | B |
- 表(Table)==关系(Relation):是一个二维数据结构,由表名和各列、各行数据组成,每个表有唯一表名每一行描述一条具体记录值;关系(表)有三种类型,即,基本关系(基表)、查询表、视图表,分别代表实际存在的表、查询结果对应的表、基表或其他视图之上建立的虚表(没有实际物理记录),表是内模式,视图是外模式
- 列(Column)==字段(Field)==属性(Attribute):每一列表示实体的一个属性,具有相同数据类型。列的个数称为关系的元数(或度数),列的值称为属性值,属性值的取值范围称为值域
- 行(Row)==元组(Tuple)==记录(Record),行的个数称为关系的基数
- 分量(Component):元组中的一个属性值,如元组(002, 李四, 女, A)的每一个属性值,002、李四、女、A,都是这个元组的分量
- 码(或键, Key):能够用来唯一标识关系的每个元组的属性或属性组(任意两个元组在该属性或属性组上值的组合都不相同)
- 超码(或超键, Super Key):在关系的一个码(唯一标识的属性组)中移除某个属性,这个属性组仍是关系的码,这样码(或键)称为该关系的超码(或超键);每个关系至少存在一个超码,即该关系所有属性的集合,也是该关系最大的超码;如(学号, 姓名, 性别, 班级)、(学号, 姓名)都是学生表的超码
- 候选码(或候选键, Candidate Key):在关系的一个码中,不能移除任何一个属性,否则这个属性组就不是关系的码,这样的码称为该关系的候选码(或候选键);所以,候选码是关系最小的超码,如学号是学生表的候选码,(学号, 课程号)是成绩表的候选码
- 主码(或主键, Primary Key):若干候选码中,被指定用来唯一标识元组的一个候选码
- 全码(或全键, All-Key):关系的主键是这个关系模式的所有属性集合
- 主属性(Primary Attribute):候选码中的任何一个属性
- 非主属性(Nonprimary Attribute):不在候选码中的属性
- 外码(或外键, Foreign Key):不是所在关系的主键或候选键,而是另一关系的主键或候选键的属性(属性组)
- 参照关系(或从关系, Referencing Relation):外键相关联的两个关系中,外键所在的关系
- 被参照关系(或主关系, Referenced Relation):外键相关联的两个关系中,外键作为主键的关系
- 域(Domain):属性的取值范围,如性别,域为“男”、“女”、“第三性别”
- 数据类型(Data Type):如姓名的类型应为字符型varchar
- 关系模式(Relation Schema):数据模型的“型”是指某一类数据的结构和属性、“值”是指型的具体赋值,而关系数据库的“型”是指关系模型、“值”是指关系,即 关系模式是对关系的描述 ;所以关系模式是静态的、稳定的,关系是动态的、变化的, 关系是关系模式在某一时刻的状态或内容 ,如学生表对应的关系模式(表结构)通常是不变的,但由于新生入学,毕业生离校,其内容会经常发生变化。
- 关系数据库(Relation Database):关系模型作为数据的逻辑模型,关系作为数据组织方式的一类数据库。
关系数据库对关系的限定:
- 每个属性都是不可分解的,不允许表中有表
- 每个关系仅有一种关系模式(属性的类型和个数固定)
- 属性必须命名,同一关系模式中属性名不能相同
- 不允许出现候选键值完全相同的元组
- 元组顺序和属性顺序可任意交换
关系操作集合
基本的关系操作
关系模型常用的关系操作包括两大部分:查询(Query)操作、插入(Insert)、删除(Delete)和修改(Update)操作。
查询是关系操作最主要的部分,可以分为:

关系操作的对象和结果都是集合,因此也被称为一次一集合(Set-at-a-time)。
关系数据语言的分类
关系语言的特点(优点)是高度非过程化:用户不必建立特殊的存取路径,存取路径由DBMS优化机制选择;不必使用循环和递归完成数据的重复操作。
关系数据语言分为三类:关系代数语言、关系演算语言、SQL语言

- 关系代数、元组关系演算、域关系演算均是抽象查询语言,与数据库中实现的实际查询语言不同,实际查询语言除了提供关系代数或关系演算之外,还提供了如聚合函数、关系赋值、算术运算等附加功能
- 三类语言的共同特点是:完备的表达能力、非过程化操作集合、功能强、既能独立使用也可以嵌入高级语言使用
关系代数
关系代数是以集合代数为基础发展起来的一种抽象的关系操作语言。
关系运算操作包含三要素:操作符 (作用于)-> 操作对象 (得到)-> 操作结果,
运算(操作)对象是关系,运算(操作)结果亦为关系。
关系代数的运算符:
运算符 | 含义 | |
---|---|---|
集合运算符 | ∪ | 并 |
− | 差 | |
∩ | 交 | |
× | 笛卡尔积 | |
专门的关系运算符 | σ | 选择 |
Π | 投影 | |
⋈ | 连接 | |
÷ | 除 |
辅助专门的关系运算符的运算符:
比较操作符:>、≥、<、≤、=、≠
逻辑运算符:∧(与)、∨(或)、┐(非)
关系代数操作经过有限次复合的表达式称为关系代数表达式,是一种抽象的数据库操作语言,按照运算符的不同,关系代数的操作可分为传统的集合运算与专门的关系运算。
传统的集合运算
集合运算是二目运算,将关系看成元组的集合,从行的角度进行运算。
Table: Students_1
NO | Name | Class |
---|---|---|
901001 | 晓明 | A |
901002 | 徐昆 | B |
901003 | 小六 | A |
Table: Students_2
No | Name | Class |
---|---|---|
901004 | 刘能 | C |
901005 | 宝强 | D |
901001 | 晓明 | A |
(1). 并(Union)
R3 = R1 ∪ R2
R3由关系R1和R2所有不同元组(去掉重复元组后的所有元组)组成,R1和R2字段的个数相同,字段的值域相同。
Students_1 ∪ Students_2的结果:
No | Name | Class |
---|---|---|
901001 | 晓明 | A |
901002 | 徐昆 | B |
901003 | 小六 | A |
901004 | 刘能 | C |
901005 | 宝强 | D |
(2). 差(Difference)
R3 = R1 − R2
R3由属于R1,但不属于R2的元组组成,R1和R2字段的个数相同,字段的值域相同。
Students_1 − Students_2的结果:
NO | Name | Class |
---|---|---|
901002 | 徐昆 | B |
901003 | 小六 | A |
(3). 交(Intersection)
R3 = R1 ∩ R2,也可以用差运算表示,R1 ∩ R2 = R1 − (R1 − R2)
R3由既属于R1,又属于R2的元组组成,R1和R2字段的个数相同,字段的值域相同。
Students_1 ∩ Students_2的结果:
NO | Name | Class |
---|---|---|
901003 | 小六 | A |
(4). 笛卡尔积(Cartesian Product)
R3 = R1 × R2
R3是由R1和R2所有元组连接而成的新关系,假设R1为m元关系(m个字段),R2为n元关系,则R3为(m+n)元关系,且R3中元组前m个分量(元)是R1的一个元组,后n个分量是R2的一个元组,例:
Table: Students
SNO | SName |
---|---|
901001 | 晓明 |
901002 | 徐昆 |
901003 | 小六 |
Table: Course
CNo | CName | CRoom |
---|---|---|
1 | 数据库 | C5-201 |
2 | Java | C5-307 |
Students × Course的结果:
SNO | SName | CNo | CName | CRoom |
---|---|---|---|---|
901001 | 晓明 | 1 | 数据库 | C5-201 |
901001 | 晓明 | 2 | Java | C5-307 |
901002 | 徐昆 | 1 | 数据库 | C5-201 |
901002 | 徐昆 | 1 | Java | C5-307 |
901003 | 小六 | 1 | 数据库 | C5-201 |
901003 | 小六 | 1 | Java | C5-307 |
专门的关系运算
专门的关系运算从行和列的角度进行运算。

(1). 选择(Select)

其中,F为条件表达式,R为指定的被运算关系名。
选择运算是从指定关系中选取满足条件的若干元组,由这些元组组成一个新关系,其形式为:
SELECT 关系名 WHERE 条件
其中条件是由常数、属性名和比较操作符、逻辑运算符组成的表达式。
例如,找出Students_1里所有A班同学
SELECT Students_1 WHERE Class = ‘A’
其运算结果为
NO | Name | Class |
---|---|---|
901001 | 晓明 | A |
901003 | 小六 | A |
(2).投影(Projection)

其中,R为被运算关系名,A为属性序列。
投影运算是从指定关系中选取指定的(若干)属性名,组成一个新关系,其形式为:
PROJECTION 关系名 (属性名1, 属性名2, …, 属性名n)
例如找出Students_1班级情况
PROJECTION Students_1 (NO, Class)
其运算结果为
NO | Class |
---|---|
901001 | A |
901002 | B |
901003 | A |
投影运算形成的新关系不包含重复元组
(3).连接(Join)
连接也称为θ连接

其中,R和S代表两个不同的关系,i和j分别代表R的第i列和S的第j列,θ代表比较运算符。
从笛卡尔积R×S中选取i属性与j属性上满足θ的元组,这些元组组成一个新的关系,其形式为:
JOIN 关系名1 AND 关系名2 WHERE 条件
等值连接和自然连接是连接操作中最常用的两种链接:
等值连接是θ为“=”的连接操作,它从R×S中选取i和j的属性值相等那元组。
自然连接是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把属性重复的属性去掉。
等值连接是从行的角度进行运算,但自然连接还需取消重复列,所以自然连接是同时从行和列的角度进行运算。
自然连接用于构造新关系,投影和选择用于分解关系。
一般地,如果两个关系没有公共属性,它们的自然连接就变成笛卡尔积。
Table: Students_3 S3
No | Name | Class |
---|---|---|
902005 | Alex | C |
902006 | Bob | C |
902007 | Carey | D |
902008 | Dick | D |
Table: Courses_3 C3
No | Course |
---|---|
902005 | Spring Boot |
902006 | ASP.NET Core |
902007 | EF Core |
902007 | Spring Boot |
902009 | MyBatis |
S3⋈C3 S3.No = C3.No 等值连接:
S3.No | Name | Class | C3.No | Course |
---|---|---|---|---|
902005 | Alex | C | 902005 | Spring Boot |
902006 | Bob | C | 902006 | ASP.NET Core |
902007 | Carey | D | 902007 | EF Core |
902007 | Carey | D | 902007 | Spring Boot |
S3⋈C3 自然连接:
No | Name | Class | Course |
---|---|---|---|
902005 | Alex | C | Spring Boot |
902006 | Bob | C | ASP.NET Core |
902007 | Carey | D | EF Core |
902007 | Carey | D | Spring Boot |
(4). 除(Division)
R ÷ S
假设被除关系R为m元关系,除关系S为n元关系,则运算结果为一个m-n元关系。
先将m-n列的值分组(去重),检查每个组的其它列是否包含S的全部元组,若包含,则该组的值作为商关系的一个元组。
除法是笛卡尔乘积的映射。
Table: Student_Course
Name | Course |
---|---|
Alex | Java |
Alex | C# |
Bob | C# |
Carey | Java |
Dick | Java |
Dick | C# |
Table: Course
Course | Room |
---|---|
Java | B6-101 |
C# | B6-205 |
Student_Course ÷ Course(查询出选修了所有课程的学生)的结果:
Name |
---|
Alex |
Dick |
关系模型的完整性约束
数据完整性包括两方面:与现实世界中应用需求的数据的正确性、相容性和一致性;数据库内数据之间的正确性、相容性和一致性。
数据完整性由完整性规则来定义,关系模型的完整性规则是对关系的某种约束,也称为完整性约束,它保证用户操作数据库时不会破坏数据完整性。

关系模型的三类完整性约束
(1). 实体完整性约束(Entity Integrity Constraint)
实体完整性约束是指关系的主属性不能为空(NULL),关系数据库系统中,实体完整性是指实际存储数据的表中,主键不能重复也不能取NULL值。
(2). 参照完整性约束(Referential Integrity Constraint)
参照完整性约束就是定义外键与主键之间的引用规则:若属性(属性组)F是关系R的外键,与关系S的主键K相对应,则R中每个字段在F上的值只允许两种可能,要么为NULL,要么等于S中某个字段在K上的值。
(3). 用户定义完整性约束(User-defined Integrity Constraint)
用户定义完整性约束是针对某一应用环境的完整性约束条件,这类完整性规则可在建立数据表时定义,也可在程序中进行检查和控制。
关系模型完整性约束的检验
(1). 执行插入操作时
首先检查实体完整性约束:检查插入行主键的值是否已经存在,若不存在,再检查插入行主键的值是否为NULL,若不为NULL,继续执行
然后检查参照关系完整性约束:如果向被参照关系插入,不考虑此约束,如果向参照关系插入,检查插入行的外键值是否在参照关系的主键值中存在,若存在,继续执行,如不存在,可将外键值改为NULL值(假设外键允许为NULL)再继续执行
最后检查用户定义完整性约束
(2). 执行删除操作时
检查参照关系完整性约束:如果删除被参照关系中的行,检查被删除行的主键值时候正在被对应的参照关系引用,若未被引用,执行删除操作,若正在被引用,有三种可能的做法:
- 拒绝删除
- 空值删除:将参照关系对应的外键改为NULL(假设外键允许为NULL)
- 级联删除:将参照关系对应的外键所在的行删除
(3). 执行更新操作时
可以看成先执行删除操作,再执行插入操作
关系数据库的规范化理论
关系模式(Relation Schema):关系的描述,用于说明数据库中有哪些表,表有那些列,通过这些结构,设计出一个符合功能需求的数据库结构。
关系是元组的集合,因此关系模式必须指出这个元组集合的结构,即它由哪些属性构成,这些属性来自哪些域,以及属性与域之间的映象关系。
关系数据库的规范化理论:
- 是关系数据库设计的理论依据
- 研究个属性之间的依赖关系对关系模式性能影响
- 提供判断关系模式优劣的理论标准
关系模式可能存在的冗余和异常问题:
- 数据冗余:同一数据被反复存储
- 更新异常:数据冗余导致更新同一数据时需修改多处
- 插入异常:数据不能执行插入操作,比如该关系模式中,一部分关键字为空
- 删除异常:不应该删除的数据被删除,假设有一个关系模式供应商(供应商名, 地址, 货物名称),删除了某个供应商的所有货物的同时也删除了这个供应商的信息
解决上述问题需要引入数据依赖,数据依赖是作为关系模式取值的一种约束条件,任何一个关系都必须满足,其中两种重要类型的数据依赖:函数依赖(Functional Dependency, FD)和多值依赖(Multi-Valued Dependency, MVD)。
函数依赖与关键字
函数依赖是指关系中属性间的对应关系
定义一:函数依赖
关系R中,属性X的每一个值,属性Y只有唯一值与之对应,则称X 函数决定 Y,或Y 函数依赖于 X,记作X→Y,其中X称为决定因素。
函数依赖根据性质不同可分为完全函数依赖、部分函数依赖和传递函数依赖。
定义二:完全函数依赖
X、Y为关系R的属性集,若X 函数决定 Y,且对X中的任何真子集(A包含于B,且A不等于B,则集合A是集合B的真子集)X‘满足X’ 不函数决定 Y,则称Y 完全函数依赖 于X。
例如,学生成绩的关系模式(SNO, CNO, GRADE),学号、课程号、成绩,在该关系中,函数依赖 (SNO, CNO)→GRADE 为完全函数依赖,因为SNO和CNO都不能单独 函数决定 GRADE,SNO和CNO为主属性。
定义三:部分函数依赖
X、Y为关系R的属性集,若X 函数决定 Y,且X中存在一个真子集X‘满足X’ 函数决定 Y,则称Y 部分函数依赖于 X。
定义四:传递函数依赖
X、Y、Z为关系R的属性集,若X 函数决定 Y,但Y 不函数决定 X,而 函数决定 Z,则有X 函数决定 Z,称为Z 传递函数依赖 于X。
例如,图书出版社的关系模式(BNO, PNAME, PADDRESS),书号、出版社名、出版社地址,一个书号只能为一家出版社出版,但一家出版社可以出版许多书号,所以该关系存在依赖:BNO→PNAME & PNAME→PADDRESS,但 PNAME !→ BNO,所以BNO→PADDRESS为传递函数依赖。
定义五:关键字
关系R中,U为全部属性集合,X为U的子集(A包含于B,且A可能等于B,则集合A是集合B的子集),若X 完全函数依赖 于U,则X为R的一个候选关键字。
一个关系可能存在多个候选关键字,通常选择其中之一作为主键,候选关键字中包含的属性称为主属性,不包含在内的属性称为非主属性。
补充定义六:平凡函数依赖
关系R中,属性集合Y是属性集合X的子集时(Y⊆X),存在Y 函数依赖于 X,即一组属性函数决定它的所有子集,这种函数依赖称为平凡函数依赖。
范式与关系范式化过程
- 范式是符合某一种级别的关系模式的集合,关系数据库中的关系必须满足一定的要求,满足不同程度要求的为不同范式
- 满足最低要求的范式是第一范式(1NF),进一步满足更多要求的称为第二范式(2NF),以次类推
- 一般说来,数据库只需满足第三范式(3NF)
- 低一级范式通过模式分解(Schema Decomposition),转换为若干高一级别的关系模式的集合,这个过程叫范式化(Normalization)
- 关系数据库所有关系结构都必须是范式化的(即至少是第一范式的)
(1). 第一范式
关系R中每个列与行交点处的取值都是不可再分的基本元素,则R为第一范式。
即:不满足第一范式的关系为非规范关系,如下关系:
SNO | CNO | CNAME | TNAME | TPLACE | GRADE |
---|---|---|---|---|---|
902010 | C01 | MySQL | 蔡老师 | D1-101 | 70 |
902011 | C01 | MySQL | 蔡老师 | D1-101 | 80 |
C02 | SQL Server | 张老师 | D1-102 | 60 |
转为为1NF范式:
SNO | CNO | CNAME | TNAME | TPLACE | GRADE |
---|---|---|---|---|---|
902010 | C01 | MySQL | 蔡老师 | D1-101 | 70 |
902011 | C01 | MySQL | 蔡老师 | D1-101 | 80 |
902011 | C02 | SQL Server | 张老师 | D1-102 | 60 |
但目前仍存在问题:冗余高(蔡老师的信息存储了两次),插入异常(没有同学选修的课程无法存储到这个关系中),删除异常(若删除最后一条记录,SQL Server这门课的相关信息也被删除了)。
问题原因:GRADE完全函数依赖于(SNO, CNO),CNAME、TNAME、TPALCE函数依赖于CNO。
解决方案:将满足函数依赖的属性分解组成多个关系:
Table: SG
SNO | CNO | GRADE |
---|---|---|
902010 | C01 | 70 |
902011 | C01 | 80 |
902011 | C02 | 60 |
Talbe: CT
CNO | CNAME | TNAME | TPLACE |
---|---|---|---|
C01 | MySQL | 蔡老师 | D1-101 |
C02 | SQL Server | 张老师 | D1-102 |
(2). 第二范式
关系R为1NF,且R中的所有非主属性都完全依赖于候选关键字,则R为第二范式。
关系SG和CT满足2NF的定义。
但目前CT还是存在问题:CT中,若有一位新来的王老师还未分配教学课程,存在插入和删除异常以及修改繁琐的问题。
问题原因:TPLACE函数依赖于TNAME,TNAME函数依赖于CNO,但CNO不函数依赖于TNAME。
解决方案:消除CT中主属性对候选关键字的传递函数依赖,继续分解。
Table: COURSE
CNO | CNAME | TNAME |
---|---|---|
C01 | MySQL | 蔡老师 |
C02 | SQL Server | 张老师 |
Table: INSTRUCTOR
TNAME | TPLACE |
---|---|
蔡老师 | D1-101 |
张老师 | D1-102 |
王老师 | D1-102 |
(3). 第三范式
关系R为2NF,且R中每一个非主属性都不传递函数依赖于候选关键字,则R为第三范式。
关系COURSE和INSTRUCTOR满足3NF的定义。
将COURSE的课程CNO替换为学号SNO,得到一个新的选课关系表SCOURSE:
Table: SCOURSE
SNO | CNAME | TNAME |
---|---|---|
902010 | MySQL | 蔡老师 |
902011 | MySQL | 蔡老师 |
902012 | MongoDB | 王老师 |
902012 | Redis | 甄老师 |
902013 | Redis | 贾老师 |
目前SCOURSE依然存在问题:一个学生可选多门课程,每一门课程可有多个老师,但每个老师只能指导一门课程,此时,一个新课程和该课程的指导老师的数据要插入到数据库时,必须至少有一个学生选修该课程,且这位老师被分配给他时,才能插入。
问题原因:SCOURSE的候选关键字为(SNO, CNAME)和(SNO, TNAME),故不存在主属性,也就不存在非主属性对主属性的传递函数依赖,所以SCOURSE也是一个3NF,但是主属性之间存在函数依赖CNAME函数依赖于TNAME。
解决方案:进一步规范化。
Table: ST
SNO | TNAME |
---|---|
902010 | 蔡老师 |
902011 | 蔡老师 |
902012 | 王老师 |
902012 | 甄老师 |
902013 | 贾老师 |
Table: TC
CNAME | TNAME |
---|---|
MySQL | 蔡老师 |
MongoDB | 王老师 |
Redis | 甄老师 |
Redis | 贾老师 |
(4). BCNF
为解决3NF有时出现的异常问题,R.F.Boyce和E.FCodd提出了3NF的改进形式BCNF
关系R为3NF,X、Y为其属性集,F为其函数依赖集,若F中所有函数依赖X→Y(Y不属于X)中的X必包含候选关键字,则R为BCNF。
简而言之,若R中每一组函数依赖的决定因素都包含一个候选关键字,则R为BCNF,决定因素可以是单一属性或组合属性。
满足BCNF条件有:所有非主属性对每一个候选键都是完全函数依赖; 所有的主属性对每一个不包含它的候选键,也是完全函数依赖;没有任何属性完全函数依赖于非候选键的任何一组属性。
ST和TC满足BCNF的定义。
附记
重点:关系模型的基本概念、关系的完整性约束、关系数据库的规范化理论
难点:关系数据库的规范化理论
关系数据库的规范化理论,的确难,可能第一遍看明白了,看第二遍之前就忘了,还是多看多理解吧