在数据库设计中,范式(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 必须是超键。(超键是一个或多个属性的组合,这些属性的值可以唯一地标识表中的每一行记录。换句话说,一个超键中的值是足够独特的,它能够用来区分表中的任意两条记录。)
- 示例:不符合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 | 消除连接依赖,确保关系可以通过小表复原 | 对复杂表分解到极致 |
评论留言
欢迎您,!您可以在这里畅言您的的观点与见解!
0 条评论