第一范式、第二范式、第三范式的定义
数据库是现代信息化时代的重要组成部分,而关系型数据库是其中最常用的类型。在关系型数据库的设计中,常常会涉及到第一范式、第二范式和第三范式的概念。那么究竟什么是第一范式、第二范式和第三范式呢?
1. 第一范式
第一范式(1NF)是指关系模式中的所有属性都是不可再分的基本数据项,即属性不可再分。简单来说,就是关系模式的属性不能再分解。如下面一张学生信息表:
| 学号 | 姓名 | 选课情况 |
| ---- | ---- | ------ |
| 001 | 张三 | 语文,数学 |
| 002 | 李四 | 英语 |
上表中的“选课情况”属性包含了多个选课信息,这就违反了第一范式的要求。符合第一范式的学生信息表应该是这样的:
| 学号 | 姓名 | 选课 |
| ---- | --- | ------ |
| 001 | 张三 | 语文 |
| 001 | 张三 | 数学 |
| 002 | 李四 | 英语 |
上表中将“选课情况”属性拆分成两个不可再分的属性“课程编号”和“课程名称”。
2. 第二范式
第二范式(2NF)是在第一范式的基础上进一步要求关系模式中的非主属性完全依赖于主键。即,非主属性必须完全依赖于主键,而不能依赖于主键的一部分。举个例子:
| 订单编号 | 商品名称 | 商品价格 | 供应商编号 | 供应商名称 |
| ------ | ------ | ------ | ------ | ------ |
| 001 | A商品 | 10元 | S001 | XX公司 |
| 001 | B商品 | 20元 | S002 | YY公司 |
上表是一个订单表,主键为“订单编号”和“商品名称”,而“供应商编号”和“供应商名称”这两个属性依赖于“供应商编号”。为了符合第二范式的要求,应该将上表拆成两个表,分别为订单表和供应商表:
订单表:
| 订单编号 | 商品名称 | 商品价格 | 供应商编号 |
| ------ | ------ | ------ | ------ |
| 001 | A商品 | 10元 | S001 |
| 001 | B商品 | 20元 | S002 |
供应商表:
| 供应商编号 | 供应商名称 |
| ------ | ------ |
| S001 | XX公司 |
| S002 | YY公司 |
3. 第三范式
第三范式(3NF)是在第二范式基础上进一步要求关系模式中的非主属性不依赖于其他非主属性。即,在第二范式的基础上消除传递依赖。举个例子:
| 订单编号 | 客户名称 | 客户所在城市 | 客户电话 |
| ------ | ------ | ------- | ------ |
| 001 | 张三 | 北京 | 123456 |
| 002 | 李四 | 上海 | 456789 |
上表中的“客户所在城市”和“客户电话”属性都依赖于“客户名称”,而不是直接依赖于主键“订单编号”。为了符合第三范式的要求,需要将上表分成两个表,一个为订单表,一个为客户表,它们之间通过客户名称建立关系。
订单表:
| 订单编号 | 客户名称 |
| ------ | ------ |
| 001 | 张三 |
| 002 | 李四 |
客户表:
| 客户名称 | 客户所在城市 | 客户电话 |
| ------ | ------- | ------ |
| 张三 | 北京 | 123456 |
| 李四 | 上海 | 456789 |
通过这三个范式的定义,我们可以更好地设计数据库,提高数据的精确性和稳定性。