1、第一范式(1NF):数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类类型构成,包括整型、实数、字符型、逻辑型、日期型等。 例如,如下的数据库表是符合第一范式的: 字段 1 字段 2 字段 3 字段 4而这样的数据库表是不符合第一范式的: 字段 1 字段 2 字段 3 字段 4字段 3.1 字段 3.2 第二范式(2NF):数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况),也即所有非关键字段都完全依赖于任意一组候选关键字。 假定选课关系表为 SelectCourse(学号, 姓名, 年龄, 课程名称, 成
2、绩, 学分),关键字为组合关键字(学号, 课程名称),因为存在如下决定关系: (学号, 课程名称) (姓名, 年龄, 成绩, 学分) 这个数据库表不满足第二范式,因为存在如下决定关系: (课程名称) (学分) (学号) (姓名, 年龄) 即存在组合关键字中的字段决定非关键字的情况。 由于不符合 2NF,这个选课关系表会存在如下问题: (1) 数据冗余: 同一门课程由 n 个学生选修,“学分“就重复 n-1 次;同一个学生选修了 m门课程,姓名和年龄就重复了 m-1 次。 (2) 更新异常: 若调整了某门课程的学分,数据表中所有行的“学分“值都要更新,否则会出现同一门课程学分不同的情况。 (3)
3、 插入异常: 假设要开设一门新的课程,暂时还没有人选修。这样,由于还没有“学号“关键字,课程名称和学分也无法记录入数据库。 (4) 删除异常: 假设一批学生已经完成课程的选修,这些选修记录就应该从数据库表中删除。但是,与此同时,课程名称和学分信息也被删除了。很显然,这也会导致插入异常。 把选课关系表 SelectCourse 改为如下三个表: 学生:Student(学号, 姓名, 年龄); 课程:Course(课程名称, 学分); 选课关系:SelectCourse(学号, 课程名称, 成绩)。 这样的数据库表是符合第二范式的, 消除了数据冗余、更新异常、插入异常和删除异常。 另外,所有单关键
4、字的数据库表都符合第二范式,因为不可能存在组合关键字。第三范式(3NF):在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。所谓传递函数依赖,指的是如果存在“A B C“的决定关系,则 C 传递函数依赖于 A。因此,满足第三范式的数据库表应该不存在如下依赖关系: 关键字段 非关键字段 x 非关键字段 y 假定学生关系表为 Student(学号, 姓名, 年龄, 所在学院, 学院地点, 学院电话),关键字为单一关键字“学号“,因为存在如下决定关系: (学号) (姓名, 年龄, 所在学院, 学院地点, 学院电话) 这个数据库是符合 2NF 的,但是不符
5、合 3NF,因为存在如下决定关系: (学号) (所在学院) (学院地点, 学院电话) 即存在非关键字段“学院地点“、“学院电话“对关键字段“学号“的传递函数依赖。 它也会存在数据冗余、更新异常、插入异常和删除异常的情况,读者可自行分析得知。 把学生关系表分为如下两个表: 学生:(学号, 姓名, 年龄, 所在学院); 学院:(学院, 地点, 电话)。 这样的数据库表是符合第三范式的,消除了数据冗余、更新异常、插入异常和删除异常。BCNF 是由 Boyce 和 Codd 提出的,比 3NF 又进了一步,通常认为是修正的第三范式.所为第三范式,定义是关系模式 R中若不存在这样的码 X,属性组 Y 及
6、非主属性 Z,使得 X 函数确定 Y,Y 函数确定 Z 成立,Y 不能函数确定 X,则称 R为 3NF.对 3NF 关系进行投影,将消除原关系中主属性对码的部分与传递依赖,得到一组 BCNF关系。BCNF 定义,关系模式中,若 X 函数确定 Y 且 Y 不在 X 内时 X 必含有码,则此关系属于BCNF。一个满足 BCNF 的关系模式的条件:1.所有非主属性对每一个码都是完全函数依赖。2.所有的主属性对每一个不包含它的码,也是完全函数依赖。3.没有任何属性完全函数依赖于非码的任何一组属性。由于 RBCNF,按定义排除了任何属性对码的传递依赖与部分依赖,所以 R3NF。但是若 R3NF,则 R
7、未必属于 BCNF。= 鲍依斯-科得范式(BCNF):在第三范式的基础上,数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖则符合第三范式。 假设仓库管理关系表为 StorehouseManage(仓库 ID, 存储物品 ID, 管理员 ID, 数量),且有一个管理员只在一个仓库工作;一个仓库可以存储多种物品。这个数据库表中存在如下决定关系: (仓库 ID, 存储物品 ID) (管理员 ID, 数量) (管理员 ID, 存储物品 ID) (仓库 ID, 数量) 所以,(仓库 ID, 存储物品 ID)和(管理员 ID, 存储物品 ID)都是 StorehouseManage的候选关键字
8、,表中的唯一非关键字段为数量,它是符合第三范式的。但是,由于存在如下决定关系: (仓库 ID) (管理员 ID) (管理员 ID) (仓库 ID) 即存在关键字段决定关键字段的情况,所以其不符合 BCNF 范式。它会出现如下异常情况: (1) 删除异常: 当仓库被清空后,所有“存储物品 ID“和“数量“信息被删除的同时,“仓库 ID“和“管理员 ID“信息也被删除了。 (2) 插入异常: 当仓库没有存储任何物品时,无法给仓库分配管理员。 (3) 更新异常: 如果仓库换了管理员,则表中所有行的管理员 ID 都要修改。 把仓库管理关系表分解为二个关系表: 仓库管理:StorehouseManage
9、(仓库 ID, 管理员 ID); 仓库:Storehouse(仓库 ID, 存储物品 ID, 数量)。 这样的数据库表是符合 BCNF 范式的,消除了删除异常、插入异常和更新异常。I、关系数据库设计范式介绍1.1 第一范式(1NF)无重复的列所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如 果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。在第一范式(1NF)中表的每一行只包含一 个实例的信息。简而言之,第一范式就是无重复的列。说明:在任何一个关
10、系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。1.2 第二范式(2NF)属性完全依赖于主键消除部分子函数依赖第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF) 。第二范式(2NF)要求数据库表 中的每个实例或行必须可以被惟一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。例如员工信息表中加上了员工编号(emp_id) 列,因为每个员工的员工编号是惟一的,因此每个员工可以被惟一区分。这个惟一属性列被称为主关键字或主键、主码。 第二范式(2NF)要求实体的属性
11、完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部 分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。简而言之,第二范式 就是属性完全依赖于主键。1.3 第三范式(3NF)属性不依赖于其它非主属性消除传递依赖满足第三范式(3NF)必须先满足第二范式(2NF) 。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。例 如,存在一个部门信息表,其中每个部门有部门编号(dept_id) 、部门名称、部门简介等信息。那么在的员工信
12、息表中列出部门编号后就不能再将部门名 称、部门简介等与部门有关的信息再加入员工信息表中。如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有大量的数据冗余。简而言 之,第三范式就是属性不依赖于其它非主属性。II、范式应用实例剖析下面以一个学校的学生系统为例分析说明,这几个范式的应用。首先第一范式(1NF):数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型 构成,包括整型、实数、字符型、逻辑型、日期型等。在当前的任何关系数据库管理系统(DBMS)中,傻瓜也不可能做出不符合第一范式的数据库,因为这些 DBMS 不允许你把数据库表的一列再分成二列或多列。因此,你想在
13、现有的 DBMS 中设计出不符合第一范式的数据库都是不可能的。 首先我们确定一下要设计的内容包括那些。学号、学生姓名、年龄、性别、课程、课程学分、系别、学科成绩,系办地址、系办电话等信息。为了简单我们暂时只考虑这些字段信息。我们对于这些信息,说关心的问题有如下几个方面。 学生有那些基本信息 学生选了那些课,成绩是什么 每个课的学分是多少 学生属于那个系,系的基本信息是什么。 2.1 第二范式(2NF)实例分析首先我们考虑,把所有这些信息放到一个表中(学号,学生姓名、年龄、性别、课程、课程学分、系别、学科成绩,系办地址、系办电话)下面存在如下的依赖关系。 (学号) (姓名, 年龄,性别,系别,系
14、办地址、系办电话) (课程名称) ( 学分) (学号,课程) (学科成绩 )2.1.1 问题分析因此不满足第二范式的要求,会产生如下问题 数据冗余: 同一门课程由 n 个学生选修,“ 学分“就重复 n-1 次;同一个学生选修了 m 门课程,姓名和年龄就重复了 m-1 次。 更新异常: 1)若调整了某门课程的学分,数据表中所有行的“ 学分“值都要更新,否则会出现同一门课程学分不同的情况。 2)假设要开设一门新的课程,暂时还没有人选修。这样,由于还没有“ 学号“关键字,课程名称和学分也无法记录入数据库。 删除异常 : 假设一批学生已经完成课程的选修,这些选修记录就应该从数据库表中删除。但是,与此同
15、时,课程名称和学分信息也被删除了。很显然,这也会导致插入异常。2.1.2 解决方案把选课关系表 SelectCourse 改为如下三个表: 学生:Student(学号,姓名, 年龄,性别,系别,系办地址、系办电话); 课程:Course(课程名称, 学分) ; 选课关系:SelectCourse(学号, 课程名称, 成绩) 。 2.2 第三范式(3NF)实例分析接着看上面的学生表 Student(学号,姓名, 年龄,性别,系别,系办地址、系办电话 ),关键字为单一关键字“学号“ ,因为存在如下决定关系: (学号) (姓名, 年龄,性别,系别,系办地址、系办电话) 但是还存在下面的决定关系 (学
16、号) (所在学院)( 学院地点 , 学院电话) 即存在非关键字段“学院地点 “、“学院电话“对关键字段“学号“的传递函数依赖。 它也会存在数据冗余、更新异常、插入异常和删除异常的情况。 (數據的更新,刪除異常這里就不分析了,可以參照 2.1.1 進行分析)根据第三范式把学生关系表分为如下两个表就可以滿足第三范式了: 学生:(学号, 姓名, 年龄, 性别,系别 ); 系别:(系别, 系办地址、系办电话 )。总结上面的数据库表就是符合 I,II,III 范式的,消除了数据冗余、更新异常、插入异常和删除异常。关系数据库设计之时是要遵守一定的规则的。尤其是数据库设计范式 现简单介绍1NF(第一范式)
17、,2NF(第二范式) ,3NF(第三范式)和 BCNF,另有第四范式和第五范式留到以后再介绍。 在你设计数据库之时,若能符合这几个范式,你就是数据库设计的高手。 第一范式(1NF):在关系模式 R 中的每一个具体关系 r 中,如果每个属性值 都是不可再分的最小数据单位,则称 R 是第一范式的关系。例:如职工号,姓名,电话号码组成一个表(一个人可能有一个办公室电话 和一个家里电话号码) 规范成为 1NF 有三种方法: 一是重复存储职工号和姓名。这样,关键字只能是电话号码。 二是职工号为关键字,电话号码分为单位电话和住宅电话两个属性 三是职工号为关键字,但强制每条记录只能有一个电话号码。 以上三个
18、方法,第一种方法最不可取,按实际情况选取后两种情况。 第二范式(2NF):如果关系模式 R(U,F)中的所有非主属性都完全依赖于任意一个候选关键字,则称关系 R 是属于第二范式的。 例:选课关系 SCI(SNO,CNO,GRADE,CREDIT)其中 SNO 为学号, CNO 为课程号,GRADEGE 为成绩,CREDIT 为学分。 由以上条件,关键字为组合关键字(SNO,CNO) 在应用中使用以上关系模式有以下问题: a.数据冗余,假设同一门课由 40 个学生选修,学分就 重复 40 次。 b.更新异常,若调整了某课程的学分,相应的元组 CREDIT 值都要更新,有可能会出现同一门课学分不同
19、。 c.插入异常,如计划开新课,由于没人选修,没有学号关键字,只能等有人选修才能把课程和学分存入。 d.删除异常,若学生已经结业,从当前数据库删除选修记录。某些门课程新生尚未选修,则此门课程及学分记录无法保存。 原因:非关键字属性 CREDIT 仅函数依赖于 CNO,也就是 CREDIT 部分依赖组合关键字(SNO,CNO)而不是完全依赖。 解决方法:分成两个关系模式 SC1(SNO,CNO,GRADE) ,C2(CNO,CREDIT) 。新关系包括两个关系模式,它们之间通过 SC1 中的外关键字 CNO 相联系,需要时再进行自然联接,恢复了原来的关系 第三范式(3NF):如果关系模式 R(U
20、,F)中的所有非主属性对任何候选关键字都不存在传递信赖,则称关系 R 是属于第三范式的。 例:如 S1(SNO,SNAME,DNO,DNAME,LOCATION) 各属性分别代表学号, 姓名,所在系,系名称,系地址。 关键字 SNO 决定各个属性。由于是单个关键字,没有部分依赖的问题,肯定是 2NF。但这关系肯定有大量的冗余,有关学生所在的几个属性 DNO,DNAME,LOCATION 将重复存储,插入,删除和修改时也将产生类似以上例的情况。 原因:关系中存在传递依赖造成的。即 SNO - DNO。 而 DNO - SNO 却不存在,DNO - LOCATION, 因此关键辽 SNO 对 LO
21、CATION 函数决定是通过传递依赖 SNO - LOCATION 实现的。也就是说,SNO 不直接决定非主属性 LOCATION。 解决目地:每个关系模式中不能留有传递依赖。 解决方法:分为两个关系 S(SNO,SNAME,DNO) ,D(DNO,DNAME,LOCATION) 注意:关系 S 中不能没有外关键字 DNO。否则两个关系之间失去联系。 BCNF:如果关系模式 R(U,F)的所有属性(包括主属性和非主属性)都不传递依赖于 R的任何候选关键字,那么称关系 R 是属于 BCNF 的。或是关系模式 R,如果每个决定因素都包含关键字(而不是被关键字所包含) ,则 RCNF 的关系模式。
22、例:配件管理关系模式 WPE(WNO,PNO,ENO,QNT)分别表仓库号,配件号,职工号,数量。有以下条件 a.一个仓库有多个职工。 b.一个职工仅在一个仓库工作。 c.每个仓库里一种型号的配件由专人负责,但一个人可以管理几种配件。 d.同一种型号的配件可以分放在几个仓库中。 分析:由以上得 PNO 不能确定 QNT,由组合属性(WNO,PNO)来决定,存在函数依赖(WNO,PNO) - ENO。由于每个仓库里的一种配件由专人负责,而一个人可以管理几种配件,所以有组合属性(WNO,PNO)才能确定负责人,有(WNO,PNO)- ENO。因为 一个职工仅在一个仓库工作,有 ENO - WNO。
23、由于每个仓库里的一种配件由专人负责,而一个职工仅在一个仓库工作,有 (ENO,PNO)- QNT。 找一下候选关键字,因为(WNO,PNO) - QNT, (WNO,PNO)- ENO ,因此 (WNO,PNO)可以决定整个元组,是一个候选关键字。根据 ENO- WNO, (ENO,PNO)- QNT,故(ENO,PNO)也能决定整个元组,为另一个候选关键字。属性 ENO,WNO,PNO 均为主属性,只有一个非主属性 QNT。它对任何一个候选关键字都是完全函数依赖的,并且是直接依赖,所以该关系模式是 3NF。 分析一下主属性。因为 ENO- WNO,主属性 ENO 是 WNO 的决定因素,但是
24、它本身不是关键字,只是组合关键字的一部分。这就造成主属性 WNO 对另外一个候选关键字(ENO,PNO)的部 分依赖,因为(ENO,PNO)- ENO 但反过来不成立,而 P- WNO,故(ENO,PNO)- WNO 也是传递依赖。 虽然没有非主属性对候选关键辽的传递依赖,但存在主属性对候选关键字的传递依赖,同样也会带来麻烦。如一个新职工分配到仓库工作,但暂时处于实习阶段,没有独立负责对某些配件的管理任务。由于缺少关键字的一部分 PNO 而无法插入到该关系中去。又如某个人改成不管配件了去负责安全,则在删除配件的同时该职工也会被删除。 解决办法:分成管理 EP(ENO,PNO,QNT) ,关键字
25、是(ENO,PNO)工作 EW(ENO,WNO)其关键字是 ENO 缺点:分解后函数依赖的保持性较差。如此例中,由于分解,函数依赖(WNO,PNO)- ENO 丢失了, 因而对原来的语义有所破坏。没有体现出每个仓库里一种部件由专人负责。有可能出现 一部件由两个人或两个以上的人来同时管理。因此,分解之后的关系模式降低了部分完整性约束。 一个关系分解成多个关系,要使得分解有意义,起码的要求是分解后不丢失原来的信息。这些信息不仅包括数据本身,而且包括由函数依赖所表示的数据之间的相互制约。进行分解的目标是达到更高一级的规范化程度,但是分解的同时必须考虑两个问题:无损联接性和保持函数依赖。有时往往不可能
26、做到既有无损联接性,又完全保持函数依赖。需要根据需要进行权衡。 1NF 直到 BCNF 的四种范式之间有如下关系: BCNF 包含了 3NF 包含 2NF 包含 1NF 小结: 目地:规范化目的是使结构更合理,消除存储异常,使数据冗余尽量小,便于插入、删除和更新 原则:遵从概念单一化 “一事一地 “原则,即一个关系模式描述一个实体或实体间的一种联系。规范的实质就是概念的单一化。 方法:将关系模式投影分解成两个或两个以上的关系模式。 要求:分解后的关系模式集合应当与原关系模式 “等价 “,即经过自然联接可以恢复原关系而不丢失信息,并保持属性间合理的联系。 注意:一个关系模式结这分解可以得到不同关
27、系模式集合,也就是说分解方法不是唯一的。最小冗余的要求必须以分解后的数据库能够表达原来数据库所有信息为前提来实现。其根本目标是节省存储空间,避免数据不一致性,提高对关系的操作效率,同时满足应用需求。实际上,并不一定要求全部模式都达到 BCNF 不可。有时故意保留部分冗余可能更方便数据查询。尤其对于那些更新频度不高,查询频度极高的数据库系统更是如此。 在关系数据库中,除了函数依赖之外还有多值依赖,联接依赖的问题,从而提出了第四范式,第五范式等更高一级的规范化要求。在此,以后再谈。 各位朋友,你看过后有何感想,其实,任何一本数据库基础理论的书都会讲这些东西,考虑到很多网友是半途出家,来做数据库。特找一本书大抄特抄一把,各位有什么问题,也别问我了,自已去找一本关系数据库理论的书去看吧,说不定,对各位大有帮助。说是说以上是基础理论的东西,请大家想想,你在做数据库设计的时候有没有考虑过遵过以上几个范式呢,有没有在数据库设计做得不好之时,想一想,对比以上所讲,到底是违反了第几个范式呢? 我见过的数据库设计,很少有人做到很符合以上几个范式的,一般说来,第一范式大家都可以遵守,完全遵守第二第三范式的人很少了,遵守的人一定就是设计数据库的高手了,BCNF 的范式出现机会较少,而且会破坏完整性,你可以在做设计之时不考虑它,当然在ORACLE 中可通过触发器解决其缺点