数据库范式
第一范式(1NF)
第一范式要求每个属性都不可再分
| 编号 | 歌曲 | 歌手 |
|---|---|---|
| 1 | 刀马旦 | 李玟,周杰伦 |
上例中,歌手属性可再分,修改为:
| 编号 | 歌曲 | 歌手 |
|---|---|---|
| 1 | 刀马旦 | 李玟 |
| 1 | 刀马旦 | 周杰伦 |
符合第一范式的关系示例:
| 学号 | 姓名 | 学院编号 | 学院名称 | 课程号 | 成绩 |
|---|---|---|---|---|---|
| 1001 | 王芳 | D20 | 经济学院 | C001 | 34 |
| 1001 | 王芳 | D20 | 经济学院 | C002 | 54 |
| 1001 | 王芳 | D20 | 经济学院 | C003 | 67 |
| 1002 | 李明 | D12 | 计算机学院 | C001 | 23 |
| 1002 | 李明 | D12 | 计算机学院 | C002 | 43 |
| 1003 | 赵晗 | D12 | 计算机学院 | C002 | 56 |
| 1003 | 赵晗 | D12 | 计算机学院 | C003 | 65 |
| 1004 | 刘晓 | D25 | 管理学院 | C002 | 23 |
第一范式仍存在以下问题:
- 数据冗余
- 更新异常,修改操作的不一致性(其实也是因为冗余度大造成的)
- 插入异常,比如要操作的数据中,部分主属性只能取 null,这时将无法插入
- 删除异常,删除某一信息时,可能将不该删除的信息也删除了,比如如果院系没有单独的表,而是跟教师放在一个表中,那么当教师删除时,也会将院系删除,如果院系下的教师都删除了,院系也就不存在了,但院系本是不应该被删除的
上例中虽然符合第一范式,但存在冗余的 “学号-姓名” 关系。
第二范式(2NF)
消除非主属性对码(主属性)的部分函数依赖
| 学号 | 姓名 | 课程号 | 成绩 |
|---|---|---|---|
| 1 | 张三 | C001 | 77 |
| 1 | 张三 | C002 | 88 |
| 2 | 李四 | C003 | 67 |
上例中,姓名对主码是部分函数依赖(姓名只依赖于学号),造成的问题是:
- 冗余,张三出现多次
- 插入异常,不能插入没有课程号的学生
- 删除异常,此表不能删除李四的课程,否则李四的信息也被删除(学号-姓名)
修改为:
| 学号 | 姓名 |
|---|---|
| 1 | 张三 |
| 2 | 李四 |
| 学号 | 课程号 | 成绩 |
|---|---|---|
| 1 | C001 | 77 |
| 1 | C002 | 88 |
| 2 | C003 | 67 |
第三范式(3NF)
消除非主属性对码的传递函数依赖
| 学号 | 姓名 | 学院编号 | 学院名称 |
|---|---|---|---|
| 1 | 张三 | D10 | 经济学院 |
| 2 | 李四 | D10 | 经济学院 |
上例中,学院名称对主码是传递函数依赖(学号 -> 学院编号 -> 学院名称),可以发现,学院编号与学院名称仍然存在数据冗余的问题。修改为:
| 学号 | 姓名 | 学院编号 |
|---|---|---|
| 1 | 张三 | D10 |
| 2 | 李四 | D10 |
| 学院编号 | 学院名称 |
|---|---|
| D10 | 经济学院 |
| D11 | 计算机学院 |
巴科斯范式(BCNF)
消除主属性对码的部分函数依赖和传递函数依赖
- 所有非主属性对每一个码都是完全函数依赖
- 所有主属性对每一个不包含它的码,也是完全函数依赖
- 没有任何属性完全函数依赖于非码的任何一组属性
| 学号 | 身份证号 | 课程 | 分数 |
|---|---|---|---|
| A001 | 445111 | 语文 | 24 |
| A001 | 445111 | 数学 | 235 |
| A002 | 445112 | 英语 | 64 |
在这个表中,学号与身份证号是一一对应的,所以每出现一次学号,就要出现一次身份证号。原因在于,表中有两个候选码:即 {学号, 课程} 和 {身份证号, 课程},然而主属性 "身份证号" 与主码 {学号, 课程} 存在部分函数依赖,同样的,主属性 "学号" 与主码 {身份证号, 课程} 也存在部分函数依赖
在满足BCNF的关系中,部分函数依赖和传递函数依赖是完全不存在的。因此从函数依赖的角度来说,BCNF就是规范化程度最高的关系模式!
在工程实践中,传统的信息系统数据库设计会要求满足3NF,而且我们习惯于用自增序列或 UUID 去生成单一的主键,因此我们设计的数据库一般都是符合 BCNF的。
第四范式(4NF)
属性间不允许有非平凡且非函数依赖的多值依赖
| ISBN | 书名 | 作者 | 排名 | 出版社 |
|---|---|---|---|---|
| 123 | 数据库概论 | 张三 | 1 | 科学出版社 |
| 123 | 数据库概论 | 李四 | 2 | 科学出版社 |
| 123 | 数据库概论 | 王五 | 3 | 科学出版社 |
多值依赖即属性之间的一对多关系,记为K→→A
函数依赖事实上是单值依赖,所以不能表达属性值之间的一对多关系。
- 平凡的多值依赖:全集 U=K+A,一个 K 可以对应于多个 A,即 K→→A。此时整个表就是一组一对多关系。
- 非平凡的多值依赖:全集 U=K+A+B,一个 K 可以对应于多个 A,也可以对应于多个 B,A 与 B 互相独立,即K→→A,K→→B。整个表有多组一对多关系,且有:“一”部分是相同的属性集合,“多”部分是互相独立的属性集合。
第四范式即在满足巴斯-科德范式(BCNF)的基础上,消除非平凡且非函数依赖的多值依赖(即把同一表内的多对多关系删除)。
修改为:
书目1 ∈ BCNF
| ISBN | 书名 | 出版社 |
|---|---|---|
| 123 | 数据库概论 | 科学出版社 |
书目2 ∈ 4NF
| ISBN | 作者 | 排名 |
|---|---|---|
| 123 | 张三 | 1 |
| 123 | 李四 | 2 |
| 123 | 王五 | 3 |
如果只考虑函数依赖,关系模式规范化程度最高的范式是 BCNF;如果考虑多值依赖则是 4NF。对于没有多值依赖的关系,最高也就只到 BCNF。没有多值依赖的关系,4NF 也无从说起。
第五范式(5NF)
即在满足第四范式(4NF)的基础上,消除不是由候选码所蕴含的连接依赖。如果关系模式 R 中的每一个连接依赖均由 R 的候选码所隐含,则称此关系模式符合第五范式。 函数依赖是多值依赖的一种特殊的情况,而多值依赖实际上是连接依赖的一种特殊情况。但连接依赖不像函数依赖和多值依赖可以由语义直接导出,而是在关系连接运算时才反映出来。存在连接依赖的关系模式仍可能遇到数据冗余及插入、修改、删除异常等问题。
第五范式属于最终范式,消除了 4NF 中的连接依赖,第五范式需要满足以下要求:
- 必须满足第四范式
- 表必须可以分解为较小的表,除非那些表在逻辑上拥有与原始表相同的主键。