关系模型基本概念
关系模型基本概念
复习定位
关系模型用简单的"表"(关系)表示数据和数据之间的联系。它是目前最主流的数据库数据模型。关系是集合——元组无序、无重复。SQL的SELECT实质上是对关系做集合运算的结果。理解关系和关系代数是理解SQL查询执行过程的理论基础。
关系模型的基本术语
关系(Relation)——对应日常概念中的一张表。关系是元组的集合——集合中的元组无顺序且不重复。关系模式的名称+属性集合构成一个关系。
元组(Tuple)——对应表中的一条记录。笛卡尔积中的每个元素(d1,d2,...,dn)是一个n元组。
属性(Attribute)——对应表中的一列——列名。如学生关系的属性可以包含(学号、姓名、年龄、性别)。
域(Domain)——属性值的取值范围——年龄的域=0-120之间的整数、性别的域={男,女}。同一域可以作为不同属性的值来源——域通常是具有相同数据类型的一组值的集合。
候选码(Candidate Key)——能唯一确定一个元组的属性或最小属性组。如学生的学号、身份证号都是候选码。
主码(Primary Key)——设计者从候选码中选择的一个作为每行的唯一标识——主码非空且唯一——数据库管理系统在主码上默认建立索引。
外码(Foreign Key)——一个关系R中的属性集F——F不是R的主码或另一个关系S的主码——当F与S的主码对应时——F是R的外码。外码实现了关系之间的引用——如"学生"关系中的"系别编号"引用"系别"关系的主码。
关系的性质
关系模型中的关系有以下约束:
- 列是同质的——一列的每个分量来自同一域。
- 列的顺序不重要——关系是集合——列排列顺序不影响关系本身。
- 行顺序不重要——元组的顺序可以任意——只有集合的成员关系有意义。
- 元组不可以重复——关系是一个集合——没有重复元组。数据库实际存储时可能允许重复——但仍认为在关系理论层面不允许重复。
- 属性不可再分——关系模型要求属性的值是不可再分的原子值(1NF)。如果一个属性的值本身是一个集合或记录——就不满足关系模型的规范条件。
关系代数
关系代数是关系型数据库查询语言的理论基础——它以关系为操作数、以关系为结果的一组运算。
基本操作:
选择(σ)——从关系中选取满足条件的元组——σ_{age>18}(Student)——选择所有年龄大于18的学生。
投影(π)——从关系中选取指定的属性列——π_{name,age}(Student)——选择所有学生的姓名和年龄两列——结果自动去重。因为投影后的结果是一个关系——关系的本质是无重复元组的集合。
并(∪)——将两个结构相同(相同属性列)的关系合并——R∪S产生包含R或S的所有元组的关系——自动去重(消除双倍出现)。
差(−)——R−S得到由在R中但不在S中的元组构成的关系。
笛卡尔积(×)——R×S——由R的每个元组与S的每个元组串接而成——结果的属性数等于R和S的属性数之和——结果元组数等于|R|×|S|。如果R有m行n列、S有p行q列——笛卡尔积有m×p行、n+q列。
连接(⋈)——在笛卡尔积的基础上选择满足条件的元组——R⋈{R.A=S.B}S = σ(R×S)。在连接操作中如果属性名相同——自然连接会去除重复列。
除(÷)——R÷S的结果是那些在R中出现的属性列但不在S中的属性——而且在R中对应于S的元组集合包括了S中的所有元组。除法回答了"找那些在所有情况下的都包含的项目"——如"找出选修了全部课程的学生学号"。
SQL与关系代数的对应
SELECT name, age FROM Student WHERE age > 20;
-- 对应关系代数: π_{name,age}(σ_{age>20}(Student))
SELECT * FROM Student S JOIN SC ON S.sno = SC.sno;
-- 对应: S ⋈_{S.sno=SC.sno} SC
SELECT sno FROM SC
EXCEPT
SELECT sno FROM SC WHERE cno = 'C01';
-- 对应: π_{sno}(SC) − π_{sno}(σ_{cno='C01'}(SC)) -- 没学C01课程的学生很多业务SQL的复杂查询可以用关系代数的复合运算一步步推导——帮助优化器识别查询类型(如选择下推减少中间数据的大小)。
复习检查
关系和笛卡尔积之间的区别——集合还是元组形成序列?"关系是笛卡尔积的子集"是什么意思?
选择(σ)和投影(π)的结果——哪一个可能减少行数、哪一个减少列数?投影操作一定会减少列数吗?
在什么情况下自然连接和笛卡尔积+选择在代数上等价?自然连接自动省略了选择条件
R.A=S.B——但如果两个关系的连接属性不同名时不能自然连接——该怎么办?除运算的例子——"选修了全部课程的学生"——怎么用不含除的关系代数表达?(用差运算两次取逆否命题)
主码任意属性不能取NULL——这属于什么完整性规则?外码的取值是NULL时的语义意义是什么?