第一大范式:数据库表中的所有字段都只具有单一属性。
id | name-age |
1 | 李雷-19 |
2 | 韩梅梅-18 |
表中name-age字段合为一列,违反了第一范式,应该拆分为两列
id | name | age |
1 | 李雷 | 19 |
2 | 韩梅梅 | 18 |
第二大范式:要求表中只具有一个业务主键。也就是说不能存在非主键列,只对部分主键依赖。
有两张表:订单表,产品表
订单表ID(主键) | 订单时间 | 产品ID |
1 | 2020-04-11 | 2 |
1 | 2020-04-11 | 3 |
产品ID | 名称 |
2 | 奶粉 |
3 | 奶瓶 |
订单表中的订单时间违反了第二范式,订单时间冗余,订单表和订单表没有强关联,所以应该将其才分为订单表、中间表、商品表
订单表ID(主键) | 订单时间 |
1 | 2020-04-11 |
订单表ID(主键) | 产品ID |
1 | 2 |
1 | 3 |
产品ID | 名称 |
2 | 奶粉 |
3 | 奶瓶 |
第三范式:指每一个非非主属性既不部分依赖于也不传递依赖于业务主键,也就是在第二范式的基础上相处了非主键对主键的传递依赖。(间接依赖)
订单表ID(主键) | 订单时间 | 客户编号 | 姓名 |
1 | 2020-02-11 | 1 | 李雷 |
2 | 2020-02-11 | 2 | 韩梅梅 |
其中客户编号和订单ID关联,客户编号和姓名关联,姓名和订单表ID关联,姓名和订单ID产生间接依赖的关系。应当将姓名列去掉。
虽然三大范式是为了解决数据库冗余的问题,但是阿里开发手册中提到可以适当的违反范式,允许少量的冗余,以便提高查询效率,也就是使用空间换时间。