数据库三范式(3NF,Third Normal Form)是数据库设计中的重要概念,用于提高数据库的组织结构、减少数据冗余、避免更新异常,从而提高数据的完整性与效率。三范式是关系型数据库理论中的一种标准化形式,它包括第一范式(1NF)、第二范式(2NF)和第三范式(3NF)。
第一范式要求关系数据库中的每一个字段都必须是原子性的,即每个字段的数据值必须是不可再分的基本数据项。
学号 | 姓名 | 课程 | 成绩 |
---|---|---|---|
1001 | 张三 | 数学, 英语 | 85, 90 |
1002 | 李四 | 语文, 数学 | 88, 75 |
这不是第一范式,因为“课程”和“成绩”包含了多个值,应分为多行。
改成 1NF 后:
学号 | 姓名 | 课程 | 成绩 |
---|---|---|---|
1001 | 张三 | 数学 | 85 |
1001 | 张三 | 英语 | 90 |
1002 | 李四 | 语文 | 88 |
1002 | 李四 | 数学 | 75 |
第二范式是在满足 第一范式 的基础上,要求消除 部分依赖,即所有非主属性必须完全依赖于主键。
假设有如下表格,其中 学号+课程 组成联合主键,成绩是非主属性。
学号 | 课程 | 教师 | 成绩 |
---|---|---|---|
1001 | 数学 | 王老师 | 85 |
1001 | 英语 | 李老师 | 90 |
1002 | 数学 | 王老师 | 75 |
在此表中,教师 只依赖于 课程,而与 学号 无关,因此存在部分依赖。
为了使该表满足第二范式,需要将表拆分成两张表:
学生成绩表:
学号 | 课程 | 成绩 |
---|---|---|
1001 | 数学 | 85 |
1001 | 英语 | 90 |
1002 | 数学 | 75 |
课程表:
课程 | 教师 |
---|---|
数学 | 王老师 |
英语 | 李老师 |
第三范式是在满足 第二范式 的基础上,要求消除 传递依赖,即每个非主属性必须直接依赖于主键,而不能通过其他非主属性间接依赖。
假设有如下表格,其中 学号 作为主键,班主任 依赖于 专业,而 专业 又依赖于 学号。
学号 | 姓名 | 专业 | 班主任 | 成绩 |
---|---|---|---|---|
1001 | 张三 | 计算机 | 王老师 | 85 |
1002 | 李四 | 电子 | 李老师 | 90 |
在这个表格中,班主任 依赖于 专业,而 专业 又依赖于 学号,这是一个 传递依赖,违反了第三范式。
为了满足 3NF,可以将表拆分成两张表:
学生成绩表:
学号 | 姓名 | 专业 | 成绩 |
---|---|---|---|
1001 | 张三 | 计算机 | 85 |
1002 | 李四 | 电子 | 90 |
专业与班主任表:
专业 | 班主任 |
---|---|
计算机 | 王老师 |
电子 | 李老师 |
通过使用三范式进行数据库设计,可以有效减少数据冗余,避免数据不一致性,提高数据库的完整性和可维护性。然而,过度的规范化可能会导致查询性能下降,因此在实际设计中需要平衡规范化与性能之间的权衡。