关系型数据库设计规范中的第三范式(3NF, Third Normal Form)是在满足第一范式(1NF)和第二范式(2NF)的基础上进一步消除数据冗余和规范数据设计的标准。以下是关于3NF的详细解释:
- 第一范式(1NF):
* 每一列都是不可分割的原子项。
* 表中不能有重复的行(由主键唯一确定)。
* 列(属性)名唯一,没有重复的列。
- 第二范式(2NF):
* 满足1NF。
* 所有的非主键列都完全依赖于主键(即没有部分依赖)。
* 如果存在复合主键(由多个列组成的主键),则非主键列不能仅依赖于复合主键中的一部分。
- 第三范式(3NF):
* 满足2NF。
* 非主键列之间没有传递依赖。换句话说,如果一个非主键列A依赖于另一个非主键列B,而B又依赖于主键,那么A应该直接依赖于主键,而不是通过B来间接依赖。
为什么需要3NF?
通过遵循3NF,我们可以确保数据库结构更加清晰、规范,减少数据冗余和更新异常(如插入异常、删除异常和修改异常)。
如何应用3NF?
- 识别并消除部分函数依赖。
- 如果发现非主键列之间存在传递依赖,考虑将其拆分为多个表,并通过外键关联。
示例:
假设我们有一个订单
表,其中包含了订单ID
、客户ID
、客户姓名
、产品ID
和产品名称
。
- 在这个表中,
订单ID
是主键。 客户ID
、客户姓名
、产品ID
和产品名称
都是非主键列。客户ID
依赖于订单ID
(因为每个订单都有一个客户)。- 但是,
客户姓名
依赖于客户ID
,而不是直接依赖于订单ID
。 - 同样,
产品ID
和产品名称
依赖于产品ID
,而不是直接依赖于订单ID
。
根据3NF,我们应该将客户姓名
和产品名称
移出订单
表,并将它们分别放入客户
表和产品
表。然后,在订单
表中,我们只保留客户ID
和产品ID
作为外键,与客户
表和产品
表进行关联。
这样,我们就消除了传递依赖,并遵循了3NF。