Database Paradigms and BNCF
Outline:
- 第一范式
- 第二范式
- 第三范式
- 部分依赖、完全依赖、传递依赖
一、第一范式
数据库每一列都是不可分的基本数据项(原子数据项)
在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。就比如说:下面一个数据表
编号 | 姓名 | 地址 |
---|---|---|
001 | 李一 | 山东,青岛 |
002 | 李二 | 山东,济南 |
003 | 李三 | 山东,济宁 |
上表所示的地址,就不符合第一范式,因为地址那一列可以分为省份和市区,故可以修改为
编号 | 姓名 | 省份 | 市区 |
---|---|---|---|
001 | 李一 | 山东 | 青岛 |
002 | 李二 | 山东 | 济南 |
003 | 李三 | 山东 | 济宁 |
二、第二范式
第二范式要求在满足第一范式的基础上,非主属性必须完全依赖于候选键,也就是要消除非主属性对任一候选键的部分依赖。(完全依赖,部分依赖在后文)
2NF的违例只会出现在候选键由超过一个字段构成的表中,因为对单关键字字段不存在部分依赖问题。
就比如说:
订单号 | 产品号 | 产品数量 | 产品价格 | 订单时间 | 订单金额 |
---|---|---|---|---|---|
2001 | 001 | 3 | 8.5 | 20200224 | 25.5 |
2002 | 002 | 2 | 7.5 | 20200424 | 17 |
2002 | 003 | 2 | 6.5 | 20200424 | 17 |
2003 | 001 | 2 | 8.5 | 20200324 | 16 |
如上图加粗字体所示,可能对于同一个订单,含有不同的产品,因此主键必须是产品号和订单号联合组成。但可以发现产品数量、产品价格与订单号、产品号都有关,不过订单时间与订单金额仅与订单号有关,这就违反了第二范式。故可以修改为:
订单 | 产品号 | 产品数量 | 产品价格 |
---|---|---|---|
2001 | 001 | 3 | 8.5 |
2002 | 002 | 2 | 7.5 |
2002 | 003 | 2 | 6.5 |
2003 | 001 | 2 | 8.5 |
订单号 | 订单时间 | 订单金额 |
---|---|---|
2001 | 20200224 | 25.5 |
2002 | 20200424 | 17 |
2002 | 20200424 | 17 |
2003 | 20200324 | 16 |
三、第三范式
第三范式要求在满足第二范式的基础上,任何非主属性不依赖于其他非主属性,即在第二范式的基础上消除传递依赖。第三范式要求数据表的每一列都与主键直接相关,而不是间接相关。(不存在非关键字段对任一候选关键字段的传递依赖)
就比如说:
学号 | 姓名 | 性别 | 班主任姓名 | 班主任性别 | 班主任年龄 |
---|---|---|---|---|---|
2001 | 李一 | 男 | 陈毅 | 男 | 35 |
2003 | 李二 | 男 | 陈毅 | 男 | 35 |
2004 | 李三 | 男 | 王玉 | 男 | 26 |
2005 | 李四 | 男 | 王玉 | 男 | 26 |
从上表可以看出,所有属性都完全依赖于学号,故符合第二范式,但是班主任性别和班主任年龄直接依赖于班主任姓名,而不是主键学号,故不符合第三范式。可修改为:
学号 | 姓名 | 性别 | 班主任姓名 |
---|---|---|---|
2001 | 李一 | 男 | |
2003 | 李二 | 男 | 陈毅 |
2004 | 李三 | 男 | 王玉 |
2005 | 李四 | 男 | 王玉 |
班主任姓名 | 班主任性别 | 班主任年龄 |
---|---|---|
陈毅 | 男 | 35 |
陈毅 | 男 | 35 |
王玉 | 女 | 26 |
王玉 | 女 | 26 |
这样就满足第三范式了。
例子2:
表:(学号, 姓名, 年龄, 所在学院, 学院地点, 学院电话)
该表中候选字段只有“学号”,于是“学号”做主键。由于主键是单一属性,所以不存在非主属性对主键的部分函数依赖的问题,所以必然满足第二范式。但是存在如下传递依赖
(学号) → (所在学院) → (学院地点, 学院电话)
学院地点和学院电话传递依赖于学号,而学院地点和学院电话都是非关键字段,即表中出现了“某一非关键字段可以确定出其它非关键字段”的情况,于是违反了第三范式。
解决办法:
把原表分成两个表:
学生:(学号, 姓名, 年龄, 所在学院);
学院:(学院, 地点, 电话)。
四、部分依赖、完全依赖、传递依赖
部分函数依赖:设X,Y是关系R的两个属性集合,存在X→Y,若X’是X的真子集,存在X’→Y,则称Y部分函数依赖于X。
比如说:C可以通过AB得到,并且C也可以仅通过A得到,仅通过B得到, 那么就说C部分依赖AB。
完全函数依赖:设X,Y是关系R的两个属性集合,X’是X的真子集,存在X→Y,但对每一个X’都有X’ !→Y,则称Y完全函数依赖于X。
比如说:C可以通过AB得到,并且C不可以仅通过A得到,也不可以仅通过B得到, 那么就说C完全依赖AB.
传递函数依赖:设X,Y,Z是关系R中互不相同的属性集合,存在X→Y(Y !→X),Y→Z,则称Z传递函数依赖于X。 比如说:B可以通过A得到,C可以通过B得到,那么就称C传递依