1NF(第一范式)
域应该是原子性的,即数据库表的每一列都是不可分割的原子数据项。
以下表不符合第一范式(在特定的业务场景下)
身份证 | 姓名 | 地区 |
---|---|---|
250*** | 张三 | 广州市海珠区 |
251*** | 李四 | 广州市天河区 |
可以修改成:
身份证 | 姓名 | 市 | 区 |
---|---|---|---|
250*** | 张三 | 广州市 | 海珠区 |
251*** | 李四 | 广州市 | 天河区 |
2NF(第二范式)
在 1NF 的基础上,实体的属性完全函数依赖于主关键字(混合主键), 不能存在部分函数依赖于主关键字。
符合第二范式
例如以下成绩表,就不符合第二范式,因为要确定某个学生某个课程的成绩,所以需要将学生证号和课程号作为表的主键,但是其中的姓名和课程名称没有完全依赖主键,所以说不符合第二方式
可以拆分为
- 学生表:学生证号、姓名
- 课程表:课程号、课程名称
- 学生和课程关联表(成绩表):学生证号、课程号、成绩
3NF(第三范式)
3NF 在 2NF 的基础之上,消除了非主属性对于主键(复合主键)的传递依赖。
符合第三范式:
不符合第三范式:
例如订单明细表:
可以拆解成:
- 订单明细表:订单id、商品id、数量、金额
- 商品表:商品id、商品名称、商品规格等等