什么是数据库的三范式?

数据库的三范式(也称为数据库规范化三范式)是设计数据库表结构时的一种指导原则,旨在减少数据冗余和提高数据一致性。它们分别是第一范式(1NF)、第二范式(2NF)和第三范式(3NF)。下面分别解释这三个范式,并给出相应的例子。

第一范式(1NF)

定义:数据库表中的每一列都是原子的,即每一列中的数据都是不可分割的基本数据项。

例子
假设有一个表记录学生的信息,其中有一个列是“联系方式”,里面可能包含电话号码、邮箱地址等多个信息。

| 学生ID | 姓名 | 联系方式 |
|  1  | 张三 | 123456789,zhangsan@ex.com |
|  2  | 李四 | 987654321,lisi@ex.com |

这个表不符合1NF,因为“联系方式”列包含了多个数据项。将其拆分为多个列后:

| 学生ID | 姓名 | 电话号码 | 邮箱地址 |
|--------|------|-----------|--------------|
| 1 | 张三 | 123456789 | zhangsan@ex.com |
| 2 | 李四 | 987654321 | lisi@ex.com |

这样就满足了1NF。

第二范式(2NF)

定义:在满足1NF的基础上,要求数据库表中的每一非主属性完全依赖于主键,而不能仅依赖于主键的一部分(即消除部分依赖)。

例子
假设有一个订单表,其中包含订单ID、客户ID、客户姓名、订单日期和订单金额等信息。

| 订单ID | 客户ID | 客户姓名 | 订单日期 | 订单金额 |
| 1    |  101  | 张三   | 2023-10-01|  500  |
| 2    |  102  | 李四   | 2023-10-02 |  300  |

在这个表中,“客户ID”和“客户姓名”依赖于“订单ID”,但实际上它们只依赖于“客户ID”。为了符合2NF,可以将客户的信息单独放在一张表中:

订单表

| 订单ID | 客户ID | 订单日期 | 订单金额 |
| 1 | 101 | 2023-10-01| 500 |
| 2 | 102 | 2023-10-02| 300 |

客户表

| 客户ID | 客户姓名 |
| 101   | 张三   |
| 102   | 李四   |

第三范式(3NF)

定义:在满足2NF的基础上,要求数据库表中的每一非主属性不传递依赖于主键,即每一个非主属性都直接依赖于主键,而不是通过其他非主属性间接依赖于主键(即消除传递依赖)。

例子
假设有一个订单明细表,包含订单ID、产品ID、产品名称、产品价格和订单数量等信息。

| 订单ID | 产品ID | 产品名称 | 产品价格 | 订单数量 |
|  1  |  P001 |  电视  |  3000   |   1   |
|  1  |  P002 |  音响  |  1000   |   2  | 

在这个表中,“产品名称”和“产品价格”依赖于“产品ID”,而“产品ID”依赖于“订单ID”。这构成了一个传递依赖关系,即“产品名称”和“产品价格”通过“产品ID”间接依赖于“订单ID”。为了符合3NF,可以将产品信息单独放在一张表中:

订单明细表



| 订单ID | 产品ID | 订单数量 |
|    1   |  P001  |    1    |
|    1   |  P002  |    2    |

产品表

| 产品ID | 产品名称 | 产品价格 |
| P001  |  电视  |  3000  |
| P002  |  音响  |  1000  |

通过这样规范化,数据库表的设计变得更加清晰、冗余减少,并且数据一致性得到增强。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值