龙空技术网

数据库三范式以及化为第二、三范式的例子

程序猿阿乐 191

前言:

此刻咱们对“数据库如何分解3nf算法”可能比较讲究,看官们都需要知道一些“数据库如何分解3nf算法”的相关资讯。那么小编同时在网络上搜集了一些关于“数据库如何分解3nf算法””的相关资讯,希望兄弟们能喜欢,我们快快来了解一下吧!

第一范式(1NF):字段具有原子性,不可再分。(所有关系型数据库系统都满足第一范式,数据库表中的字段都是单一属性的,不可再分)第二范式(2NF)是在第一范式(1NF)的基础上建立起来的。第二范式(Second Normal Form,2nd NF)是指每个表必须有主关键字(Primary key)。每个非主属性完全依赖于主键,而不是仅依赖于其中一部分属性。满足第三范式(3NF)必须先满足第二范式(2NF)。第三范式(Third Normal Form,3rd NF)就是指表中的所有数据元素不但要能唯一地被主关键字所标识,而且它们之间还必须相互独立,不存在其他的传递依赖关系。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。所以第三范式具有如下特征:每一列只有一个值每一行都能区分。每一个表都不包含其他表已经包含的非主关键字信息。化为第二范式的例子

采用投影分解法将一个 1NF 的关系分解为多个 2NF 的关系,可以在一定程度上减轻原 1NF 关系中存在的插入异常、删除异常、数据冗余度大、修改复杂等问题。

将一个 1NF 关系分解为多个 2NF 的关系,并不能完全消除关系模式中的各种异常情况和数据冗余。

例:选课关系(学号,课程号,成绩,学分)

由以上条件,关键字为组合关键字(学号,课程号)

在应用中使用以上关系模式有以下问题:

数据冗余,假设同一门课由 40 个学生选修,学分就重复 40 次。更新异常,若调整了某课程的学分,相应的元组 学分 值都要更新,有可能会出现同一门课学分不同。插入异常,如计划开新课,只能等有人选修才能把课程和学分存入(由于没人选修,没有学号关键字)。删除异常,若学生已经结业,从当前数据库删除选修记录。某些门课程新生尚未选修,则此门课程及学分记录无法保存。

原因:非关键字属性 学分 仅函数依赖于 课程号,也就是 学分 部分依赖组合关键字(学号课程号)而不是完全依赖。

解决方法:分成两个关系模式: 学生选课成绩关系(学号,课程号,成绩),课程学分关系(课程号,学分)。新关系包括两个关系模式,它们之间通过 学生选课成绩关系 中的外关键字 课程号 相联系,需要时再进行自然联接,恢复了原来的关系。

化为第三范式的例子

例:如 S1(学号姓名所在系系名称系地址

关键字 学号 决定各个属性。由于是单个关键字,没有部分依赖的问题,肯定是 2NF。但这关系肯定有大量的冗余,有关学生所在的几个属性 所在系系名称系地址 将重复存储,插入,删除和修改时也将产生类似以上例的情况。

原因:关系中存在传递依赖造成的。即 学号 -> 所在系。 而 所在系 -> 学号 却不存在,所在系 -> 系地址, 因此关键字 学号系地址 函数决定是通过传递依赖 所在系 -> 系地址 实现的。也就是说,学号 不直接决定非主属性 系地址

解决目的:每个关系模式中不能留有传递依赖。

解决方法:分为两个关系 S(学号姓名所在系),D(所在系系名称系地址

注意:关系 S 中不能没有外关键字 所在系。否则两个关系之间失去联系。

标签: #数据库如何分解3nf算法