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