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传递依