设计范式(四大范式)
第一范式
- 定义:数据库表中的所有字段都是单一属性,不可再分的
- 这个单一属性是由基本的数据类型所构成的
- 如整数、浮点数、字符串等
- 换句话说:第一范式要求数据库中的表都是二维表
- 数据库中的表都是符合第一范式要求的。
第二范式
- 定义:数据库的表中不存在非关键字段对任一候选关键字段的部分函数依赖。
- 部分函数依赖是指存在着组合关键字中的某一关键字决定非关键字的情况。
- 换句话说: 所有单关键字段的表都符合第二范式。
| 商品名称 | 供应商名称 | 价格 | 重量 | 供应商电话 | 有效期 | 分类 |
|---|
| 可乐 | 饮料一厂 | 3.00 | 250g | 88888888 | 2018.12 | 饮料 |
| 可乐 | 饮料二厂 | 3.00 | 250g | 66666666 | 2018.12 | 饮料 |
- 由于供应商和商品之间是多对多的关系
- 所以只有使用商品名称和供应商名称才可以唯一标识出一件商品。
- 也就是商品名称和供应商名称是一组组合关键字。
- 上表中存在以上的部分函数依赖关系
- (商品名称)->(价格,重量,有效期)
- (供应商名称)-> (供应商电话)
存在的问题:
修改:
| 商品ID | 商品名称 | 价格 | 重量 | 有效期 | 分类 |
|---|
| 1 | 可乐 | 3.00 | 250g | 2018.12 | 饮料 |
| 供应商ID | 供应商名称 | 供应商电话 |
|---|
| 1 | 饮料一厂 | 88888888 |
| 2 | 饮料二厂 | 66666666 |
第三范式
- 第三范式是在第二范式的基础之上定义的
- 如果数据表中不存在非关键字段对任意候选关键字的传递函数依赖则符合第三范式
| 商品名称 | 价格 | 重量 | 有效期 | 分类 | 分类描述 |
|---|
| 可乐 | 3.00 | 250g | 2018.12 | 酒水饮料 | 碳酸饮料 |
| 苹果 | 8.00 | 500g | | 生鲜食品 | 水果 |
存在以下转递函数依赖关系
- (商品名称)->(分类)->(分类描述)
- 也就是说存在非关键字段“分类描述”对关键字段“商品名称”的传递函数依赖
存在问题:
(分类,分类描述)对于每一个商品都会进行记录,所以存在着数据冗余。同时也还存在数据的插入,更新及删除异常。
修改:
| 商品ID | 商品名称 | 价格 | 重量 | 有效期 |
|---|
| 1 | 可乐 | 3.00 | 250g | 2018.12 |
BC范式(Boyce.Codd)
定义:
- 在第三范式的基础之上,数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖则符合BC范式。
- 也就是说如果是复合关键字,则复合关键字之间也不能存在函数依赖关系。
| 供应商 | 商品ID | 供应商联系人 | 商品数量 |
|---|
| 饮料一厂 | 1 | 张三 | 10 |
| 饮料一厂 | 2 | 李四 | 20 |
| 饮料二厂 | 1 | 王五 | 20 |
- 假定供应商联系人只能受雇于一家供应商,每家供应商可以供应多个商品,
- 则存在如下决定关系:
- (供应商,商品ID)->(联系人,商品数量)
- (联系人,商品ID->(供应商,商品数量)
存在下列关系因此不符合BCNF要求:
- (供应商)->(供应商联系人)
- (供应商联系人)->(供应商)
- 并且存在数据操作异常及数据冗余
修改:
| 供应商 | 商品ID | 商品数量 |
|---|
| 饮料一厂 | 1 | 10 |
| 饮料一厂 | 2 | 20 |
| 饮料二厂 | 1 | 20 |
| 供应商 | 供应商联系人 |
|---|
| 饮料一厂 | 张三 |
| 饮料一厂 | 李四 |
| 饮料二厂 | 王五 |
常见的DBMS系统