目录
7.1 关系数据库概述
7.2 关系代数
7.3 元组演算与域演算
7.4 查询优化
7.5 关系数据库设计
7.6 模式分解
前言:
笔记来自《文老师软考数据库》教材精讲,精讲视频在b站,某宝都可以找到,个人感觉通俗易懂。
7.1 关系数据库概述
- 关系模型采用单一的数据结构一关系,来表示现实世界的实体以及实体间的联系,对应的逻辑结构为二维表。
- 候选码(Candidate Key):若关系中的某一属性或属性组的值能唯一标识一个元组,则称该属性或属性组为候选码。
- 主码(Primary Key):或称主键,若一个关系有多个候选码,则选定其中一个为主码。
- 主属性(Primeattribute):包含在任何候选码中的属性称为主属性。不包含在任何候选码中的属性称为非主属性(NonPrime attribute)
- 外码(Foreignkey):如果关系模式R中的属性或属性组非该关系的码,但它是其他关系的码,那么该属性集对关系模式R而言是外码。
- 全码(AIl-key):关系模型的所有属性组是这个关系模式的候选码,称为全码。
7.2 关系代数
- 并:结果是两张表中所有记录数合并,相同记录只显示一次;
- 交:结果是对长表中相同的过录;
- 差:S1- S2 结果是S1表中有,而S2表中没有的那些记录。
- 笛卡尔积:S1*S2,产生的结果包括S1和S2的所有属性列,并且S1中每条记录依次和S2中所有记录组合成一条记录,最终属性列为S1+S2属性列,记录数为S1*S2记录数;
- 投影:实际是按条件选择某关系模式中的某列,列也可以用数字表示;
- 选择:实际是按条件选择某关系模式中的某条记录。
- 自然连接的结果显示全部的属性列,但是相同属性列只显示一次,显示两个关系模式中属性相同且值相同的记录设有关系R、S如下左图所示,自然连接结果如下右图所示:
- 一般连接(连接)和等值连接:先做笛卡尔积,在其基础上满足连接条件,如下图分别是选取RS笛卡尔积后条件第C行小于第E的数据,R的第B行等于S的第B行数据
- 全外连接(FULLOUTERJOIN):关系RS进行自然连接时,把舍弃的元组也保存在结果关系中,在其他表的属性上填NULL。
- 左外连接(LEFTOUTERJOIN):关系RS进行自然连接时,只把左边关系R中要舍弃的元组保留。
- 右外连接:关系RS进行自然连接时,只把右边关系S中要舍弃的元组保留
7.3 元组演算与域演算
把数理逻辑的谓词演算引入到关系运算中,就可得到以关系演算为基础的运算关系演算又可分为:
● 元组关系演算(元组演算):以元组为变量
● 域关系演算(域演算):以属性(域)为变量
7.4 查询优化
【选择操作的实现】
- 查询方法:
简单的全表扫描方法:对查询的基本表顺序扫描,逐一检查每个元组是否满足选择条件,把满足条件的元组作为结果输出。
对于小表,这种方法简单有效;对于大表,顺序扫描十分费时,效率低。 - 优化方法:索引(或散列)扫描方法:如果选择条件中的属性上有索引(如hash索引),用索引扫描法通过索引先找到满足条件的元组主键或元组指针,再通过元组指针直接在查询的基本表中找到元组。
【连接操作的实现】
连接操作是查询处理中最耗时的操作之一。
- 查询方法:
嵌套循环方法:对外层循环R的每一个元组,检索内层循环S中的每一个元组,并检查这两个元组在连接属性sno上是否相等,如果满足连接条件,则串接后作为结果输出,直到双重循环结束。 - 优化方法:
排序-合并方法:适合连接的各表已经有序的情况,步骤为:
(1)先给各表排序;
(2)取R表中第一个sno,依次扫描S表中具有相同sno的元组把它们连接起来;
(3)当扫描到sno不相同的第一个元组时,返回到R表扫描其下一个元组,再用其下一个元组去S表中查找相同sno的元组,重复这个过程。 - 查询优化的目标:选择有效策略,求得给定关系表达式的值,使得查询代价最小。
- 优化准则:
(1)提早执行选择运算,目的是减少中间结果
(2)合并乘积与选择运算为连接运算,目的是避免扫描大的关系
(3)将投影运算与其他运算同时进行,目的是避免重复扫描关系
(4)将投影运算与二目运算结合起来,目的是减少扫描关系的次数
(5)在执行连接前对关系适当的预处理,如索引连接法、排序合并法存储公共子表达式,目的是只需检索中间结果,不需重复计算。 - 效率问题
关系代数运算的效率,归根结底是看参与运算的两张表格的属性列数和记录数属性列和记录数越少,参与运算的次数自然越少,效率就越高。
7.5 关系数据库设计
- 给定一个X,能唯一确定一个Y,就称X确定Y,或者说Y依赖于x,例如Y=X*X函数。
- 函数依赖又可扩展以下两种规则:
(1)部分函数依赖:A可确定C,(A,B)也可确定C,(A,B)中的一部分 (即A) 可以确定C,称为部分函数依赖。
(2)传递函数依赖:当A和B不等价时,A可确定B,B可确定C,则A可确定C,是传递函数依赖;若A和B等价,则不存在传递,直接就可确定C。
- 函数依赖的公理系统(Armstrong)设关系模式R<U,F>U是关系模式R的属性全集,F是关系模式R的一个函数依赖集。对于R<U,F>来说有以下的:
【几个比较重要的概念】
- 超键:能唯一标识此表的属性的组合;
- 侯选键:超键中去掉冗余的属性,剩余的属性就是候选键;
- 主键:任选一个候选键,即可作为主键;
- 外键:其他表中的主键;
- 主属性:候选键内的属性为主属性,其他属性为非主属性;
- 实体完整性约束:即主键约束,主键值不能为空,也不能重复;
- 参照完整性约束:即外键约束,外键必须是其他表中已经存在的主键的值或者为空;
- 用户自定义完整性约束:自定义表达式约束,如设定年龄属性的值必须在0到150之间。
【第一范式1NF】
● 关系中的每一个分量必须是一个不可分的数据项。通俗地说,第一范式就是表中不允许有小表的存在。比如,对于如下的员工表,就不属于第一范式:
实例:用一个单一的关系模式学生来描述学校的教务系统学生(学号,学生姓名,系号,系主任姓名课程号,成绩)依赖关系(学号->学生姓名,学号->系号,系号->系主任姓名,学号->课程号,(学号,课程号) ->成绩)
【第二范式】
● 如果关系R属于1NF,且每一个非主属性完全函数依赖于任何一个候选码,则R属于2NF。通俗地说,2NF就是在1NF的基础上,表中的每一个非主属性不会依赖复合主键中的某一个列。按照定义,上面的学生表就不满足2NF,因为学号不能完全确定课程号和成绩(每个学生可以选多门课)。
将学生表分解为:
● 学生(学号,学生姓名,系编号,系名,系主任)
● 选课(学号,课程号,成绩)
● 每张表均属于2NF。
第二范式消除了非主属性对主属性的部分函数依赖
【第三范式】
● 在满足1NF的基础上,表中不存在非主属性对码的传递依赖;
继续上面的实例,学生关系模式就不属于3NF,因为学生无法直接决定系主任和系名,是由学号->系编号,再由系编号->系主任,系编号->系名,因此存在非主属性对主属性的传递依赖
将学生表进一步分解为:
学生(学号,学生姓名,系编号)
系(系编号,系名,系主任)
选课(学号,课程号,成绩)
每张表都属于3NF。
【BC范式BCNF】
是指在第三范式的基础上进一步消除主属性对于码的部分函数依赖和传递依赖。通俗的来说,就是在每一种情况下,每一个依赖的左边决定因素都必然包含候选律,如下:
- 上图中,候选键有两种情况:组合键(S,T)或者(S,J),依赖集为(SJ-T,T一可知,STJ三个属性都是主属性,因此其达到了3NF(无非主属性),然而,第二种情况,即(SJ)为候选键的时候,对于依赖T->J,T在这种情况不是候选键,即T-J的决定因素不包含任意候选码,因此上图不是BCNF。
- 要使上图关系模式转换为BCNF也很简单,只需要将依赖T->J变为TS->J即可这样其左边决定因素就包含了候选键之一S
7.6 模式分解
-
范式之间的转换一般都是通过拆分属性,即模式分解,将具有部分函数依赖和传递依赖的属性分离出来,来达到一步步优化,一般分为以下两种:
(1)保持函数依赖分解对于关系模式R,有依赖集F,若对R进行分解,分解出来的多个关系模式,保持原来的依赖集不变,则为保持函数依赖的分解。另外,注意要消除掉冗余依赖(如传递依赖)
● 实例:设原关系模式R(A,B,C),依赖集F(A->B,B-C,A-C),将其分解为两个关系模式R1(A,B)和R2(B,C),此时R1中保持依赖A->B,R2保持依赖B->C,说明分解后的R1和R2是保持函数依赖的分解,因为A->C这个函数依赖实际是一个几余依赖,可以由前两个依赖传递得到,因此不需要管。 -
无损分解:分解后的关系模式能够还原出原关系模式,就是无损分解,不能还原就是有损。
-
当分解为两个关系模式,可以通过以下定理判断是否无损分解定理:如果R的分解为p=R1,R2),F为R所满足的函数依赖集合,分解p具有无损连接性的充分必要条件是R1nR2->(R1-R2)或者R1nR2->(R2-R1)。
-
当分解为三个及以上关系模式时,可以通过表格法求解,如下
【软考数据库】第一章 计算机系统基础知识
【软考数据库】第二章 程序语言基础知识
【软考数据库】第三章 数据结构与算法
【软考数据库】第四章 操作系统知识
【软考数据库】第五章 计算机网络
【软考数据库】第六章 数据库技术基础