自学《数据库系统原理与应用》——— 黄宝贵、马春梅、禹继国 —— 清华大学出版社

关系规范化理论:

关系规范化的作用:

为了设计一个合理、可靠、简单、正确的关系数据库,形成了关系规范化理论。其包括两个方面的内容:1.资料依赖,研究属性之间的依赖关系;2.范式,是关系模式符合某种级别的标准。

1.问题的提出:

下面有个关系模式:
SCD(sno, sname, dname, office, cno, cname, score)

其中按照现实需求和实际应用,可得语义:
(1)一个学院有多名学生,一名学生只能属于一个学院。
(2)一个学院只有一处办公地点一处办公地点只能被一个学院使用。
(3)一名学生可以选修多门课程,一门课程行被多名学生选修。
(4)每名学生选修每门课程都有一个成绩。
在SCD关系模式中填人部分数据,可得到该关系模式的具体实例,如表所示:

snosnamednameofficecnocanmescore
S1舟舟计算机学院C101C1计算机基础90
S1舟舟计算机学院C101C2数据库98
S3断弦计算机学院C101C2数据库85
S3断弦网络学院F301C3程序设计92
S3断弦网络学院F301C1计算机基础79
S5小维软件学院S201C1计算机基础64
S5小维软件学院S201C3程序设计92

在该数据库当中存在异常,分为为:

1.数据亢余:

数据冗余就是某种信息在关系中重复存储多次。
在SCD关系中,学生的学号sno和姓名sname重复存储,其重复的次数等于该生选修的课程门数;课程号cno和课程名称cname重复存储,其重复的次数等于选修该门课程的学生的人数等等。

2.插入异常:

插人异常一般是指该插人的记录插不进去。
在SCD关系中,如果某个学生没有选修课程,那么该学生的信息就插不进去,如果某门课程没有被学生选修,该课程信息也插不进去。如果有新成立的学院,但是该学院没有学生,或是有学生但学生都没有选课那么该学院的信息也都插不进去。

3.删除异常:

删除异常是指不该删除的记录被删除。
在SCD关系中,要是某名学生只选修了一门课程,由于某种原因,该生连这门课程也不选修了,那么当删除该生的选修记录时,就会把该生的记录也删除。同理,倘若某门课程只被一名学生选修,由于某种原因,该生不再选修这门课程,那么在删除该选修记录的同时就会把这门课的课程记录也删除。

4.更新异常:

更新异常是指由于更新不完全而导致材料不一-致。
在SCD关系中,倘若更换某学院的办公地点那么该院有多少学生,修了多少门课,都要修改。如果漏掉了其中一条记承.就会出现该学院有两处办公地点的情况,和语义不相符,导致数据不一致。

2.问题的原因:

关系模式产生异常是因为它“包罗万象”,包含大量的属性,导致信息亢余。

3.难题的解决:

对上述关系模式进行分解,使每一一个关系模式表达的概念单一,属性间的数据依赖关系单纯化,从而消除这些异常。例如,SCD关系模式可以分解为以下四个关系模式:
PDepartment( dname ,office)
PStudent(sno, sname,dname)
PCourse( cno,cname)
SC(sno,cno,score)

PDepartment
dnameoffice
计算机学院C101
网络学院F301
软件学院S201
PStudent
snosnamesdept
S1舟舟计算机学院
S3断弦网络学院
S5小维软件学院
PCourse
cnocname
C1计算机基础
C2数据库
C3程序设计
PSC
snocnoscore
S1C190
S1C298
S3C285
S3C392
S3C179
S5C164
S5C392

函数依赖:

资料依赖是同一关系中属性间的相互依赖和相互制约,是语义的体现。
资料依赖有很多种,主要包括函数依赖(Functional Dependency, FD)、多值依赖(Multivalued Dependency ,MVD)和连接依赖(Join Dependency,JD)。

函数依赖的定义:

设R(U)是属性集U 上的关系模式,X、Y是∪的子集。若对于R(U)的任意一个可能的关系r,对于x的每一个具体的值,Y都有唯一的值与之对应 。则称x丽数确定Y或Y函数依赖于X,记作X->Y。
X称为函数依赖的决定因素,Y称为依赖因素。
在关系模式SCD中,对于每个学号sno的值,都有唯-的姓名sname 与之相对应,即当知道某个学生的学号时,就一定能唯一确定该生的姓名。因此,称sno丽数确定sname,或者称sname函数依赖于sno,记作sno->sname,其中sno是决定因素,sname是依赖因素。
(st:类似数学里函数的概念)

要是一个X,无唯一确定Y的话,就是Y不函数依赖于X,记作X-/->Y。若X->Y,同时Y->X,他们就是相互函数依赖,记作X\leftrightarrowY。

函数依赖的分类:

如果X->Y,同时Y是X的真子集,称X->Y是平凡的函数依赖,如果不是真子集,就是非平凡的函数依赖。

若是对于X的任何一个真子集X`,都有X`-/->Y,则称Y完全函数依赖与X,若存在X`->Y,则称Y部分函数依赖X。

若X->Y,Y不是X的真子集,且Y-/->X,Y->Z,则称Z传递函数依赖与X,记作-T->Z。

函数依赖的推理规则:

Armstrong公理环境:
设X、Y和Z是R(U)上的属性集,Armstrong公理系统有以下三条基础公理:
A1(自反性):假如Y ⊆ X,则X → Y。
A2(增广性):如果X → Y且Z ⊆ U,则XZ → YZ。
A3(传递性):倘若X → Y且Y → Z,则X → Z。

Armstrong公理系统的推论:
B1(合并性):如果X → YZ且X → Z,则X → YZ。
B2(分解性):假设X → Y且X → Z,则X → YZ。
B3(结合性):假如X → Y且W → Z,则XW → YZ。
B4(伪传递性):如果X → Y且WY → Z,则XW → Z。

关系的规范化:

规范化:

一个关系模式符合的范式级别越低,越容易出现异常现象,所以关系规范化重点在把多于一个概念的关系”分离“,形成多个关系。

范式:

衡量关系模式规范化程度的标准,分为1NF,2NF,3NF,BCNF,4ND,5NF。就是范式是符合某一种级别的关系模式的集合,

1NF(第一范式)

定义不可再分的原子数据项,不能有嵌套的集合、数组或结构体等复杂数据类型。就是:数据库表的每一列都
判断方法
每一列的数据必须是单一值,不能是复合值。
例如,地址列应该包括具体的“城市”、“街道”、“门牌号”等单个字段,而不是一个包括所有地址信息的字符串。

非1NF表

IDNameAddress
1AliceNew York, Broadway Street
2BobLA, Hollywood Boulevard

1NF表

IDNameCityStreet
1AliceNew YorkBroadway Street
2BobLAHollywood Boulevard

2NF(第二范式)

定义:在满足1NF的基础上,所有非主属性完全依赖于整个主键,而不仅仅是主键的一部分。
判断方法
主键为单列时,表已经满足2NF。
主键为多列时,所有非主属性必须依赖于整个主键,而不是主键的某一部分。

非2NF表

OrderIDProductIDProductNameQuantityOrderDate
1101Laptop22023-10-01
2102Phone12023-10-02

2NF表

OrderIDProductIDQuantity
11012
21021
31011
ProductIDProductName
101Laptop
102Phone

3NF(第三范式)

定义:在满足2NF的基础上,所有非主属性不依赖于其他非主属性,只依赖于主键。
判断方法
需要检查表中的非主属性,确保它们之间没有依赖关系。
如果存在传递依赖,则需要分解表。

非3NF表

StudentIDStudentNameDepartmentDepartmentHead
1AliceCSProf. Smith
2BobEEProf. Jones

3NF表

StudentIDStudentNameDepartment
1AliceCS
2BobEE
DepartmentDepartmentHead
CSProf. Smith
EEProf. Jones

BCNF(Boyce-Codd范式)

定义:BCNF是比3NF更严格的范式,要求所有非平凡函数依赖的决定因素必须是候选键。
判断方法
检查表中的所有非平凡函数依赖,确保决定因素是候选键。
假设表中有非候选键的属性依赖于其他非候选键,则表不符合BCNF。

非BCNF表

CourseIDTeacherIDTeacherName
101T1Alice
102T2Bob

BCNF表

CourseIDTeacherID
101T1
102T2
TeacherIDTeacherName
T1Alice
T2Bob

4NF(第四范式)

定义:在满足BCNF的基础上,要求表中不存在多值依赖,即某些列值之间不存在多种独立选择关系。
判断方法
否存在多值依赖,如果存在,则分解表以消除多值依赖。就是检查表中

非4NF表

EmployeeIDSkill1Skill2
1JavaPython
2C++Ruby

4NF表

EmployeeIDSkill
1Java
1Python
2C++
2Ruby

多值依赖

定义:多值依赖描述了表中某些列值之间的特殊关系,当一个列的值与另一些列的值之间存在多种独立选择时,就存在多值依赖。

数学表达:如果对于每个A的值,B有多个独立的值,那么称A多值依赖于B,记作A →→ B。

具有多值依赖的表

StudentIDCourseIDBookID
1101B1
1102B2
1103B3
2101B1
2102B2

分解后的表

StudentIDCourseID
1101
1102
1103
2101
2102
CourseIDBookID
101B1
102B2
103B3