MYSQL学习笔记(个人)(第十五天)
自学《数据库系统原理与应用》——— 黄宝贵、马春梅、禹继国 —— 清华大学出版社
关系规范化理论:
关系规范化的作用:
为了设计一个合理、可靠、简单、正确的关系数据库,形成了关系规范化理论。其包括两个方面的内容:1.数据依赖,研究属性之间的依赖关系;2.范式,是关系模式符合某种级别的标准。
1.问题的提出:
下面有个关系模式:
SCD(sno, sname, dname, office, cno, cname, score)
其中按照现实需求和实际应用,可得语义:
(1)一个学院有多名学生,一名学生只能属于一个学院。
(2)一个学院只有一处办公地点一处办公地点只能被一个学院使用。
(3)一名学生可以选修多门课程,一门课程可以被多名学生选修。
(4)每名学生选修每门课程都有一个成绩。
在SCD关系模式中填人部分数据,可得到该关系模式的具体实例,如表所示:
sno | sname | dname | office | cno | canme | score |
S1 | 舟舟 | 计算机学院 | C101 | C1 | 计算机基础 | 90 |
S1 | 舟舟 | 计算机学院 | C101 | C2 | 数据库 | 98 |
S3 | 断弦 | 计算机学院 | C101 | C2 | 数据库 | 85 |
S3 | 断弦 | 网络学院 | F301 | C3 | 程序设计 | 92 |
S3 | 断弦 | 网络学院 | F301 | C1 | 计算机基础 | 79 |
S5 | 小维 | 软件学院 | S201 | C1 | 计算机基础 | 64 |
S5 | 小维 | 软件学院 | S201 | C3 | 程序设计 | 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)
dname | office |
---|---|
计算机学院 | C101 |
网络学院 | F301 |
软件学院 | S201 |
sno | sname | sdept |
---|---|---|
S1 | 舟舟 | 计算机学院 |
S3 | 断弦 | 网络学院 |
S5 | 小维 | 软件学院 |
cno | cname |
---|---|
C1 | 计算机基础 |
C2 | 数据库 |
C3 | 程序设计 |
sno | cno | score |
---|---|---|
S1 | C1 | 90 |
S1 | C2 | 98 |
S3 | C2 | 85 |
S3 | C3 | 92 |
S3 | C1 | 79 |
S5 | C1 | 64 |
S5 | C3 | 92 |
函数依赖:
数据依赖是同一关系中属性间的相互依赖和相互制约,是语义的体现。
数据依赖有很多种,主要包括函数依赖(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,他们就是相互函数依赖,记作XY。
函数依赖的分类:
如果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表:
ID | Name | Address |
---|---|---|
1 | Alice | New York, Broadway Street |
2 | Bob | LA, Hollywood Boulevard |
1NF表:
ID | Name | City | Street |
---|---|---|---|
1 | Alice | New York | Broadway Street |
2 | Bob | LA | Hollywood Boulevard |
2NF(第二范式)
定义:在满足1NF的基础上,所有非主属性完全依赖于整个主键,而不仅仅是主键的一部分。
判断方法:
主键为单列时,表已经满足2NF。
主键为多列时,所有非主属性必须依赖于整个主键,而不是主键的某一部分。
非2NF表:
OrderID | ProductID | ProductName | Quantity | OrderDate |
---|---|---|---|---|
1 | 101 | Laptop | 2 | 2023-10-01 |
2 | 102 | Phone | 1 | 2023-10-02 |
2NF表:
OrderID | ProductID | Quantity |
---|---|---|
1 | 101 | 2 |
2 | 102 | 1 |
3 | 101 | 1 |
ProductID | ProductName |
---|---|
101 | Laptop |
102 | Phone |
3NF(第三范式)
定义:在满足2NF的基础上,所有非主属性不依赖于其他非主属性,只依赖于主键。
判断方法:
需要检查表中的非主属性,确保它们之间没有依赖关系。
如果存在传递依赖,则需要分解表。
非3NF表:
StudentID | StudentName | Department | DepartmentHead |
---|---|---|---|
1 | Alice | CS | Prof. Smith |
2 | Bob | EE | Prof. Jones |
3NF表:
StudentID | StudentName | Department |
---|---|---|
1 | Alice | CS |
2 | Bob | EE |
Department | DepartmentHead |
---|---|
CS | Prof. Smith |
EE | Prof. Jones |
BCNF(Boyce-Codd范式)
定义:BCNF是比3NF更严格的范式,要求所有非平凡函数依赖的决定因素必须是候选键。
判断方法:
检查表中的所有非平凡函数依赖,确保决定因素是候选键。
如果表中有非候选键的属性依赖于其他非候选键,则表不符合BCNF。
非BCNF表:
CourseID | TeacherID | TeacherName |
---|---|---|
101 | T1 | Alice |
102 | T2 | Bob |
BCNF表:
CourseID | TeacherID |
---|---|
101 | T1 |
102 | T2 |
TeacherID | TeacherName |
---|---|
T1 | Alice |
T2 | Bob |
4NF(第四范式)
定义:在满足BCNF的基础上,要求表中不存在多值依赖,即某些列值之间不存在多种独立选择关系。
判断方法:
检查表中是否存在多值依赖,如果存在,则分解表以消除多值依赖。
非4NF表:
EmployeeID | Skill1 | Skill2 |
---|---|---|
1 | Java | Python |
2 | C++ | Ruby |
4NF表:
EmployeeID | Skill |
---|---|
1 | Java |
1 | Python |
2 | C++ |
2 | Ruby |
多值依赖
定义:多值依赖描述了表中某些列值之间的特殊关系,当一个列的值与另一些列的值之间存在多种独立选择时,就存在多值依赖。
数学表达:如果对于每个A的值,B有多个独立的值,那么称A多值依赖于B,记作A →→ B。
具有多值依赖的表:
StudentID | CourseID | BookID |
---|---|---|
1 | 101 | B1 |
1 | 102 | B2 |
1 | 103 | B3 |
2 | 101 | B1 |
2 | 102 | B2 |
分解后的表:
StudentID | CourseID |
---|---|
1 | 101 |
1 | 102 |
1 | 103 |
2 | 101 |
2 | 102 |
CourseID | BookID |
---|---|
101 | B1 |
102 | B2 |
103 | B3 |