数据库系统工程师-范式

409 阅读6分钟

数据库范式

第一范式(1NF)

第一范式要求每个属性都不可再分

编号歌曲歌手
1刀马旦李玟,周杰伦

上例中,歌手属性可再分,修改为:

编号歌曲歌手
1刀马旦李玟
1刀马旦周杰伦

符合第一范式的关系示例:

学号姓名学院编号学院名称课程号成绩
1001王芳D20经济学院C00134
1001王芳D20经济学院C00254
1001王芳D20经济学院C00367
1002李明D12计算机学院C00123
1002李明D12计算机学院C00243
1003赵晗D12计算机学院C00256
1003赵晗D12计算机学院C00365
1004刘晓D25管理学院C00223

第一范式仍存在以下问题:

  1. 数据冗余
  2. 更新异常,修改操作的不一致性(其实也是因为冗余度大造成的)
  3. 插入异常,比如要操作的数据中,部分主属性只能取 null,这时将无法插入
  4. 删除异常,删除某一信息时,可能将不该删除的信息也删除了,比如如果院系没有单独的表,而是跟教师放在一个表中,那么当教师删除时,也会将院系删除,如果院系下的教师都删除了,院系也就不存在了,但院系本是不应该被删除的

上例中虽然符合第一范式,但存在冗余的 “学号-姓名” 关系。

第二范式(2NF)

消除非主属性对码(主属性)的部分函数依赖

学号姓名课程号成绩
1张三C00177
1张三C00288
2李四C00367

上例中,姓名对主码是部分函数依赖(姓名只依赖于学号),造成的问题是:

  1. 冗余,张三出现多次
  2. 插入异常,不能插入没有课程号的学生
  3. 删除异常,此表不能删除李四的课程,否则李四的信息也被删除(学号-姓名)

修改为:

学号姓名
1张三
2李四
学号课程号成绩
1C00177
1C00288
2C00367

第三范式(3NF)

消除非主属性对码的传递函数依赖

学号姓名学院编号学院名称
1张三D10经济学院
2李四D10经济学院

上例中,学院名称对主码是传递函数依赖(学号 -> 学院编号 -> 学院名称),可以发现,学院编号与学院名称仍然存在数据冗余的问题。修改为:

学号姓名学院编号
1张三D10
2李四D10
学院编号学院名称
D10经济学院
D11计算机学院

巴科斯范式(BCNF)

消除主属性对码的部分函数依赖和传递函数依赖

  1. 所有非主属性对每一个码都是完全函数依赖
  2. 所有主属性对每一个不包含它的码,也是完全函数依赖
  3. 没有任何属性完全函数依赖于非码的任何一组属性
学号身份证号课程分数
A001445111语文24
A001445111数学235
A002445112英语64

在这个表中,学号与身份证号是一一对应的,所以每出现一次学号,就要出现一次身份证号。原因在于,表中有两个候选码:即 {学号, 课程}{身份证号, 课程},然而主属性 "身份证号" 与主码 {学号, 课程} 存在部分函数依赖,同样的,主属性 "学号" 与主码 {身份证号, 课程} 也存在部分函数依赖

在满足BCNF的关系中,部分函数依赖和传递函数依赖是完全不存在的。因此从函数依赖的角度来说,BCNF就是规范化程度最高的关系模式!

在工程实践中,传统的信息系统数据库设计会要求满足3NF,而且我们习惯于用自增序列或 UUID 去生成单一的主键,因此我们设计的数据库一般都是符合 BCNF的。

第四范式(4NF)

属性间不允许有非平凡且非函数依赖的多值依赖

ISBN书名作者排名出版社
123数据库概论张三1科学出版社
123数据库概论李四2科学出版社
123数据库概论王五3科学出版社

多值依赖即属性之间的一对多关系,记为K→→A 函数依赖事实上是单值依赖,所以不能表达属性值之间的一对多关系。

  • 平凡的多值依赖:全集 U=K+A,一个 K 可以对应于多个 A,即 K→→A。此时整个表就是一组一对多关系。
  • 非平凡的多值依赖:全集 U=K+A+B,一个 K 可以对应于多个 A,也可以对应于多个 B,A 与 B 互相独立,即K→→A,K→→B。整个表有多组一对多关系,且有:“一”部分是相同的属性集合,“多”部分是互相独立的属性集合。

第四范式即在满足巴斯-科德范式(BCNF)的基础上,消除非平凡且非函数依赖的多值依赖(即把同一表内的多对多关系删除)。

修改为:

书目1 ∈ BCNF

ISBN书名出版社
123数据库概论科学出版社

书目2 ∈ 4NF

ISBN作者排名
123张三1
123李四2
123王五3

如果只考虑函数依赖,关系模式规范化程度最高的范式是 BCNF;如果考虑多值依赖则是 4NF。对于没有多值依赖的关系,最高也就只到 BCNF。没有多值依赖的关系,4NF 也无从说起。

第五范式(5NF)

即在满足第四范式(4NF)的基础上,消除不是由候选码所蕴含的连接依赖。如果关系模式 R 中的每一个连接依赖均由 R 的候选码所隐含,则称此关系模式符合第五范式。 函数依赖是多值依赖的一种特殊的情况,而多值依赖实际上是连接依赖的一种特殊情况。但连接依赖不像函数依赖和多值依赖可以由语义直接导出,而是在关系连接运算时才反映出来。存在连接依赖的关系模式仍可能遇到数据冗余及插入、修改、删除异常等问题。

第五范式属于最终范式,消除了 4NF 中的连接依赖,第五范式需要满足以下要求:

  1. 必须满足第四范式
  2. 表必须可以分解为较小的表,除非那些表在逻辑上拥有与原始表相同的主键。