数据库第三范式(3NF)详解
立即解锁
发布时间: 2025-08-23 00:16:15 阅读量: 2 订阅数: 13 

# 数据库第三范式(3NF)详解
## 1. 引言
在数据库设计中,规范化是一个重要的概念,它有助于减少数据冗余和避免数据操作异常。我们之前建立的第二范式(2NF)表相较于第一范式(1NF)表有了显著的改进,但仍然存在一些问题。这些问题与传递依赖有关,会导致与1NF表类似的数据异常。接下来,我们将深入探讨第三范式(3NF),了解如何解决这些问题。
## 2. 第二范式(2NF)的局限性
虽然2NF表在一定程度上优化了数据结构,但由于传递依赖的存在,仍然会出现数据操作异常。传递依赖意味着一个表中表示了两个不同的事实,每个函数依赖的左侧不同。
例如,考虑一个数据库中的报告表。当我们从数据库中删除一份报告时,需要从`report1`和`report3`表中删除相应的行(如图6.2所示)。然而,这会产生一个副作用,即同时删除了`dept_no`、`dept_name`和`dept_addr`之间的关联。
| 表名 | 操作 |
| ---- | ---- |
| report1 | 删除相应行 |
| report3 | 删除相应行 |
下面是这个过程的mermaid流程图:
```mermaid
graph LR
A[删除报告] --> B[删除report1相应行]
A --> C[删除report3相应行]
B --> D[删除dept关联信息]
C --> D
```
## 3. 第三范式(3NF)的解决方案
为了解决传递依赖带来的问题,我们可以对表进行投影操作。以`report1`表为例,我们可以将其投影为两个新表:
- `report11`:通过对`report1`表在`report_no`、`editor`和`dept_no`上进行投影得到。
- `report12`:通过对`report1`表在`dept_no`、`dept_name`和`dept_addr`上进行投影得到。
这样操作后,我们就消除了传递依赖`report_no -> dept_no -> dept_name, dept_addr`,得到了符合3NF的表及其函数依赖:
- `report11`:`rep
0
0
复制全文
相关推荐









