数据库三大范式
远离那些贬低你理想的人。狭隘的人经常如此,伟大的人会让你感觉自己也可以变好。
——马克·吐温
第一范式(1NF):要求数据库表的每一列都是不可分割的原子数据项。
| 学号 | 姓名 | 家庭信息 |
|---|---|---|
| 202501 | 李白 | 2口人,长沙 |
| 202502 | 杜甫 | 3口人,上海 |
| 202503 | 王维 | 4口人,南京 |
在上面的表中,家庭信息列不满足原子性的要求,故不满足第一范式,调整如下:
| 学号 | 姓名 | 家庭人口 | 户籍 |
|---|---|---|---|
| 202501 | 李白 | 2口人 | 长沙 |
| 202502 | 杜甫 | 3口人 | 上海 |
| 202503 | 王维 | 4口人 | 南京 |
调整后的每一列都是不可再分的,因此满足第一范式(1NF)
第二范式(2NF):在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)
第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)
| 订单ID | 产品ID | 产品名称 | 单价 | 数量 |
|---|---|---|---|---|
| 1001 | P001 | 手机 | 5000 | 2 |
主键:(订单ID, 产品ID)
产品名称和单价仅依赖产品ID,与订单ID无关,属于部分依赖。调整如下:
| 订单ID | 产品ID | 产品名称 | 数量 |
|---|---|---|---|
| 1001 | P001 | 手机 | 2 |
| 产品ID | 产品名称 | 单价 |
|---|---|---|
| P001 | 手机 | 5000 |
第三范式(3NF):在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)
第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。
| 学生ID | 姓名 | 学院名称 | 学院地址 |
|---|---|---|---|
| 001 | 李四 | 计算机系 | 科技楼A座 |
主键: 学生ID
学院地址依赖学院名称,而学院名称依赖主键学生ID,形成传递依赖。调整如下:
| 学生ID | 姓名 | 学院名称 |
|---|---|---|
| 001 | 李四 | 计算机系 |
| 学院名称 | 学院地址 |
|---|---|
| 计算机系 | 科技楼A座 |

浙公网安备 33010602011771号