1NF
关系中的每个属性不可再分。
比如这张表有这些属性:
id | 姓名 | 年级 | 疫情打卡 | ||
时间 | 次数 | 连续次数 |
因上面签到可再分,不满足第一范式,可优化成:
id | 姓名 | 年级 | 打卡时间 | 打卡次数 | 打卡连续次数 |
---|---|---|---|---|---|
该表满足1NF。
1NF问题
数据冗余、增删改异常。
eg:
id | 姓名 | 院系 | 辅导员 | 课程 | 课程分数 |
---|---|---|---|---|---|
2017210575 | 小明 | 软件工程 | 老王 | 高数 | 70 |
2017210575 | 小明 | 软件工程 | 老王 | 英语 | 71 |
2017210576 | 小红 | 通信工程 | 老张 | 高数 | 80 |
2017210576 | 小红 | 通信工程 | 老张 | 英语 | 81 |
- 该表其实只改了课程和课程分数,
id 姓名 院系 辅导员
数据冗余 - 若学生(比如小明)毕业,删数据有问题,可能变成此表,主键不为空就报错删不了
id | 姓名 | 院系 | 辅导员 | 课程 | 课程分数 |
---|---|---|---|---|---|
软件工程 | 老王 | ||||
软件工程 | 老王 | ||||
2017210576 | 小红 | 通信工程 | 老张 | 高数 | 80 |
2017210576 | 小红 | 通信工程 | 老张 | 英语 | 81 |
-
若增数据(比如增加院系),院系没人(主键为空),增加时会报错。
-
若改数据(比如转系),要改好几个数据。
2NF
1NF基础上消除非主属性对码的部分函数依赖。
eg:
学生表:
sid | 姓名 | 院系 | 辅导员 |
---|---|---|---|
课程表:
cid | 课程名 | 课程分数 |
---|---|---|
解决
相对1NF,解决了数据冗余、更改异常
2NF问题
学生表
插入院系,主键还是空的
id | 姓名 | 院系 | 辅导员 | 课程 | 课程分数 |
---|---|---|---|---|---|
搬砖系 |
删除这个系(搬砖系只有1人),院系依赖那个人,所以这个院系就没了。
id | 姓名 | 院系 | 辅导员 | 课程 | 课程分数 |
---|---|---|---|---|---|
2017211444 | 小刚 | 搬砖系 | 老刚 | 搬砖 | 90 |
3NF
2NF基础上消除非主属性对码的传递函数依赖。
eg:
学生表:
学生id | 姓名 | 院系 |
---|---|---|
院系表:
院系 | 系主任 |
---|---|
课程表:
学生id | 课程名 | 课程分数 |
---|---|---|
解决
相对于2NF,解决了插入、删除(变成空表)
说明
名称 | 解释 | eg |
---|---|---|
码 | 一个表中,可以唯一决定一 个元组的属性“集合”。 | id-----姓名,系名,辅导员 课----分数 (id,课名)这个属性组就叫做码。 |
函数依赖 | 在数据表中,在属性X确定的情况下,必定能确定Y的值,那就说明Y函数依赖于X,写作X→Y。 | 学号----系名 学号----系主任 (学号,课名)—成绩 |
完全函数依赖 | 在一张表中,若X→Y,且对于X的任何一个真子集(假如属性组X包含超过一个属性的话), X’→Y不成立,那么我们称Y对于X完全函数依赖,记作XF→Y。 | (学号,课名)—成绩 成绩依赖学号和课名 |
部分函数依赖 | 如果Y函数依赖于X,但是Y不完全函数依赖于X,那就叫做部分函数依赖。 | (学号,课名)—姓名 姓名依赖于学号,不依赖课名 |
传递函数依赖 | 如果Y依赖于X,Z又依赖于Y,那就说Z依赖于X。 | ∵学号—院系 院系—系主任 ∴学号—院系,系主任 系名依赖于学号,系主任依赖于系名,那么系主任传递函数依赖于学号。不满足3NF |