定义:数据库的表中不存在非关键字段对任一候选关键字段的部分函数依赖。
如果非关键字段对这个组合关键字中的某一个字段存在依赖关系,就称之为部分函数依赖。
注意:组合关键字段,由两个或两个以上的字段来标识这一行数据
以下面的商品表为例来说明:
商品名称 | 供应商 | 价格 | 描述 | 重量 | 供应商电话 | 有效期 | 分类 |
可乐 | 饮料一厂 | 3.00 | 250g | 8888888 | 2020.12 | 饮料 | |
可乐 | 饮料二厂 | 3.00 | 250g | 666666 | 2020.12 | 饮料 |
由于供应商和商品之间是多对对的关系,所以只有使用商品名称+供应商才能唯一标识出一件商品。
上表中存在以下的部分函数依赖关系:
- (商品名称) 决定 (价格, 描述, 重量, 商品有效期)
- (供应商) 决定 (供应商电话)
这会导致数据的操作异常,以及数据的冗余。
- 如果饮料一厂没有提供任何数据,该表则找不到饮料一厂的信息(供应商、供应商电话)
- 如果把饮料一厂所提供的可乐这些商品删除掉之后,同样找不到饮料一厂的信息
- 饮料一厂所提供多种商品,如果更新饮料一厂供应商电话,势必需同时更新多条商品的供应商电话
- 饮料一厂所提供多种商品,供应商的电话在该表中势必会重复多次显示,造成数据冗余
解决方式,将不符合第二范式的表进行拆分:
将商品信息单独拿出来,存放到一张表中:
商品ID | 商品名称 | 价格 | 描述 | 重量 | 有效期 | 分类 |
1 | 可乐 | 3.00 | 250g | 2020.12 | 饮料 |
将供应商信息存储到另外一张表中:
供应商ID | 供应商名称 | 供应商电话 |
1 | 饮料一厂 | 8888888 |
2 | 饮料二厂 | 666666 |
再建立一张表存放供应商与商品之间的关系:
供应商ID | 商品ID |
1 | 1 |
拆分之后的表,已经成为了这种单关键字的表,也也不存在复合关键字,也就不存在部分函数依赖关系,就符合第二范式。