详解数据库范式
范式
- 1. 第一范式(1NF)
- 2. 第二范式(2NF)
- 3. 第三范式(3NF)
- 4. BC范式(BCNF,Boyce-Codd Normal Form)
- 5. 第四范式(4NF)
- 6. 第五范式(5NF)
- 总结:
在数据库设计中, 范式(Normal Forms, NFs)是一种用于规范化数据库结构的理论,用以消除数据冗余、提高数据一致性,同时减少异常问题。范式的核心思想是将数据划分成更小、更独立的表,并通过关系(外键)进行连接。
1. 第一范式(1NF)
目标:确保每列的值是原子值。
-
要求:
- 数据库表中的每一列只包含单一值(原子性)。
- 不允许一列存储多个值(如数组、列表等),也不允许嵌套表。
-
示例:不符合1NF
学生ID 姓名 联系方式 1 张三 12345, 67890 2 李四 98765 上述表中“联系方式”列包含了多个值,因此不符合1NF。
-
改进(符合1NF)
学生ID 姓名 联系方式 1 张三 12345 1 张三 67890 2 李四 98765
2. 第二范式(2NF)
目标:消除非主属性对主键的部分依赖。
-
要求:
- 满足1NF。
- 表中的每一个非主属性必须完全依赖于主键,而不能只依赖于主键的一部分(解决部分依赖)。
-
示例:不符合2NF
学生ID 课程ID 课程名称 成绩 1 C001 数学 90 1 C002 英语 85 假设主键是(学生ID, 课程ID)的组合,“课程名称”只依赖于课程ID,而不是组合主键,因此违反2NF。
-
改进(分表,符合2NF)
-
课程表:
课程ID 课程名称 C001 数学 C002 英语 -
成绩表:
学生ID 课程ID 成绩 1 C001 90 1 C002 85
-
3. 第三范式(3NF)
目标:消除非主属性之间的传递依赖。
-
要求:
- 满足2NF。
- 非主属性之间不存在传递依赖(即非主属性不能依赖于另一个非主属性)。
-
示例:不符合3NF
学生ID 系ID 系名称 1 CS001 计算机系 2 EE002 电气工程系 在此表中,“系名称”依赖于“系ID”,“系ID”又依赖于主键“学生ID”,这是一种传递依赖。
-
改进(分表,符合3NF)
-
学生表:
学生ID 系ID 1 CS001 2 EE002 -
系表:
系ID 系名称 CS001 计算机系 EE002 电气工程系
-
4. BC范式(BCNF,Boyce-Codd Normal Form)
目标:消除主属性间的依赖关系。
-
要求:
- 满足3NF。
- 对于每一个函数依赖 X → Y X \to Y X→Y , X X X 必须是超键。(超键是一个或多个属性的组合,这些属性的值可以唯一地标识表中的每一行记录。换句话说,一个超键中的值是足够独特的,它能够用来区分表中的任意两条记录。)
-
示例:不符合BCNF
教师ID 课程名称 教室 T001 数学 R101 T002 英语 R102 假设(教师ID, 课程名称)为主键,“教室”依赖于“课程名称”,“课程名称”不是超键,因此违反BCNF。
-
改进(分表)
-
课程表:
课程名称 教室 数学 R101 英语 R102 -
教师课程表:
教师ID 课程名称 T001 数学 T002 英语
-
5. 第四范式(4NF)
目标:消除多值依赖。
-
要求:
- 满足BCNF。
- 表中不能存在非主属性的多值依赖。
-
示例:不符合4NF
学生ID 语言 爱好 1 英语 篮球 1 英语 足球 1 法语 篮球 1 法语 足球 上述表中,“语言”和“爱好”是独立的多值属性,存在多值依赖。
-
改进(分表)
-
学生语言表:
学生ID 语言 1 英语 1 法语 -
学生爱好表:
学生ID 爱好 1 篮球 1 足球
-
6. 第五范式(5NF)
目标:消除连接依赖。
- 要求:
- 满足4NF。
- 表中每一个关系都应该能够通过其更小的关系表连接复原(避免连接依赖)。
总结:
范式 | 目标 | 主要特点 |
---|---|---|
1NF | 消除重复组,保证每列值原子性。 | 每列只存储单一值。 |
2NF | 消除部分依赖,非主属性完全依赖主键。 | 必须完全依赖主键,不允许部分依赖。 |
3NF | 消除传递依赖,非主属性只依赖主键。 | 非主属性之间不能存在依赖关系。 |
BCNF | 消除主属性间依赖,所有函数依赖的决定因素为超键。 | 更严格的3NF。 |
4NF | 消除多值依赖,每个关系只存储一个独立主题。 | 解决多值属性独立的问题。 |
5NF | 消除连接依赖,确保关系可以通过小表复原。 | 对复杂表分解到极致。 |