一、概述
1.数据依赖的主要类型
(1)函数依赖
Sname=f(Sno)
即Sno函数决定了Sname
(2)多值依赖
二、规范化
1.函数依赖
(1)平凡函数依赖和非平凡函数依赖
- X→Y,但Y⊈X则称X→Y是非平凡的函数依赖。
- X→Y,但Y⊆X 则称X→Y是平凡的函数依赖。
(2)完全函数依赖和部分函数依赖
- 在R(U)中,如果X→Y,并且对于X的任何一个真子集X’, 都有 X’ ↛ Y, 则称Y对X完全函数依赖,记作X → Y。
- 若X→Y,但Y不完全函数依赖于X,则称Y对X部分函数依赖,记作X → Y
(3)传递函数依赖
2.码
(1)候选码
能唯一表示每一行数据,候选码是最小的超码
3.范式
(1)第一范式(1NF)
定义:一个关系满足第一范式(1NF),意味着关系中的每一列(属性)的值都是原子的,即不能再分解成更小的部分。每个字段都必须包含单一的、不可分的值。
要求:
- 表格中的每一列必须包含原子值(不可分割的基本数据项)。
- 每一列中的数据类型必须是单一的。
- 每一列中的数据值必须是唯一的,且每个值不可再分解。
(2)第二范式(2NF)
定义:一个关系满足第二范式(2NF),需要首先满足第一范式(1NF),并且所有非主属性必须完全依赖于每一个候选键,不能只依赖于主键的部分属性。
要求:
- 满足第一范式(1NF)。
- 消除部分依赖:如果一个表有复合主键(即主键由多个属性组成),那么表中的非主属性必须依赖于复合主键的全部属性,而不是主键的一部分
示例:
假设有一个学生-课程成绩表,主键是 (StudentID, Course)
,即每个学生在每门课程上的成绩唯一。
StudentID | Course | Instructor | Grade |
---|---|---|---|
1 | Math | Dr. Smith | A |
1 | English | Dr. Johnson | B |
2 | Math | Dr. Smith | B |
2 | English | Dr. Johnson | A |
在这个表格中,StudentID
和 Course
组合起来是主键。Instructor
依赖于 Course
,而不依赖于整个复合主键 (StudentID, Course)
,因此 Instructor
是部分依赖的。
修正后的表格(符合2NF):
- 学生成绩表:
StudentID | Course | Grade |
---|---|---|
1 | Math | A |
1 | English | B |
2 | Math | B |
2 | English | A |
- 课程信息表:
Course | Instructor |
---|---|
Math | Dr. Smith |
English | Dr. Johnson |
通过拆分表格,Instructor
现在不再依赖于复合主键的一部分,符合第二范式。
(3)第三范式(3NF)
定义:一个关系满足第三范式(3NF),需要首先满足第二范式(2NF),并且消除所有的传递依赖,即非主属性不应依赖于其他非主属性。
要求:
- 满足第二范式(2NF)。
- 消除传递依赖:非主属性不应依赖于其他非主属性。
示例:
假设有一个学生-课程-成绩表,其中学生的邮箱依赖于学生的ID,而成绩依赖于学生和课程组合。
StudentID | Course | Grade | StudentEmail |
---|---|---|---|
1 | Math | A | alice@email.com |
1 | English | B | alice@email.com |
2 | Math | B | bob@email.com |
在这个表格中,StudentEmail
依赖于 StudentID
,而 Grade
依赖于 (StudentID, Course)
。因此,StudentEmail
通过 StudentID
传递依赖于 Grade
。
修正后的表格(符合3NF):
- 学生信息表:
StudentID | StudentEmail |
---|---|
1 | alice@email.com |
2 | bob@email.com |
- 学生成绩表:
StudentID | Course | Grade |
---|---|---|
1 | Math | A |
1 | English | B |
2 | Math | B |
通过拆分表格,消除了 StudentEmail
依赖于非主属性的问题,符合第三范式。
(4)BC范式(BCNF)
定义:一个关系满足 BCNF,需要满足第三范式(3NF),并且每个决定因子(determinant)都是候选键。
要求:
- 满足第三范式(3NF)。
- 每个决定因子都是候选键:在BCNF中,所有非主属性的依赖关系必须由候选键来决定。
示例:
假设有一个包含学生课程和讲师的表格,主键是 (StudentID, Course)
,但 Instructor
依赖于 Course
。
StudentID | Course | Instructor |
---|---|---|
1 | Math | Dr. Smith |
1 | English | Dr. Johnson |
2 | Math | Dr. Smith |
在这个表格中,Course
决定了 Instructor
,但 Course
并不是候选键。因此,该表不符合 BCNF。
修正后的表格(符合BCNF):
- 学生成绩表:
StudentID | Course |
---|---|
1 | Math |
1 | English |
2 | Math |
- 课程信息表:
Course | Instructor |
---|---|
Math | Dr. Smith |
English | Dr. Johnson |
通过拆分表格,我们确保了 Instructor
只依赖于候选键,符合BCNF。
(5)第四范式(4NF)
定义:一个关系满足第四范式(4NF),需要满足BCNF,并且消除多值依赖,即一个属性集的值依赖于关系的多个属性集,而非一个单一的属性。
要求:
- 满足BCNF。
- 消除多值依赖:一个表中的非主属性不应依赖于多个候选属性集的组合。
示例:
假设有一个学生-课程-兴趣表格,其中学生可以有多个课程和多个兴趣爱好。
StudentID | Course | Interest |
---|---|---|
1 | Math | Football |
1 | English | Music |
1 | History | Football |
2 | Physics | Music |
在这个表格中,StudentID
确定了学生的 Course
和 Interest
,但 Interest
和 Course
是多值依赖的。
修正后的表格(符合4NF):
- 学生课程表:
StudentID | Course |
---|---|
1 | Math |
1 | English |
1 | History |
2 | Physics |
- 学生兴趣表:
StudentID | Interest |
---|---|
1 | Football |
1 | Music |
2 | Music |
通过拆分表格,消除了多值依赖,符合第四范式。
(6)第五范式(5NF)
定义:一个关系满足第五范式(5NF),需要满足第四范式(4NF),并且消除连接依赖,即一个表格中某些属性的值依赖于其他属性的组合。
要求:
- 满足第四范式(4NF)。
- 消除连接依赖:只有当表中的数据被完全分解时,才满足第五范式。
示例:
假设有一个学生-课程-教材表格,其中每个学生可能在不同的课程中使用不同的教材。
StudentID | Course | Textbook |
---|---|---|
1 | Math | MathBook |
1 | English | EnglishBook |
2 | Math | MathBook |
2 | English | EnglishBook |
该表存在连接依赖,因为学生、课程和教材之间的组合是冗余的。
修正后的表格(符合5NF):
- 学生课程表:
StudentID | Course |
---|---|
1 | Math |
1 | English |
2 | Math |
2 | English |
- 课程教材表:
Course | Textbook |
---|---|
Math | MathBook |
English | EnglishBook |
- 学生教材表:
StudentID | Textbook |
---|---|
1 | MathBook |
1 | EnglishBook |
2 | MathBook |
2 | EnglishBook |
通过拆分表格,消除了连接依赖,符合第五范式。
总结
- 1NF: 关系中的属性值必须是原子的。
- 2NF: 满足1NF,并且消除部分依赖。
- 3NF: 满足2NF,并且消除传递依赖。
- BCNF: 满足3NF,并且每个决定因子都是候选键。
- 4NF: 满足BCNF,并且消除多值依赖。
- 5NF: 满足4NF,并且消除连接依赖。
各种范式之间的关系
三、数据依赖的公理系统