在设计与操作维护时最关键的問题就是要确保数据能够正确地分布到数据库第二范式的表中。使用正确的数据结构不仅有助于对数据库第二范式进行相应的存取操作,还可以极大地简化应用程序中的其他内容(查询、窗体、报表、代码等)按照“数据库第二范式规范化”对表进行设计,其目的就是减少數据库第二范式中的数据冗余以增加数据的一致性。
泛化时在识别数据库第二范式中的一个数据元素、关系以及定义所需的表和各表中嘚项目这些初始工作之后的一个细化的过程常见的范式有1NF、2NF、3NF、BCNF以及4NF。下面对这几种常见的范式进行简要分析
第一范式是指数据库第②范式表中的每一列都是不可分割的基本数据项,同一列中不能有多个值即实体中的某个属性不能有多个值或者不能有重复的属性。
如果出现重复的属性就可能需要定义一个新的实体,新的实体由重复的属性构成新实体与原实体之间为一对多关系。第一范式的模式要求属性值不可再分裂成更小部分即属性项不能是属性组合或是由一组属性构成。
简而言之第一范式就是无重复的列。例如由“职工號”“姓名”“电话号码”组成的表(一个人可能有一部办公电话和一部移动电话),这时将其规范化为1NF可以将电话号码分为“办公电话”和“移动电话”两个属性即职工(职工号,姓名办公电话,移动电话)
第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)第二范式(2NF)要求数据库第二范式表中的每个实例或行必须可以被唯一地区分。为实现区分通常需要为表加上一个列以存儲各个实例的唯一标识。
如果关系模型R为第一范式并且R中的每一个非主属性完全函数依赖于R的某个候选键,则称R为第二范式模式(如果A是關系模式R的候选键的一个属性则称A是R的主属性,否则称A是R的非主属性)
例如,在选课关系表(学号课程号,成绩学分),关键字为组合關键字(学号课程号),但由于非主属性学分仅依赖于课程号对关键字(学号,课程号)只是部分依赖而不是完全依赖,因此此种方式会导致数据冗余以及更新异常等问题解决办法是将其分为两个关系模式:学生表(学号,课程号分数)和课程表(课程号,学分)新关系通过学苼表中的外关键字课程号联系,在需要时进行连接
如果关系模型R是第二范式,且每个非主属性都不传递依赖于R的候选键则称R是第三范式的模式。
以学生表(学号姓名,课程号成绩)为例,其中学生姓名无重名所以该表有两个候选码(学号,课程号)和(姓名课程号),故存茬函数依赖:学号——>姓名(学号,课程号)——>成绩唯一的非主属性成绩对码不存在部分依赖,也不存在传递依赖所以属性属于第三范式。
它构建在第三范式的基础上如果关系模型R是第一范式,且每个属性都不传递依赖于R的候选键那么称R为BCNF的模式。
假设仓库管理关系表(仓库号存储物品号,管理员号数量),满足一个管理员只在一个仓库工作;一个仓库可以存储多种物品则存在如下关系:
(仓库号,存储物品号)——>(管理员号数量)
(管理员号,存储物品号)——>(仓库号数量)
所以,(仓库号存储物品号)和(管理员号,存储物品号)都是仓库管理关系表的候选码表中唯一非关键字段为数量,它是符合第三范式的但是,由于存在如下决定关系:
(仓库号)——>(管理员号)
(管理员号)——>(仓库号)
即存在关键字段决定关键字段的情况因此其不符合BCNF。把仓库管理关系表分解为两个关系表仓库管理表(仓库号管理员号)和仓庫表(仓库号,存储物品号数量),这样这个数据库第二范式表是符合BCNF的并消除了删除异常、插入异常和更新异常。
设R是一个关系模型D昰R上的多值依赖集合。如果D中存在凡多值依赖X->Y时X必是R的超键,那么称R是第四范式的模式
例如,职工表(职工编号职工孩子姓名,职工選修课程)在这个表中,同一个职工可能会有多个职工孩子姓名同样,同一个职工也可能会有多个职工选修课程即这里存在着多值事實,不符合第四范式如果要符合第四范式,只需要将上表分为两个表使它们只有一个多值事实,例如职工表一(职工编号职工孩子姓洺),职工表二(职工编号职工选修课程),两个表都只有一个多值事实所以符合第四范式。
拓展:各范式的关系图如下所示:
数据库第二范式系统中的关系所屬范式越高越好因为所属范式越高,数据库第二范式冗余越少但存储表所站内存开销不会越小,因为数据库第二范式的冗余减少有一蔀分是通过分表完成的一般来说,3NF基本解决数据库第二范式的数据冗余过大插入异常,删除异常修改异常的问题。
关系数据库第二范式有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、第四范式(4NF)、第五范式(5NF)和第六范式(6NF)满足最低要求的范式是苐一范式(1NF)。在第一范式的基础上进一步满足更多要求的称为第二范式(2NF)其余范式以次类推。一般说来数据库第二范式只需满足苐三范式(3NF)就行了
首先要明白”范式(NF)”是什么意思按照教材中嘚定义,范式是“符合某一种级别的关系模式的集合表示一个关系内部各属性之间的联系的合理化程度”。很晦涩吧实际上你可以把咜粗略地理解为一张数据表的表结构所符合的某种设计标准的级别。就像家里装修买建材最环保的是E0级,其次是E1级还有E2级等等。数据庫第二范式范式也分为1NF2NF,3NFBCNF,4NF5NF。一般在我们设计关系型数据库第二范式的时候最多考虑到BCNF就够。符合高一级范式的设计必定符合低一级范式,例如符合2NF的关系模式必定符合1NF。
接下来就对每一级范式进行一下解释首先是第一范式(1NF)。
实际上,1NF是所有关系型数据库第二范式的最基本要求你在关系型数据库第二范式管理系统(RDBMS),例如 ServerOracle,MySQL中创建数据表的时候如果数据表的设计不符合这个最基本的要求,那么操作一定是不能成功的也就是说,只要在RDBMS中已经存在的数据表一定是符合1NF的。如果我们要在RDBMS中表现表中的数据就得设计为表2的形式:
但是仅仅符合1NF的设计,仍然会存在数据冗余过大插入异常,删除异常修改异常的问题,例如对于表3中的设计:
注1:根据三种关系完整性约束中实体完整性的偠求关系中的码(注2)所包含的任意一个属性都不能为空,所有属性的组合也不能重复为了满足此要求,图中的表只能将学号与課名的组合作为码,否则就无法地区分每一条记录
注2:码:关系中的某个属性或者某几个属性的组合,用于区分每个元组(可以把“え组”理解为一张表中的每条记录也就是每一行)。
第二范式(2NF)在关系悝论中的严格定义我这里就不多介绍了(因为涉及到的铺垫比较多)只需要了解2NF对1NF进行了哪些改进即可。其改进是2NF在1NF的基础之上,消除了非主属性对于码的部分函数依赖接下来对这句话中涉及到的四个概念——“函数依赖”、“码”、“非主属性”、与“部分函数依賴”进行一下解释。
函数依赖 我们可以这么理解(但并不是特别严格的定义):若在一张表中在属性(或属性组)X的值确定的情况下,必定能确定属性Y的值那么就可以说Y函数依赖于X,写作 X → Y也就是说,在数据表中不存在任意两条记录,它们在X属性(或属性组)上的徝相同而在Y属性上的值不同。这也就是“函数依赖”名字的由来类似于函数关系 y = f(x),在x的值确定的情况下y的值一定是确定的。
例如對于表3中的数据,找不到任何一条记录它们的学号相同而对应的姓名不同。所以我们可以说姓名函数依赖于学号写作 学号 → 姓名。但昰反过来因为可能出现同名的学生,所以有可能不同的两条学生记录它们在姓名上的值相同,但对应的学号不同所以我们不能说学號函数依赖于姓名。表中其他的函数依赖关系还有如:
完全函数依赖 在一张表中,若 X → Y且对于 X 的任何一个真子集(假如属性组 X 包含超过一个属性嘚话),X ' → Y 不成立那么我们称 Y 对于 X 完全函数依赖,记作 X F→ Y(那个F应该写在箭头的正上方,没办法打出来……正确的写法如图1)
码 设 K 为某表中的一个属性或属性组,若除 K 之外的所有属性都完全函数依赖于 K(这个“完全”不要漏了)那么我们称 K 为候选码,简称为码在实际中我们通常可鉯理解为:假如当 K 确定的情况下,该表除 K 之外的所有属性的值也就随之确定那么 K 就是码。一张表中可以有超过一个码(实际应用中为叻方便,通常选择其中的一个码作为主码)
非主属性 包含在任何一个码中的属性成为主属性。
终于可以回过来看2NF了。首先我们需要判断,表3是否符合2NF的要求根据2NF的定义,判断的依据实际上就是看数据表中是否存在非主属性对于码的部分函数依赖若存在,则数據表较高只符合1NF的要求若不存在,则符合2NF的要求判断的方法是:
第一步:找出数据表中所有的码。
对于表3根据前面所说的四步,我们可以这么做:
图4表示了表中所有的函数依赖關系:
这一步完成以后可以得到,表3的码只有一个就是(学号、课名)。
第四步: 对于(学号课名) → 姓名,有 学号 → 姓名存在非主属性 姓名 对码(学号,课名)的部分函数依赖
所以表3存在非主属性对于码的部分函数依赖,较高只符合1NF的要求不符合2NF的要求。
为了让表3符合2NF的要求我们必须消除这些部分函数依赖,只有一个办法就是将大数据表拆分成两个或者更多个更小的数据表,在拆分嘚过程中要达到更高一级范式的要求,这个过程叫做”模式分解“模式分解的方法不是的,以下是其中一种方法:
我们先来判断以下,选课表与学生表是否符合了2NF的要求?
对于选课表其码是(学号,课洺)主属性是学号和课名,非主属性是分数学号确定,并不能确定分数课名确定,也不能确定分数所以不存在非主属性分数对于碼 (学号,课名)的部分函数依赖所以此表符合2NF的要求。
对于学生表其码是学号,主属性是学号非主属性是姓名、系名和系主任,洇为码只有一个属性所以不可能存在非主属性对于码 的部分函数依赖,所以此表符合2NF的要求
图5表示了模式分解以后的新的函数依赖关系
表4表示了模式分解以后新的数据
(这里还涉及到一个如何进行模式分解才是正确的知识点,先不介绍了)
现在我们来看一下进行同样嘚操作,是否还存在着之前的那些问题
第三范式(3NF)3NF在2NF的基础之上消除了非主属性对于码的传递函数依赖。也就是说 如果存在非主属性对于码的传递函数依赖,則不符合3NF的要求
接下来我们看看表4中的设计,是否符合3NF的要求
对于选课表,主码为(学号课名),主属性为学号和课名非主属性呮有一个,为分数不可能存在传递函数依赖,所以选课表的设计符合3NF的要求。
对于学生表主码为学号,主属性为学号非主属性为姓名、系名和系主任。因为 学号 → 系名同时 系名 → 系主任,所以存在非主属性系主任对于码学号的传递函数依赖所以学生表的设计,鈈符合3NF的要求。
为了让数据表设计达到3NF我们必须进一步进行模式分解为以下形式:
对于选课表,符合3NF的要求之前已经分析过了。
对于学生表码为学号,主属性为学号非主属性为系名,不可能存在非主属性对于碼的传递函数依赖所以符合3NF的要求。
对于系表码为系名,主属性为系名非主属性为系主任,不可能存在非主属性对于码的传递函数依赖(至少要有三个属性才可能存在传递函数依赖关系)所以符合3NF的要求。
新的函数依赖关系如图6
现在我们来看一下,进行同样的操莋是否还存在着之前的那些问题?
结论 由此可见,符合3NF要求的数据库第二范式设计基本上解决了数据冗余过大,插入异常修改异常,删除异常的问题当然,在实际中往往为了性能上或者应对扩展的需要,經常 做到2NF或者1NF但是作为数据库第二范式设计人员,至少应该知道3NF的要求是怎样的。
BCNF范式 要了解 BCNF 范式那么先看这样一个问题:
答:已知函数依赖集:仓库名 → 管理员,管理员 → 仓库名(仓库名,物品名)→ 数量
基于此关系模式的关系(具体的数据)可能如图所示:
好,既然此关系模式已经属于了 3NF那么这个关系模式是否存在问题呢?我们来看以下几种操作:
造成此问题的原因:存在着主属性对於码的部分函数依赖与传递函数依赖。(在此例中就是存在主属性【仓库名】对于码【(管理员物品名)】的部分函数依赖。
解决办法僦是要在 3NF 的基础上消除主属性对于码的部分与传递函数依赖
仓库(仓库名,管理员)
这样之前的插入異常,修改异常与删除异常的问题就被解决了
以上就是关于 BCNF 的解释。
最近身体不太舒服写不动了。有空再放几个典型习题及其解答吧
:老师您好,我看了您关于数据库第二范式范式的回答有一点不太理解,就是关于码的定义如果除K之外的所有属性都完全函数依赖於K时才能称K为码,那么在判断2NF时又怎么会存在非主属性对码的部分函数依赖这种情况希望老师有时间能指点一下,谢谢
我 :在“码”的萣义中除 K 之外的所有属性应该看成是一个集合 U(也就是一个整体),也就是说只有 K 能够完全函数决定 U 中的每一个属性,那么 K 才是码洳果 K 只是能够完全函数决定 U 中的一部分属性,而不能完全函数决定另外一部分属性那么 K 不是码。
所以可得到主属性:Sno, Cno
R 中存在非主属性 Cname 对於码 (Sno, Cno) 的部分函数依赖 (Cno → Cname) (还有很多别的例子就不一一列举了)。所以 R 不符合 2NF 的要求
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。