关系型数据库的范式
A. 数据库有几种范式
目前关系数据库有六种范式,即第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯−科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式依次类推。一般来说,数据库只需满足第三范式(3NF)。
第一范式(1NF)第一范式(1NF)是指在关系模型中,对域添加的一个规范要求,所有的域都应该是原子性的,即数据库表的每一列都是不可分割的原子数据项,而不是集合、数组、记录等非原子数据项。即实体中的某个属性有多个值时,必须拆分为不同的属性。在符合第一范式(1NF)表中的每个域值只能是实体的一个属性或一个属性的一部分。
简而言之,第一范式(1NF)是最基本的范式,如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足第一范式(1NF)。在任何一个关系数据库中,第一范式(1NF)是对关系模式设计的基本要求,所有设计的数据模型都必须满足第一范式(1NF)。
从上面的定义描述中,可以归纳出第一范式(1NF)具有如下几个显着特点:((1)数据库表中的字段都是单一属性。
①字段不可再分。
②同一列中不能有多个值。
(2)单一属性由基本类型构成。
①整型。
②实数。
③字符型。
④逻辑型。
⑤日期型。
⑥其他类型。
满足以上两大特征的表就是符合第一范式(1NF)的表,不满足以上任一特征的表都是不符合第一范式(1NF)的表。
例如,图字段可再分的表所示的“电话”字段可以再拆分成“手机”与“座机”字段,不满足“字段不可再分”的要求,因此不符合第一范式(1NF)要求。
字段可再分的表
又如,图字段可再分的表所示的“姓名”字段包含“张伟”与“宋鑫”两个值,不满足“同一列中不能有多个值”的要求,因此也不符合第一范式(1NF)要求。
同一列中有多个值的表
第二范式(2NF)第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或记录必须可以被唯一地区分。选取一个能区分每个实体的属性或属性组,作为实体的唯一标识。例如,员工表中的身份证号码即可实现每个员工的区分,该身份证号码即候选键,任何一个候选键都可以被选作主键。在找不到候选键时,可额外增加属性以实现区分。如果在员工关系中没有对其身份证号码进行存储,而姓名可能会在数据库运行的某个时间重复,无法区分出实体时,设计身份证号码等不重复的编号以实现区分,被添加的编号选作主键。注意:该主键的添加是在ER设计时添加,不是在建库时随意添加。
第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖,是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分,通常需要为表加上一个列,以存储各个实例的唯一标识。
简而言之,第二范式(2NF)在第一范式(1NF)的基础之上更进一层。第二范式(2NF)需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一个数据库表中。
所谓联合主键,是指由两个或两个以上的字段共同组成数据表的主键。如图联合主键表所示,单凭“客户”字段无法确定表中唯一的记录,单凭“开户银行”字段也无法确定表中唯一的与“开户银行”一起组成数据表的联合主键。
联合主键表
从上面的定义描述中,可以归纳出第二范式(2NF)具有如下几个显着特点:((1)数据库表满足第一范式(1NF)。
(2)数据库中每个表均有主键。
①单字段主键。
②联合主键。即不能存在单个主键字段决定非主键字段的情况。
例如,表中有A、B、C、D、E五个字段,若A与B为联合主键(A,B),如有A决定C的情况(A→C),则不符合第二范式(2NF)。
满足以上特征的表就是符合第二范式(2NF)的表,不满足以上任何一特征的表都是不符合第二范式(2NF)的表。
例如,如图所示,所有字段均不可再拆分,因而满足第一范式(1NF)的要求,但表中没有任何一个字段可以确定表中的唯一记录,即表中没有主键,因此其不满足“数据库中每张表均有主键”的要求,所以不符合第二范式(2NF)要求。
又如,如图所示,满足第一范式(1NF)的要求,并且在原来的基础上增加了“ID”字段作为表的主键,因此其符合第二范式(2NF)要求。
没有主键的数据表
增加了主键的数据表
重新分析图1−3所示的联合主键表,此表符合第一范式(1NF)“字段不可再拆分”的要求,并且有“客户”与“开户银行”两个字段作为表的联合主键(客户,开户银行),但其是否就是一个符合第二范式(2NF)的表呢?
进一步分析,就可以发现:“客户电话”字段由“客户”字段决定,“开户行地址”字段由“开户银行”字段决定;即存在如下依赖关系:客户→客户电话,开户银行→开户行地址。
(客户,开户银行)为主键字段,(客户电话,开户行地址)为非主键字段,因此,其不符合联合主键中“不能存在单个主键字段决定非主键字段”的情况,所以可以认定其并不是符合第二范式(2NF)的数据表。
例1.1判断如图所示的学生信息表是否符合第二范式(2NF)。
图所示中存在联合主键(学号,课程编号),但存在(学号→姓名)、(课程编号→课程名)的依赖关系,即存在某个主键字段决定非主键字段的情况,因此其不符合第二范式(2NF),不是第二范式(2NF)表。可考虑把此表拆成分数表(见图)、课程表(见图)和姓名表(见图),则此三个表是符合第二范式(2NF)的表。
图学生信息表
图分数表
图课程表
图姓名表
第三范式(3NF)第三范式(3NF)是第二范式(2NF)的一个子集,即满足第三范式(3NF)必须满足第二范式(2NF)。第三范式(3NF)要求一个关系中不包含已在其他关系包含的非主关键字信息。
第三范式(3NF)就是任何非主属性不依赖于其他非主属性,也就是在满足第二范式(2NF)的基础上,任何非主属性不得传递依赖于主属性。第三范式(3NF)需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。数据不能存在传递关系,即每个属性都跟主键有直接关系而不是间接关系。如属性之间含有A→B→C这样的关系,是不符合第三范式(3NF)的。
当数据表不符合第三范式(3NF)时,会有大量的冗余数据,还会存在插入异常、删除异常、数据冗余度大、修改复杂等问题。
从上面的定义描述中,可以归纳出第三范式(3NF)具有如下几个显着特点:((1)数据库表满足第二范式。
(2)数据库表的非主键字段不存在传递依赖关系(即非主键字段不能决定其他非主键字段)。例如,表中有A、B、C、D、E五个字段,若A为主键,如有C决定D的情况(C→D)则不符合第三范式(3NF)。
满足以上特征的表就是符合第三范式(3NF)的表,不满足以上任何一特征的表都是不符合第三范式(3NF)的表。
如图所示,表中有主键(工号),因而满足第二范式(2NF)的要求;但表中非主键字段间存在传递依赖关系:非主键字段“部门”决定非主键字段“部门电话”和“部门主管”(部门→部门电话,部门→部门主管),因此不符合第三范式(3NF)的要求。
图非主键字段存在传递依赖关系的表
例1.2判断图所示的学生院属信息表是否符合第三范式(3NF)。
图学生院属信息表
图中有主键(学号),则满足第二范式(2NF)的要求,但存在(所在学院→学院电话)、(所在学院→学院地点),即存在非主键字段决定其他非主键字段的情况,因此其不符合第三范式(3NF)的要求,不是第三范式(3NF)表。可考虑把此表拆成学生表(见图)和学院表(见图),则两个表是符合第三范式(3NF)的表。
图学生表
图学院表
B. 创建关系型数据库有几种范式并详述各个范式之间的递进关系
第一范式(1NF):每一个属性都是原子项,不可分割
INF中所述的不可分割,是指在可分割的情况下必须分割,这是在应用环境中来判断的,当属性是文档时,虽然文档有段落标记,但还是不应该分割。
第二范式:每个非主属性要完全函数依赖于候选键,或者是主键。
关键词是“完全依赖”,与“部分依赖”或“局部依赖”相对,如果候选键或主键由两个属性组成,非主属性不能只依赖与其中一个或部分属性。
比如:股票日行情表由股票代码、股票名称、日期、收盘价四个属性组成,这就违反了2NF,因为“股票名称”部分依赖于“股票代码”。
第三范式:所有非主属性对任何候选关键字都不存在传递依赖
关键词是“传递依赖”,如果非主属性通过另一个非主属性依赖主键,则是传递依赖。
比如:股票基本信息表由股票代码、股票名称、企业名称、所在地区、所在省份组成,其中“所在省份”依赖于所在地区,存在传递依赖。
-----------------------------------
几个相关术语:
超键(super key):在关系中能唯一标识元组的属性集称为关系模式的超键
候选键(candidate key):不含有多余属性的超键称为候选键
主键(primary key):用户选作元组标识的一个候选键称为主键
主属性(Prime Attribute):候选键中的属性称为主属性
非主属性(Non-Key Attribute):不包含在任何候选键中的属性称为非主属性。
C. 数据库范式是什么
范式是指符合某一种级别的关系模式的集合,关系数据库中的关系必须满足一定的要求,满足不同程度要求的为不同的范式。简而言之,范式是为了消除重复数据来减少冗余数据,从而让数据库内的数据更好地组织,让磁盘空间得到更有效利用的一种标准化准则。
数据库设计对数据的存储性能,以及开发人员对数据的操作都有很大的关系,所以建立科学的、规范的数据库必须满足相关的规范准则是至关重要的。设计关系数据库时,应遵从不同的规范要求设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式。各种范式呈递次规范,越高等级的范式数据库冗余越小,满足高等级范式的先决条件是先满足低等级范式。
应用数据库范式有许多优点,但是主要优点有:((1)可以减少数据冗余,这是最重要的优点。
(2)可以消除异常,如插入异常、更新异常、删除异常等。
(3)可以让数据组织得更加和谐、合理、高效。
满足数据库设计范式规范的数据库是简洁的、结构明晰的;同时,不会发生插入(Insert)、删除(Delete)和更新(Update)操作异常。反之,不仅给数据库的编程人员带来麻烦,而且存储了大量的冗余信息。
D. 第一范式第二范式第三范式怎么区分
满足第一范式 就是每个属性都不可在拆分,满足第二范式,非属性值要完全依赖主编码 非码属性不相互依赖,满足第三范式,不存在传递依赖。
E. 关系数据库的几种设计范式
.1 第一范式(1NF)无重复的列
所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。在第一范式(1NF)中表的每一行只包含一个实例的信息。简而言之,第一范式就是无重复的列。
说明:在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。
1.2 第二范式(2NF)属性完全依赖于主键[消除部分子函数依赖]
第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被唯一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。
第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。简而言之,第二范式就是属性完全依赖于主键。
1.3 第三范式(3NF)属性不依赖于其它非主属性[消除传递依赖]
满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。第三范式就是属性不依赖于其它非主属性。
F. 怎样区分关系数据库中的六个范式
这六个范式是逐步加强,数据库设计时,满足的范式越高,理论上讲,数据冗余就越少,并且越不容易出问题。。。实际上嘛。。就不说了。。总之,一般设计数据库时要求满足第三范式第一范式的意思就是每列都不可再分,且每个表中的每列都是不重复的,只有满足了第一范式才叫关系型数据库。先满足第一范式才能满足第二范式,第二范式的意思是表中的每行必须唯一,也就是说,要有能唯一标识每行的列(或几个列也行)满足第二范式才能满足第三范式,第三范式是的意思是要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。鲍依斯-科得范式,也就是BC范式,在第三范式的基础上,消除传递依赖(传递依赖。。这个还有个定义问题:比如A->B,B->C,则A与C之间的依赖就是传递依赖)第四范式,(不废话了,反正前提是先满足前一个范式,下面也一样),消除多值依赖(多值依赖就是存在一对多的关系,间接和直接的都可能有)第五范式,这个就比较扯了,细分成第四范式以后表已经很碎了,第五范式还要求更碎。。。第五范式的目标还是消除多值依赖,不过所消除多值依赖的更难以发现,官方的说法是:保证在第四范式中存在的任何可以分解为实体的三元关系都被分解。 晕不?
G. 创建关系型数据库有几种范式
目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、Boyce-Codd范式(BCNF)、第四范式(4NF)和第五范式(5NF)
一般到BCNF就比较规范了