数据库的三范式

一级元老 凯门
发表于分享分类

数据库的三范式(Three Normal Forms,3NF)是数据库设计中一种确保数据结构合理性的原则和方法。通过三范式的应用,可以避免数据冗余和数据异常,提高数据一致性和完整性。以下是对数据库三范式的详细解释:


### 第一范式(1NF)


**定义**:第一范式要求数据库表中的所有字段都是原子的,不可再分。每个字段只包含单一值,没有重复的列。


**要求**:

1. 数据库表中的每一列都是不可再分的数据项。

2. 每一列都包含相同类型的数据。


**示例**:

```plaintext

学生表(Student)

| 学号 (ID) | 姓名 (Name) | 联系电话 (Phone)          |

| --------- | ----------- | ----------------------- |

| 1         | 张三        | 123456789, 987654321    |

| 2         | 李四        | 234567890               |

```


上述表格不满足第一范式,因为联系电话包含了多个值。将其分解为原子值的表格如下:

```plaintext

学生表(Student)

| 学号 (ID) | 姓名 (Name) | 联系电话 (Phone) |

| --------- | ----------- | --------------- |

| 1         | 张三        | 123456789       |

| 1         | 张三        | 987654321       |

| 2         | 李四        | 234567890       |

```


### 第二范式(2NF)


**定义**:第二范式在满足第一范式的基础上,要求表中非主键字段必须完全依赖于主键,而不能只依赖于主键的一部分(消除部分依赖)。


**要求**:

1. 数据库表必须满足第一范式。

2. 表中所有非主键列完全依赖于主键。


**示例**:

```plaintext

订单表(Order)

| 订单号 (OrderID) | 产品ID (ProductID) | 数量 (Quantity) | 产品名称 (ProductName) |

| ---------------- | ------------------- | --------------- | ---------------------- |

| 1                | 101                 | 10              | 手机                   |

| 1                | 102                 | 5               | 电脑                   |

| 2                | 101                 | 3               | 手机                   |

```


上述表格不满足第二范式,因为“产品名称”依赖于“产品ID”而不是整个“订单号”。将其分解如下:

```plaintext

订单表(Order)

| 订单号 (OrderID) | 产品ID (ProductID) | 数量 (Quantity) |

| ---------------- | ------------------- | --------------- |

| 1                | 101                 | 10              |

| 1                | 102                 | 5               |

| 2                | 101                 | 3               |


产品表(Product)

| 产品ID (ProductID) | 产品名称 (ProductName) |

| ------------------- | ---------------------- |

| 101                 | 手机                   |

| 102                 | 电脑                   |

```


### 第三范式(3NF)


**定义**:第三范式在满足第二范式的基础上,要求表中所有非主键字段不能相互依赖(消除传递依赖)。


**要求**:

1. 数据库表必须满足第二范式。

2. 表中所有非主键列直接依赖于主键,不存在传递依赖。


**示例**:

```plaintext

学生表(Student)

| 学号 (ID) | 姓名 (Name) | 系部ID (DeptID) | 系部名称 (DeptName) |

| --------- | ----------- | --------------- | ------------------- |

| 1         | 张三        | 10              | 计算机系            |

| 2         | 李四        | 20              | 数学系              |

```


上述表格不满足第三范式,因为“系部名称”依赖于“系部ID”而不是直接依赖于“学号”。将其分解如下:

```plaintext

学生表(Student)

| 学号 (ID) | 姓名 (Name) | 系部ID (DeptID) |

| --------- | ----------- | --------------- |

| 1         | 张三        | 10              |

| 2         | 李四        | 20              |


系部表(Department)

| 系部ID (DeptID) | 系部名称 (DeptName) |

| --------------- | ------------------- |

| 10              | 计算机系            |

| 20              | 数学系              |

```


### 总结


- **第一范式(1NF)**:确保每个字段都是原子值。

- **第二范式(2NF)**:确保非主键字段完全依赖于主键。

- **第三范式(3NF)**:确保非主键字段不依赖于其他非主键字段。


通过应用三范式,可以有效地减少数据冗余,提高数据的一致性和完整性。这对于数据库的设计和管理至关重要。

登录 分类