golang,go,博客,开源,编程

数据库基础之三范式

Published on with views and comments

数据库三范式(3NF,Third Normal Form)是数据库设计中的重要概念,用于提高数据库的组织结构、减少数据冗余、避免更新异常,从而提高数据的完整性与效率。三范式是关系型数据库理论中的一种标准化形式,它包括第一范式(1NF)、第二范式(2NF)和第三范式(3NF)。

一、第一范式(1NF)

第一范式要求关系数据库中的每一个字段都必须是原子性的,即每个字段的数据值必须是不可再分的基本数据项。

1NF 规范要求:

  • 表中的每一列都必须是不可分的原子值,不能包含重复的数据项。
  • 每一行都是唯一的,必须有一个主键标识唯一记录。

示例:

学号姓名课程成绩
1001张三数学, 英语85, 90
1002李四语文, 数学88, 75

这不是第一范式,因为“课程”和“成绩”包含了多个值,应分为多行。

改成 1NF 后:

学号姓名课程成绩
1001张三数学85
1001张三英语90
1002李四语文88
1002李四数学75

二、第二范式(2NF)

第二范式是在满足 第一范式 的基础上,要求消除 部分依赖,即所有非主属性必须完全依赖于主键。

2NF 规范要求:

  • 1NF 的基础上,要求表中的非主属性必须依赖于整个主键,而不是仅仅依赖于主键的一部分(消除部分依赖)。这是针对联合主键表格的要求。
  • 仅有一个主键的表格自动满足 2NF。

示例:

假设有如下表格,其中 学号+课程 组成联合主键,成绩是非主属性。

学号课程教师成绩
1001数学王老师85
1001英语李老师90
1002数学王老师75

在此表中,教师 只依赖于 课程,而与 学号 无关,因此存在部分依赖。

为了使该表满足第二范式,需要将表拆分成两张表:

学生成绩表

学号课程成绩
1001数学85
1001英语90
1002数学75

课程表

课程教师
数学王老师
英语李老师

三、第三范式(3NF)

第三范式是在满足 第二范式 的基础上,要求消除 传递依赖,即每个非主属性必须直接依赖于主键,而不能通过其他非主属性间接依赖。

3NF 规范要求:

  • 满足 第二范式
  • 所有非主属性(即列)都必须直接依赖于主键,不能依赖于其他非主属性。

示例:

假设有如下表格,其中 学号 作为主键,班主任 依赖于 专业,而 专业 又依赖于 学号

学号姓名专业班主任成绩
1001张三计算机王老师85
1002李四电子李老师90

在这个表格中,班主任 依赖于 专业,而 专业 又依赖于 学号,这是一个 传递依赖,违反了第三范式。

为了满足 3NF,可以将表拆分成两张表:

学生成绩表

学号姓名专业成绩
1001张三计算机85
1002李四电子90

专业与班主任表

专业班主任
计算机王老师
电子李老师

总结

  • 第一范式(1NF):要求表格中的每个字段都必须是原子性的,不能包含多值。
  • 第二范式(2NF):要求表格满足第一范式,并且消除部分依赖,即所有非主属性完全依赖于主键。
  • 第三范式(3NF):要求表格满足第二范式,并且消除传递依赖,即每个非主属性必须直接依赖于主键。

通过使用三范式进行数据库设计,可以有效减少数据冗余,避免数据不一致性,提高数据库的完整性和可维护性。然而,过度的规范化可能会导致查询性能下降,因此在实际设计中需要平衡规范化与性能之间的权衡。


标题:数据库基础之三范式
作者:mooncakeee
地址:http://blog.dd95828.com/articles/2025/01/07/1736217223436.html
联系:scotttu@163.com