第07章01节-数据库设计三范式
第07章01节-数据库设计三范式
CAMELLIA数据库设计三范式
数据库设计的三范式(Third Normal Form,简称 3NF)是数据库设计中的一种规范化过程,用于组织数据库结构以减少数据冗余和提高数据完整性。
数据库设计的三范式(Third Normal Form,简称 3NF)是数据库设计中的一种规范化过程,用于组织数据库结构以减少数据冗余和提高数据完整性。以下是三范式的具体定义和示例:
1. 第一范式(1NF)
第一范式要求数据库表中的所有字段值都是原子的,不可再分。换句话说,每一列的值都是不可分割的基本数据项。
未达到 1NF 的表:
订单ID | 客户名 | 产品 | 数量 |
---|---|---|---|
1 | 张三 | 手机, 电脑 | 2, 1 |
问题:在同一列中包含多个值,例如“产品”列包含“手机”和“电脑”,这违反了原子性原则。
解决方案:将每个产品拆分为单独的行
达到 1NF 的表:
订单ID | 客户名 | 产品 | 数量 |
---|---|---|---|
1 | 张三 | 手机 | 2 |
1 | 张三 | 电脑 | 1 |
解释:每个产品和数量的组合在一个单独的行中,这样每个字段的值都是原子的。
2. 第二范式(2NF)
在满足第一范式的基础上,第二范式要求数据库表中不存在部分依赖,即非主键列必须完全依赖于主键,而不是依赖于主键的一部分。第二范式消除了部分依赖的冗余。
未达到 2NF 的表:
学生ID | 课程ID | 成绩 | 学生名 | 课程名 |
---|---|---|---|---|
1 | 101 | 90 | 张三 | 数学 |
1 | 102 | 85 | 张三 | 英语 |
问题:学生名和课程名依赖于学生ID和课程ID的组合,而不完全依赖于该组合中的某一部分,存在部分依赖。
解决方案:将学生信息和课程信息拆分到独立的表中。
达到 2NF 的表:
学生表:
学生ID | 学生名 |
---|---|
1 | 张三 |
课程表:
课程ID | 课程名 |
---|---|
101 | 数学 |
102 | 英语 |
成绩表:
学生ID | 课程ID | 成绩 |
---|---|---|
1 | 101 | 90 |
1 | 102 | 85 |
解释:通过将学生信息和课程信息拆分到独立的表中,非主键列“学生名”和“课程名”完全依赖于它们各自的主键列,从而消除了部分依赖。
3. 第三范式(3NF)
在满足第二范式的基础上,第三范式要求数据库表中不存在传递依赖,即非主键列必须直接依赖于主键,而不能通过其他非主键列间接依赖于主键。第三范式消除了传递依赖的冗余。
未达到 3NF 的表:
学生ID | 学生名 | 系ID | 系主任 |
---|---|---|---|
1 | 张三 | 10 | 王老师 |
2 | 李四 | 20 | 张老师 |
3 | 王五 | 10 | 王老师 |
问题:在这个表中,“系主任”依赖于“系ID”,“系ID”依赖于“学生ID”。因此,“系主任”通过“系ID”间接依赖于“学生ID”,这就是传递依赖。
解决方案:将系的信息单独放在一个表中。
达到 3NF 的表:
学生表:
学生ID | 学生名 | 系ID |
---|---|---|
1 | 张三 | 10 |
2 | 李四 | 20 |
3 | 王五 | 10 |
系表:
系ID | 系主任 |
---|---|
10 | 王老师 |
20 | 张老师 |
解释:通过将“系ID”和“系主任”信息分离到独立的“系表”中,消除了“系主任”对“学生ID”的传递依赖。现在,学生表中的非主键列(学生名和系ID)直接依赖于学生ID,而系表中的非主键列(系主任)直接依赖于系ID。
4. 总结
通过遵循三范式,我们可以:
- 减少数据冗余:避免重复存储同一信息,节省存储空间。
- 提高数据一致性:更新一处数据后,不需要同步更新多处,从而避免数据不一致。
- 简化数据维护:清晰的表结构使得数据的插入、更新、删除操作更加简洁高效。
这些规范化的步骤有助于设计一个结构合理、数据完整、易于维护的数据库系统。
注意:最终以满足客户需求为原则,有的时候会拿空间换速度。