第一范式
每一列都是不可以在进行分割的单元,也就是说确保每一列的原子性
下面的一个例子是不符合第一范式的:以为它的地址信息还可以进行细分。
修改成复合第一范式的:
第二范式
满足第一范式后,要求表中的所有列,都必须依赖于主键,而不能有任何一列与主键没有关系,也就是说一个表只描述一件事情。
下面的一个例子是不符合第二范式的:
存在复合的主键 学号和课程 , 学分只是依赖部分的主键 - 课程,因此并不复合第二范式
| 学号 | 课程 | 成绩 | 学分 |
|---|---|---|---|
| 2204017228 | java | 90 | 3.0 |
| 2204017229 | java | 99 | 3.0 |
修改成复合第二范式的:
成绩字段都是依赖,学号和课程的字段
| 学号 | 课程 | 成绩 |
|---|---|---|
| 2204017228 | java | 90 |
| 2204017229 | java | 99 |
第三范式
必须先满足第二范式,要求:表中的每一列只与主键直接相关而不是间接相关,(表中的每一列只能依赖于主键)
先看一个不符合第三范式的设计:
显然商品类别和商品类别Id 产生了冗余数据
| 商品Id | 商品类别ID | 商品类别名称 | 商品名称 | 商品价格 |
|---|---|---|---|---|
| 1 | 1 | 日用品 | 卫生纸 | 2 |
| 1 | 1 | 日用品 | 香皂 | 2 |
修改成复合第三范式的
| 商品类别Id | 商品类别名称 |
|---|---|
| 1 | 日用品 |
| 商品ID | 商品类别ID | 商品名称 | 商品价格 |
|---|---|---|---|
| 1 | 1 | 卫生纸 | 2 |
| 1 | 1 | 香皂 | 2 |