数据库的三范式(也称为数据库规范化三范式)是设计数据库表结构时的一种指导原则,旨在减少数据冗余和提高数据一致性。它们分别是第一范式(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 | |
通过这样规范化,数据库表的设计变得更加清晰、冗余减少,并且数据一致性得到增强。