3NF讲解
3NF(第三范式)是数据库设计中的一种规范化方法,目的是消除数据冗余和避免数据异常。它帮助数据库保持高效,灵活和一致性。理解3NF的关键点在于它依赖于前两个范式(1NF和2NF)的基础。
1. 第一范式(1NF):确保数据表格中的每一列都具有原子性。
- 原子性:每个单元格只存储单一的值,不能由重复的值或多值。
示例:一个表格中,存储每个订单的商品数据,不应存储多个商品名称在同一列。
订单号 | 商品名称 |
---|---|
001 | 苹果,香蕉 |
002 | 橙子,苹果 |
改进后(1NF):
订单号 | 商品名称 |
---|---|
001 | 苹果 |
001 | 香蕉 |
002 | 橙子 |
002 | 苹果 |
2. 第二范式(2NF):在1NF的基础上,确保所有非主属性完全依赖于主键。
- 完全依赖:即所有非主键列应该完全依赖于主键列,而不是部分依赖。也就是说,主键是复合键时,非主键字段不能只依赖于主键的其中一部分。
示例:假设有一个表格,存储学生成绩信息,表中同时包含了学生的基本信息和成绩信息。
学生ID | 课程ID | 学生姓名 | 课程名称 | 成绩 |
---|---|---|---|---|
1001 | 101 | 张三 | 数学 | 95 |
1001 | 102 | 张三 | 语文 | 88 |
1002 | 101 | 李四 | 数学 | 90 |
这个表中,学生姓名和课程名称与主键(学生ID, 课程ID)部分依赖,不符合2NF。
改进后(2NF):
-
学生表(只包含学生基本信息)
学生ID 学生姓名 1001 张三 1002 李四 -
课程表(只包含课程基本信息)
课程ID 课程名称 101 数学 102 语文 -
成绩表(包含成绩)
学生ID 课程ID 成绩 1001 101 95 1001 102 88 1002 101 90
3. 第三范式(3NF):在2NF的基础上,确保不存在传递依赖。
- 传递依赖:如果A -> B,B -> C,那么A -> C就是传递依赖。3NF要求消除这种依赖。
示例:在2NF的基础上,如果某表中有学生ID、学生姓名、学生所在系等信息,且学生姓名决定学生所在系(即,学生姓名 -> 所在系),那么就存在传递依赖(学生ID -> 学生姓名 -> 所在系)。
改进后(3NF):
-
学生表(只包含学生基本信息)
学生ID 学生姓名 1001 张三 1002 李四 -
系表(只包含系的基本信息)
系ID 系名称 001 计算机 002 物理 -
学生-系表(包含学生与所在系的关系)
学生ID 系ID 1001 001 1002 002 -
成绩表(不变)
学生ID 课程ID 成绩 1001 101 95 1001 102 88 1002 101 90
通过这些调整,表中的数据不再存在冗余,且便于维护与查询。
总结:
- 1NF:每个单元格包含单一数据。
- 2NF:消除部分依赖,确保每个非主属性完全依赖于主键。
- 3NF:消除传递依赖,确保每个非主属性只依赖于主键,不通过其他非主属性。
3NF的核心目的是减少数据冗余和避免数据不一致性,同时也能提升数据库的维护性。