数据库范式(1NF2NF3NFBCNF)详解
关系数据库范式(1NF,2NF,3NF,BCNF)基本概念
关系数据库范式(1NF,2NF,3NF,BCNF)基本概念定义:符合某⼀种级别的关系模式的集合,表⽰⼀个关系内部各属性之间的联系的合理化程度。
关系模式的范式主要有4种,即第⼀范式(1NF)、第⼆范式(2NF)、第三范式(3NF)和BCNF范式。
满⾜这些范式条件的关系模式可以在不同程度上避免冗余问题、插⼊问题、更新问题和删除问题。
符合⾼⼀级范式的设计,必定符合第⼀级范式。
如符合2NF,必定符合1NF。
把⼀个给定关系模式转化为某种范式的过程称为关系范式的规范化过程,简称规范化。
1. 第⼀范式(1NF)关系模式R中每个属性的值域都是不可分的简单数据项的集合,则称这个关系模式为第⼀范式关系模式1NF。
在任何⼀个关系数据库系统中,第⼀范式都是⼀个最基本的要求。
2. 第⼆范式(2NF)定义:关系模式R是1NF的前提下,每⼀个⾮主键属性都完全函数地依赖于R的键,则R成为第⼆范式关系模式2NF。
例如,关系模式TaobaoPucharsedLog(s_id#, date, buyer_id#, buyer_name, buyer_age, seller_id#, seller_age, goods_id#, goods_name, amount), 其中的键为s_id, buyer_id, seller_id, goods_id四个。
就其中的seller_name属性来说,它仅仅依赖于键seller_id, 和其他键没有关系,即⾮主键属性seller_name部分地依赖于键{s_id#, buyer_id#, seller_id#, goods_id#},因此TaobaoPucharsedLog关系不符合2NF定义,不是2NF,这将导致三个问题:(1)插⼊异常。
插⼊时必须给定键值,如果键值的⼀部分为空,则导致数据⽆法插⼊。
(2)删除异常。
删除某个信息,整个元组就不能存在了,也必须跟着删除,从⽽丢失了其他信息,产⽣了删除异常,即不应删除的信息也删除了。
什么是数据库三大范式,它们是做什么的?
什么是数据库三⼤范式,它们是做什么的?设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越⾼的范式数据库冗余越⼩。
关系数据库有六种范式:第⼀范式(1NF)、第⼆范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,⼜称完美范式)。
满⾜最低要求的范式是第⼀范式(1NF)。
在第⼀范式的基础上进⼀步满⾜更多规范要求的称为第⼆范式(2NF),其余范式以次类推。
⼀般来说,数据库只需满⾜第三范式(3NF)就⾏了。
1、第⼀范式(1NF):所谓第⼀范式(1NF)是指在关系模型中,对于添加的⼀个规范要求,所有的域都应该是原⼦性的,即数据库表的每⼀列都是不可分割的原⼦数据项,⽽不能是集合,数组,记录等⾮原⼦数据项。
即实体中的某个属性有多个值时,必须拆分为不同的属性。
在符合第⼀范式(1NF)表中的每个域值只能是实体的⼀个属性或⼀个属性的⼀部分。
简⽽⾔之,第⼀范式就是⽆重复的域。
2、第⼆范式(2NF)在1NF的基础上,⾮码属性必须完全依赖于候选码(在1NF基础上消除⾮主属性对主码的部分函数依赖)第⼆范式(2NF)是在第⼀范式(1NF)的基础上建⽴起来的,即满⾜第⼆范式(2NF)必须先满⾜第⼀范式(1NF)。
第⼆范式(2NF)要求数据库表中的每个实例或记录必须可以被唯⼀地区分。
选取⼀个能区分每个实体的属性或属性组,作为实体的唯⼀标识。
例如在员⼯表中的⾝份证号码即可实现每个⼀员⼯的区分,该⾝份证号码即为候选键,任何⼀个候选键都可以被选作主键。
在找不到候选键时,可额外增加属性以实现区分,如果在员⼯关系中,没有对其⾝份证号进⾏存储,⽽姓名可能会在数据库运⾏的某个时间重复,⽆法区分出实体时,设计辟如ID等不重复的编号以实现区分,被添加的编号或ID选作主键。
(该主键的添加是在ER设计时添加,不是建库时随意添加),第⼆范式(2NF)要求实体的属性完全依赖于主关键字。
第一范式(1NF)、第二范式(2NF)和第三范式(3NF)之间的区别是什么?
第一范式(1NF)、第二范式(2NF)和第三范式(3NF)之间的区别是什么?构造数据库必须遵循一定的规则。
在关系数据库中,这种规则就是范式。
范式是符合某一种级别的关系模式的集合。
关系数据库中的关系必须满足一定的要求,即满足不同的范式。
目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、第四范式(4NF)、第五范式(5NF)和第六范式(6NF)。
满足最低要求的范式是第一范式(1NF)。
在第一范式的基础上进一步满足更多要求的称为第二范式(2NF),其余范式以次类推。
一般说来,数据库只需满足第三范式(3NF)就行了。
下面我们举例介绍第一范式(1NF)、第二范式(2NF)和第三范式(3NF)。
3.4.1 第一范式(1NF)在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。
所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。
如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。
在第一范式(1NF)中表的每一行只包含一个实例的信息。
例如,对于图3-2 中的员工信息表,不能将员工信息都放在一列中显示,也不能将其中的两列或多列在一列中显示;员工信息表的每一行只表示一个员工的信息,一个员工的信息在表中只出现一次。
简而言之,第一范式就是无重复的列。
3.4.2 第二范式(2NF)第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。
第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。
为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。
如图3-2 员工信息表中加上了员工编号(emp_id)列,因为每个员工的员工编号是惟一的,因此每个员工可以被惟一区分。
数据库各范式的判定标准
数据库各范式的判定标准
数据库范式是关系型数据库设计中的一种理论,用于确保数据的完整性和减少数据冗余。
以下是常见的数据库范式及其判定标准:
1. 第一范式(1NF):确保每列保持原子性,即列不能可分。
第一范式的合理遵循需要根据系统的实际需求来定。
2. 第二范式(2NF):在满足第一范式的基础上,非主键列必须完全依赖于主键,不能只依赖于主键的一部分。
3. 第三范式(3NF):在满足第二范式的基础上,任何列都不能依赖于其他非主键列。
4. 巴斯-科德范式(BCNF):在满足第三范式的基础上,任何非主键列都不能依赖于非超键列。
除了以上常见的范式外,还有其他范式,如第四范式、第五范式等,这些范式都是在前三范式的基础上进行了更严格的约束。
在实践中,通常需要满足第三范式,以避免数据冗余和破坏数据的完整性。
然而,在某些情况下,为了提高查询效率,可能会适当地违反某些范式,例如适当的水平或垂直分表等。
因此,在设计数据库时,应该根据实际需求和实际情况进行综合考虑和折中,以满足业务需求的同时保证数据的完整性和减少冗余。
数据库范式判断(1F......BCNF)
数据库范式判断(1F......BCNF)前⾔最近复习范式属实是恶⼼到我了,书本看着看着就迷,晦涩难懂。
看完了华中科技⼤学的数据库PPT、《数据库系统概论(第五版)》,在结合B站众多⽜逼的UP主的讲解视频,我终于理解了1F到BCNF的定义和判断。
接下来,我将⽤最⼩⽩的语句讲⼀讲范式是怎么回事。
定义范式难就难在涉及⼏个定义,这⼏个定义极容易混淆。
1NF:不可分割。
这个简单,数据库创建的表都是1NF,总不能像EXCEL上创建的那种花⾥胡哨的表⼀样吧。
2NF:不存在⾮主属性对候选码的部分依赖。
OK,这⾥涉及⼏个知识点。
1. 什么是⾮主属性,⾸先需要知道什么是主属性,在此之前必须要说⼀下啥是候选码。
候选码:候选码能推出所有的属性(候选码⼀定能推出⾃⾝的属性),候选码之间带不带逗号意义完全不同。
例如,在U(A,B,C,D)中AB是候选码,表⽰AB可以推出ABCD所有属性,这⾥说的ABCD并不是⼀定要右边完完整整的ABCD,⽽是他们推出的右边的属性的并集,⽐如AB->CD,或者AB->C、AB->D这都可以说AB推出ABCD。
怎么求等会会说到。
(候选码不唯⼀,但主码唯⼀) 主属性:候选码中的某些属性为主属性,注意“某些”,当然主属性也可能没有。
上个例⼦说到AB为候选码,则可能经过后⾯的判断A、B都是主属性。
怎么判断后⾯也会说。
⾮主属性:属性中除了主属性,剩下的都是⾮主属性咯。
2. 什么是部分依赖。
举个栗⼦,AB->C、A->C,这中间A能单独推出C,所以C依赖于A,但是C⼜依赖于AB,所以C部分依赖于AB。
3NF:不存在⾮主属性到候选码的传递依赖。
3.传递依赖顾名思义啦,A->B、B->C,所以C对A是传递依赖。
当然如果A->B、B->A这可不算传递依赖哦,因为这⾥A、B都是候选码\主属性,都不存在⾮主属性,那有传递依赖呀。
BCNF:已经完全消除了⾮主属性对于候选码的部份依赖和传递依赖,不存在主属性对候选码的部份依赖和传递依赖。
数据库范式(1NF2NF3NFBCNF)详解(20200521130257)
数据库的设计范式是数据库设计所需要满足的规范,满足这些规范的数据库是简洁的、结构明晰的,同时,不会发生插入(insert)、删除(delete)和更新(update)操作异常。
反之则是乱七八糟,不仅给数据库的编程人员制造麻烦,而且面目可憎,可能存储了大量不需要的冗余信息。
范式说明第一范式(1NF)无重复的列所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。
如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。
在第一范式(1NF)中表的每一行只包含一个实例的信息。
简而言之,第一范式就是无重复的列。
说明:在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。
例如,如下的数据库表是符合第一范式的:字段1 字段2 字段3 字段4而这样的数据库表是不符合第一范式的:字段1 字段2 字段3 字段4字段字段数据库表中的字段都是单一属性的,不可再分。
这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。
很显然,在当前的任何关系数据库管理系统(DBMS)中,傻瓜也不可能做出不符合第一范式的数据库,因为这些DBMS不允许你把数据库表的一列再分成二列或多列。
因此,你想在现有的DBMS中设计出不符合第一范式的数据库都是不可能的。
第二范式(2NF)属性完全依赖于主键[ 消除部分子函数依赖]如果关系模式R为第一范式,并且R中每一个非主属性完全函数依赖于R的某个候选键,则称为第二范式模式。
第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。
第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。
为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。
关系模式设计
若存在对键码的部分依赖,则作为决定因素的
键码的真子集就应作为公共属性,用来把分别存 在部分依赖(指在原来关系)和完全依赖的两个 模式自然连接在一起。
若存在对键码的完全依赖,则传递链的中间属
性就应作为公共属性,用来把构成传递链的两个 基本链所组成的模式自然连接在一起。
2.相关属性合一 把以函数依赖的形式联系在一起的相关属性放
对于关系R,若R∈1NF,且每一个非主属性完 全函数依赖于码,则R∈2NF。
第二范式不允许关系模式中的非主属性部分依
赖于键码。如果数据库模式中每个关系模式都是 2NF,则称数据库模式为2NF的数据库模式。
2NF 在 1NF基础上消除了非主属性对码的部分 函数依赖。
分解成2NF模式集的算法: 设关系模式R(U),主键是W,R上还存在函 数依赖 X → Z,并且Z是非主属性和X W,那 么W → Z就是一个部分依赖。此时应把R分解成 两个模式:
当且仅当一个关系R中,每一个元组的每一个 属性只含有一个值时,该关系属于第一范式(1NF)。
在任何一个关系数据库系统中,第一范式是对 关系模式的一个起码要求。不满足1 NF关系称为
非规范化关系,满足1 NF的关系称为规范化关系。 在任何一个关系数据库系统中,关系至少应该是 1 NF。不满足1NF的数据库模式不能称为关系数 据库。在以后的讨论中,我们假定所有关系模式 都是1NF。但是满足第一范式的关系模式并不一 定是好的关系模式,不能排除数据冗余和更新异 常等情况。 1.2第二范式(2NF)
数据库原理与应用
关系模式设计 关系数据库中的关系是满足一定要求的,满足
不同程度要求的为不同的范式。关系模式的常见 范式主要有四种,它们是第一范式(1NF)、第 二范式(2NF)、第三范式(3NF)和BC范式 (BCNF),除此之外还有第四范式(4NF)和第 五范式(5NF)。本节主要介绍关系模式的各种 范式的基本概念以及规范化算法。 1.1第一范式(1NF)
详解第一范式、第二范式、第三范式、BCNF范式
详解第⼀范式、第⼆范式、第三范式、BCNF范式什么是”范式(NF)”按照教材中的定义,范式是“符合某⼀种级别的关系模式的集合,表⽰⼀个关系内部各属性之间的联系的合理化程度”。
很晦涩吧?实际上你可以把它粗略地理解为⼀张数据表的表结构所符合的某种设计标准的级别。
就像家⾥装修买建材,最环保的是E0级,其次是E1级,还有E2级等等。
数据库范式也分为1NF,2NF,3NF,BCNF,4NF,5NF。
⼀般在我们设计关系型数据库的时候,最多考虑到BCNF就够。
符合⾼⼀级范式的设计,必定符合低⼀级范式,例如符合2NF的关系模式,必定符合1NF。
接下来就对每⼀级范式进⾏⼀下解释。
1. 第⼀范式(1NF)符合1NF的关系(你可以理解为数据表。
“关系模式”和“关系”的区别,类似于⾯向对象程序设计中”类“与”对象“的区别。
”关系“是”关系模式“的⼀个实例,你可以把”关系”理解为⼀张带数据的表,⽽“关系模式”是这张数据表的表结构。
1NF的定义为:符合1NF的关系中的每个属性都不可再分。
表1所⽰的情况,就不符合1NF的要求。
表1实际上,1NF是所有关系型数据库的最基本要求,你在关系型数据库管理系统(RDBMS),例如SQL Server,Oracle,MySQL中创建数据表的时候,如果数据表的设计不符合这个最基本的要求,那么操作⼀定是不能成功的。
也就是说,只要在RDBMS中已经存在的数据表,⼀定是符合1NF的。
如果我们要在RDBMS中表现表中的数据,就得设计为表2的形式:表2但是仅仅符合1NF的设计,仍然会存在数据冗余过⼤,插⼊异常,删除异常,修改异常的问题,例如对于表3中的设计:表31. 每⼀名学⽣的学号、姓名、系名、系主任这些数据重复多次。
每个系与对应的系主任的数据也重复多次——数据冗余过⼤2. 假如学校新建了⼀个系,但是暂时还没有招收任何学⽣(⽐如3⽉份就新建了,但要等到8⽉份才招⽣),那么是⽆法将系名与系主任的数据单独地添加到数据表中去的(注1)——插⼊异常注1:根据三种关系完整性约束中实体完整性的要求,关系中的码(注2)所包含的任意⼀个属性都不能为空,所有属性的组合也不能重复。
数据库四范式
数据库四范式一、引言数据库设计是构建一个高效、可靠的数据库系统的重要步骤。
为了确保数据库的数据一致性、完整性和可维护性,数据库设计需要遵循一定的规范和范式。
本文将介绍数据库设计中的四个范式,即第一范式、第二范式、第三范式和BCNF范式,并详细阐述每个范式的定义、特点和应用场景。
二、第一范式(1NF)第一范式是数据库设计中最基本的范式,它要求数据库中的每个属性都是原子的,即不可再分。
具体来说,每个属性不能包含多个值或多个属性。
例如,一个存储员工信息的表,每个员工可能有多个电话号码。
若将电话号码作为一个属性,那么该属性就不符合第一范式。
正确的做法是将电话号码拆分成多个属性,每个属性只存储一个电话号码。
第一范式的优点是数据结构清晰,易于维护和查询。
但由于要求属性为原子性,可能会导致数据冗余和查询效率低下。
三、第二范式(2NF)第二范式在第一范式的基础上,进一步要求非主属性完全依赖于主键。
即数据库中的每个非主属性都必须完全依赖于主键,而不能部分依赖于主键。
例如,一个存储订单信息的表,主键是订单号和商品编号。
若在该表中添加了一个非主属性“商品名称”,该属性只与商品编号有关,而与订单号无关。
这样的设计就不符合第二范式。
正确的做法是将商品名称作为一个单独的实体,与订单表通过商品编号进行关联。
第二范式的优点是消除了部分依赖,减少了数据冗余,提高了数据存储和查询的效率。
但可能会导致表之间的关联查询增多,增加了数据库的复杂度。
四、第三范式(3NF)第三范式在第二范式的基础上,进一步要求非主属性之间不存在传递依赖。
即数据库中的每个非主属性都只依赖于主键,而不依赖于其他非主属性。
例如,一个存储学生选课信息的表,主键是学生编号和课程编号。
若在该表中添加了一个非主属性“学生姓名”,该属性依赖于学生编号,而与课程编号无关。
而另一个非主属性“课程教师”依赖于课程编号,而与学生编号无关。
这样的设计就不符合第三范式。
正确的做法是将学生姓名和课程教师分别与学生表和课程表关联。
第一范式(1NF)、第二范式(2NF)和第三范式(3NF)的区别
第⼀范式(1NF)、第⼆范式(2NF)和第三范式(3NF)的区别第⼀范式(1NF): 列1唯⼀确定列2, 列3, 列4, ...,即列2, 列3, 列4, ...不能再分裂出其它列。
假设有关系模式列1: 订单名; 列2: 商品。
⼀个订单下可以有多个商品,即列2: 商品可以分裂成商品A, 商品B, 商品C, ...,所以列1: 订单名; 列2: 商品这样的关系模式不符合第⼀范式。
第⼆范式(2NF): 满⾜2NF的前提是必须满⾜1NF。
此外,关系模式需要包含两部分内容,⼀是必须有⼀个(及以上)主键;⼆是没有包含在主键中的列必须全部依赖于全部主键,⽽不能只依赖于主键的⼀部分⽽不依赖全部主键。
定义听起来有点绕,不慌,直接看图,只有全部的⾮主键列依赖于全部主键,才满⾜第⼆范式。
第三范式(3NF): 满⾜3NF的前提是必须满⾜2NF。
另外关系模式的⾮主键列必须直接依赖于主键,不能存在传递依赖。
即不能存在:⾮主键列m既依赖于全部主键,⼜依赖于⾮主键列n的情况。
定义听起来还是有点绕,不慌,直接看图,只要⾮主键内部存在传递依赖,就不满⾜第三范式。
假设存在关系模式主键1: 课程编号; 列1: 教师名; 列2: 教师家庭地址。
显然满⾜第⼀范式和第⼆范式,但是教师家庭地址传递依赖于教师名,所以不满⾜第三范式。
⽰例: 设有课程关系模式如下:R(C#, Cn, T, Ta)(其中C#为课程号,Cn为课程名,T为教师名,Ta为教师地址),并且假定不同的课程号可以有相同的课程名,每门课程只有⼀位任课教师,但每名教师可以有多门课程。
关系R范式最⾼达到()。
A)1NFB)2NFC)3NFD)BCNF【正确答案】B【解析】 ⼀个“课程号”确定⼀个“课程名”,确定⼀个“教师名”,确定⼀个“教师地址”,所以符合第⼀范式; “课程号”是⽆重复的,所以“课程号”是主键,“课程名”、“教师名”、“教师地址”均是可重复的,所以它们都是⾮主键列并完全依赖于主键“课程号”,所以符合第⼆范式; ⾮主键列“教师地址”传递依赖于⾮主键列“教师名”,所以不符合第三范式,故选B。
1NF,2NF,3NF,4NF
大部分数据库从业人员都知道关系数据库有三个基本的范式,即:第一范式,第二范式,第三范式。
当然也有牛人知道BC范式,第四范式,第五范式,第六范式,甚至还有个DK范式。
本人对数据库的范式概念也是一知半解的,想想有些可笑,搞数据库的竟然不了解关系数据库的基础——范式。
这不最近查阅了不少资料,今天把这些东东总结一下。
范式:英文名称是Normal Form,它是英国人E.F.Codd(关系数据库的老祖宗)在上个世纪70年代提出关系数据库模型后总结出来的,范式是关系数据库理论的基础,也是我们在设计数据库结构过程中所要遵循的规则和指导方法。
目前有迹可寻的共有8种范式,依次是:1NF,2NF,3NF,BCNF,4NF,5NF,DKNF,6NF。
通常所用到的只是前三个范式,即:第一范式(1NF),第二范式(2NF),第三范式(3NF)。
下面就简单介绍下这三个范式。
◆第一范式(1NF):强调的是列的原子性,即列不能够再分成其他几列。
考虑这样一个表:【联系人】(姓名,性别,电话)如果在实际场景中,一个联系人有家庭电话和公司电话,那么这种表结构设计就没有达到1NF。
要符合1NF 我们只需把列(电话)拆分,即:【联系人】(姓名,性别,家庭电话,公司电话)。
1NF 很好辨别,但是2NF 和3NF 就容易搞混淆。
◆第二范式(2NF):首先是1NF,另外包含两部分内容,一是表必须有一个主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。
考虑一个订单明细表:【OrderDetail】(OrderID,ProductID,UnitPrice,Discount,Quantity,ProductName)。
因为我们知道在一个订单中可以订购多种产品,所以单单一个OrderID 是不足以成为主键的,主键应该是(OrderID,ProductID)。
显而易见Discount(折扣),Quantity(数量)完全依赖(取决)于主键(OderID,ProductID),而UnitPrice,ProductName 只依赖于ProductID。
第一范式
第一范式(1NF):数据库表中的字段都是单一属性的,不可再分。
这个单一属性由基本类类型构成,包括整型、实数、字符型、逻辑型、日期型等。
例如,如下的数据库表是符合第一范式的:而这样的数据库表是不符合第一范式的:第二范式(2NF):数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况),也即所有非关键字段都完全依赖于任意一组候选关键字。
假定选课关系表为SelectCourse(学号, 姓名, 年龄, 课程名称, 成绩, 学分),关键字为组合关键字(学号, 课程名称),因为存在如下决定关系:(学号, 课程名称) → (姓名, 年龄, 成绩, 学分)这个数据库表不满足第二范式,因为存在如下决定关系:(课程名称) → (学分)(学号) → (姓名, 年龄)即存在组合关键字中的字段决定非关键字的情况。
由于不符合2NF,这个选课关系表会存在如下问题:(1) 数据冗余:同一门课程由n个学生选修,"学分"就重复n-1次;同一个学生选修了m 门课程,姓名和年龄就重复了m-1次。
(2) 更新异常:若调整了某门课程的学分,数据表中所有行的"学分"值都要更新,否则会出现同一门课程学分不同的情况。
(3) 插入异常:假设要开设一门新的课程,暂时还没有人选修。
这样,由于还没有"学号"关键字,课程名称和学分也无法记录入数据库。
(4) 删除异常:假设一批学生已经完成课程的选修,这些选修记录就应该从数据库表中删除。
但是,与此同时,课程名称和学分信息也被删除了。
很显然,这也会导致插入异常。
把选课关系表SelectCourse改为如下三个表:学生:Student(学号, 姓名, 年龄);课程:Course(课程名称, 学分);选课关系:SelectCourse(学号, 课程名称, 成绩)。
这样的数据库表是符合第二范式的,消除了数据冗余、更新异常、插入异常和删除异常。
数据库范式1NF2NF3NF详细阐述
数据库范式1NF2NF3NF详细阐述范式:关系数据库中的关系是要满⾜⼀定要求的,满⾜不同程度要求的不同范式。
满⾜最低要求的叫第⼀范式,简称1NF ,在第⼀范式中满⾜进⼀步要求的为第⼆范式,其余以此类推。
通俗来说是满⾜数据库关系表中的⼀套规则。
范式理论研究:Codd提出1NF,2NF,3NF概念2NF 例如:有关系模式S-L-C(Sno,Sdept,Sloc,Cno,Grade),其中Sloc为学⽣的住处,并且每个系的学⽣住在同⼀个地⽅。
S-L-C 的码为(Sno,Cno)。
则函数依赖:Grade对(Sno,Cno)是完全依赖函数。
这就属于2NF。
当然(Sno,Cno)—>Sdept 只需要其中⼀个Sno或Cno就能推出Sdept。
记做Sdept对(Sno,Cno)码的部分函数依赖,那么这就不属于2NF。
⼀个R关系模式不属于2NF就会产⽣以下⼏个问题: (1).插⼊异常:假若要插⼊⼀个学⽣Sno=S7,Sdept=PHY,Sloc=BLD2,但该学⽣还没有选课。
即这个学⽣⽆Cno。
这样的元组就插不进S-L-C中。
因⽽学⽣的固有信息⽆法插⼊ (2)删除异常:当要删除如⼀个学⽣要删除某⼀个门课程,⽽课程属性是主属性,删除了课程整个元组就必须⼀起删除,使这个学⽣的信息也被删除了,从⽽造成删除异常。
3NF 没有传递依赖,如:关系模式SJP(S,J,P)中,S是学⽣,J代表课程,P代表名次,T表⽰教师。
每⼀个学⽣选修每门课程的成绩有⼀定的名次,每门课程中每⼀名次只有⼀个学⽣。
由此得到函数依赖 (S,J)—>P;(J,P)—>S T—>J 这就是3NF总结: 1NF就是不能有表中表 2NF就是⾮主属性全部依赖 3NF就是没有传递函数。
1nf,2nf,3nf,bcnf的理解
1nf,2nf,3nf,bcnf的理解1、1NF(第一范式)第一范式是指数据库表中的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。
如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。
第一范式的模式要求属性值不可再分裂成更小部分,即属性项不能是属性组合或是由一组属性构成。
简而言之,第一范式就是无重复的列。
例如,由“职工号”“姓名”“电话号码”组成的表(一个人可能有一部办公电话和一部移动电话),这时将其规范化为1NF可以将电话号码分为“办公电话”和“移动电话”两个属性,即职工(职工号,姓名,办公电话,移动电话)。
2、2NF(第二范式)第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。
第二范式(2NF)要求数据库表中的每个实例或行必须可以被唯一地区分。
为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。
如果关系模型R为第一范式,并且R中的每一个非主属性完全函数依赖于R的某个候选键,则称R为第二范式模式(如果A是关系模式R的候选键的一个属性,则称A是R的主属性,否则称A是R的非主属性)。
例如,在选课关系表(学号,课程号,成绩,学分),关键字为组合关键字(学号,课程号),但由于非主属性学分仅依赖于课程号,对关键字(学号,课程号)只是部分依赖,而不是完全依赖,因此此种方式会导致数据冗余以及更新异常等问题,解决办法是将其分为两个关系模式:学生表(学号,课程号,分数)和课程表(课程号,学分),新关系通过学生表中的外关键字课程号联系,在需要时进行连接。
3、3NF(第三范式)如果关系模型R是第二范式,且每个非主属性都不传递依赖于R 的候选键,则称R是第三范式的模式。
以学生表(学号,姓名,课程号,成绩)为例,其中学生姓名无重名,所以该表有两个候选码(学号,课程号)和(姓名,课程号),故存在函数依赖:学号——>姓名,(学号,课程号)——>成绩,唯一的非主属性成绩对码不存在部分依赖,也不存在传递依赖,所以属性属于第三范式。
数据库范式(1NF 2NF 3NF BCNF)详解
数据库的设计范式是数据库设计所需要满足的规范,满足这些规范的数据库是简洁的、结构明晰的,同时,不会发生插入(insert)、删除(delete)和更新(update)操作异常。
反之则是乱七八糟,不仅给数据库的编程人员制造麻烦,而且面目可憎,可能存储了大量不需要的冗余信息。
范式说明1.1 第一范式(1NF)无重复的列所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。
如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。
在第一范式(1NF)中表的每一行只包含一个实例的信息。
简而言之,第一范式就是无重复的列。
说明:在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。
例如,如下的数据库表是符合第一范式的:字段1字段2字段3字段4而这样的数据库表是不符合第一范式的:字段1字段2字段3字段4字段3.1字段3.2数据库表中的字段都是单一属性的,不可再分。
这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。
很显然,在当前的任何关系数据库管理系统(DBMS)中,傻瓜也不可能做出不符合第一范式的数据库,因为这些DBMS不允许你把数据库表的一列再分成二列或多列。
因此,你想在现有的DBMS中设计出不符合第一范式的数据库都是不可能的。
1.2 第二范式(2NF)属性完全依赖于主键 [ 消除部分子函数依赖 ]如果关系模式R为第一范式,并且R中每一个非主属性完全函数依赖于R的某个候选键,则称为第二范式模式。
第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。
第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。
为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。
数据库的范式(1NF、2NF、3NF、BNCF)
数据库的范式(1NF、2NF、3NF、BNCF)第⼀范式:关系模式中,每个属性不可再分。
属性原⼦性第⼆范式:⾮主属性完全依赖于主属性,即消除⾮主属性对主属性的部分函数依赖关系。
第三范式:⾮主属性对主属性不存在传递函数依赖关系。
BNCF范式:在第三范式的基础上,消除主属性之间的部分函数依赖第⼀范式(1NF):在关系模式R中的每⼀个具体关系r中,如果每个属性值都是不可再分的最⼩数据单位,则称R是第⼀范式的关系。
例:如职⼯号,姓名,电话号码组成⼀个表(⼀个⼈可能有多个电话号码)规范成为1NF有三种⽅法: ⼀是重复存储职⼯号和姓名。
这样,关键字只能是电话号码。
⼆是职⼯号为关键字,电话号码分为单位电话和住宅电话两个属性 三是职⼯号为关键字,但强制每条记录只能有⼀个电话号码。
以上三个⽅法,第⼀种⽅法最不可取,按实际情况选取后两种情况。
第⼆范式(2NF):如果关系模式R(U,F)中的所有⾮主属性都完全依赖于任意候选关键字,则称关系R 是属于第⼆范式的。
例:选课关系 sc(sid,cid,grade,credit)其中sid为学号, cid为课程号,grade为成绩,credit为学分。
由以上条件,关键字为组合关键字(sid,cid)在应⽤中使⽤以上关系模式有以下问题: a.数据冗余,假设同⼀门课由40个学⽣选修,学分就重复40次。
b.更新异常,若调整了某课程的学分,相应的元组credit值都要更新,有可能会出现同⼀门课学分不同。
c.插⼊异常,如计划开新课,由于没⼈选修,没有学号关键字,只能等有⼈选修才能把课程和学分存⼊。
d.删除异常,若学⽣已经结业,从当前数据库删除选修记录。
某些门课程新⽣尚未选修,则此门课程及学分记录⽆法保存。
原因:⾮关键字属性credit仅函数依赖于cid,也就是credit部分依赖组合关键字(sid,cid)⽽不是完全依赖。
解决⽅法:分成两个关系模式sc(sid,cid,grade),c(cid,credit)。
bcnf例子
bcnf例子D和年龄就重复了m-1次。
(2) 更新异常:若调整了某门课程的学分,数据表中所有行的学分都要更新,否则会出现同一门课程学分不同的情况。
(3) 插入异常:假设要开设一门新的课程,暂时还没有人选修。
这样,由于还没有学号关键字,课程名称和学分也无法记录入数据库。
(4) 删除异常:假设一批学生已经完成课程的选修,这些选修记录就应该从数据库表中删除。
但是,与此同时,课程名称和学分信息也被删除了。
很显然,这也会导致插入异常。
把选课关系表selectcourse改为如下三个表:学生:student(学号, 姓名, 年龄);课程:course(课程名称, 学分);选课关系:selectcourse(学号, 课程名称, 成绩)。
这样的数据库表是符合第二范式的,消除了数据冗余、更新异常、插入异常和删除异常。
另外,所有单关键字的数据库表都符合第二范式,因为不可能存在组合关键字。
第三范式(3nf):在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。
所谓传递函数依赖,指的是如果存在a →b →c 的决定关系,则c传递函数依赖于a。
因此,满足第三范式的数据库表应该不存在如下依赖关系:关键字段→ 非关键字段x → 非关键字段y假定学生关系表为student(学号, 姓名, 年龄, 所在学院, 学院地点, 学院电话),关键字为单一关键字学号,因为存在如下决定关系:(学号) → (姓名, 年龄, 所在学院, 学院地点, 学院电话)这个数据库是符合2nf的,但是不符合3nf,因为存在如下决定关系:(学号) → (所在学院) → (学院地点, 学院电话)即存在非关键字段学院地点、学院电话对关键字段学号的传递函数依赖。
它也会存在数据冗余、更新异常、插入异常和删除异常的情况,读者可自行分析得知。
把学生关系表分为如下两个表:学生:(学号, 姓名, 年龄, 所在学院);学院:(学院, 地点, 电话)。
关系模式分解的四个范式的区别
关系模式分解的四个范式的区别在数据库设计中,关系模式分解是将一个关系模式分解为多个关系模式的过程。
范式是评估关系模式分解质量的标准,描述了关系模式的规范化程度。
常见的四个范式是第一范式(1NF)、第二范式(2NF)、第三范式(3NF)和BC范式(BCNF)。
这四个范式有着不同的要求和特点,下面将分别介绍它们的区别。
1. 第一范式(1NF)第一范式是关系模式分解的最基本要求。
它要求关系模式中的每个属性都是原子的,即不可再分。
在第一范式中,每个属性都应该是一个简单的值,而不是一个集合或多值属性。
例如,如果一个关系模式包含一个“学生”属性,那么它应该是一个单一的值,而不是一个包含多个学生的集合。
2. 第二范式(2NF)第二范式是在满足第一范式的基础上进一步的要求,它要求关系模式中的非主属性完全依赖于主键。
简单来说,非主属性不能部分依赖于主键,必须完全依赖于主键。
为了满足第二范式,需要将非主属性拆分为新的关系模式,并将其与原来的关系模式通过主键进行连接。
3. 第三范式(3NF)第三范式是在满足第二范式的基础上进一步的要求,它要求关系模式中的非主属性不传递依赖于主键。
也就是说,如果一个非主属性依赖于另一个非主属性,而这个非主属性又依赖于主键,那么就违反了第三范式。
为了满足第三范式,需要进一步将非主属性拆分为新的关系模式,并通过外键与原来的关系模式进行连接。
4. BC范式(BCNF)BC范式是在满足第三范式的基础上进一步的要求,它要求关系模式中的所有函数依赖都是由候选键决定的。
函数依赖是指一个属性的值决定其他属性的值的关系。
如果一个关系模式中存在非主属性依赖于非候选键属性的情况,那么就违反了BC范式。
为了满足BC范式,需要将非主属性拆分为新的关系模式,并通过外键与原来的关系模式进行连接。
总结:四个范式是关系模式分解过程中的逐步规范化要求,从第一范式到BC范式,要求逐渐增加。
第一范式要求属性是原子的,第二范式要求非主属性完全依赖于主键,第三范式要求非主属性不传递依赖于主键,BC范式要求所有函数依赖都由候选键决定。
范式方程式
范式方程式范式方程式什么是范式方程式?范式方程式是指将一个关系型数据库中的所有表达成一组规范化的关系模式的数学公式。
它是描述关系模式之间的联系和依赖性的一种方式,可以用来检查数据库设计是否符合规范化要求。
为什么需要范式方程式?在数据库设计中,我们需要遵循一定的规范化原则,以确保数据的完整性、减少冗余数据、提高查询效率等。
而范式方程式就是一种检验数据库设计是否符合规范化要求的方法。
常见的几种范式第一范式(1NF)第一范式要求每个属性都是原子性的,即不可再分解。
也就是说,每个属性只能包含单个值,不能包含多个值或者集合。
一个学生信息表中包含了“爱好”这个属性,并且该属性下存在多个值(如“篮球、游泳”),则该表不符合第一范式。
第二范式(2NF)第二范式要求每个非主键属性完全依赖于主键。
也就是说,如果一个关系模型中存在联合主键,则非主键属性必须与联合主键形成完整依赖关系。
一个订单详情表中包含了“商品名称”和“商品单价”这两个属性,但是这两个属性只依赖于订单编号,而不是依赖于订单编号和商品编号的组合,则该表不符合第二范式。
第三范式(3NF)第三范式要求每个非主键属性不传递依赖于主键。
也就是说,如果一个关系模型中存在非主键属性与其他非主键属性之间存在依赖关系,则需要将其拆分成多个表。
一个学生信息表中包含了“学校名称”和“学校地址”这两个属性,并且这两个属性之间存在依赖关系,则需要将其拆分成两个表:学生信息表和学校信息表。
BCNFBCNF(Boyce-Codd范式)要求每个函数依赖都是由超码(超码指的是能够唯一标识一条记录的一组属性)决定的。
也就是说,如果一个关系模型中存在多个候选码,则需要将其拆分成多个表。
一个订单详情表中包含了“商品编号”和“商品名称”这两个属性,并且这两个属性之间存在函数依赖关系,则需要将其拆分成两个表:订单详情表和商品信息表。
总结通过对范式方程式的介绍,我们可以看出,在数据库设计中遵循规范化原则是非常重要的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据库的设计范式是数据库设计所需要满足的规范,满足这些规范的数据库是简洁的、结构明晰的,同时,不会发生插入(insert)、删除(delete)和更新(update)操作异常。
反之则是乱七八糟,不仅给数据库的编程人员制造麻烦,而且面目可憎,可能存储了大量不需要的冗余信息。
范式说明第一范式(1NF)无重复的列所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。
如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。
在第一范式(1NF)中表的每一行只包含一个实例的信息。
简而言之,第一范式就是无重复的列。
说明:在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。
例如,如下的数据库表是符合第一范式的:字段1 字段2 字段3 字段4而这样的数据库表是不符合第一范式的:字段1 字段2 字段3 字段4字段字段数据库表中的字段都是单一属性的,不可再分。
这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。
很显然,在当前的任何关系数据库管理系统(DBMS)中,傻瓜也不可能做出不符合第一范式的数据库,因为这些DBMS不允许你把数据库表的一列再分成二列或多列。
因此,你想在现有的DBMS中设计出不符合第一范式的数据库都是不可能的。
第二范式(2NF)属性完全依赖于主键[ 消除部分子函数依赖]如果关系模式R为第一范式,并且R中每一个非主属性完全函数依赖于R的某个候选键,则称为第二范式模式。
第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。
第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。
为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。
这个惟一属性列被称为主关键字或主键、主码。
例如员工信息表中加上了员工编号(emp_id)列,因为每个员工的员工编号是惟一的,因此每个员工可以被惟一区分。
简而言之,第二范式(2NF)就是非主属性完全依赖于主关键字。
所谓完全依赖是指不能存在仅依赖主关键字一部分的属性(设有函数依赖W→A,若存在XW,有X→A成立,那么称W→A是局部依赖,否则就称W→A是完全函数依赖)。
如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。
假定选课关系表为SelectCourse(学号, 姓名, 年龄, 课程名称, 成绩, 学分),关键字为组合关键字(学号, 课程名称),因为存在如下决定关系:(学号, 课程名称) →(姓名, 年龄, 成绩, 学分)这个数据库表不满足第二范式,因为存在如下决定关系:(课程名称) →(学分)(学号) →(姓名, 年龄)即存在组合关键字中的字段决定非关键字的情况。
由于不符合2NF,这个选课关系表会存在如下问题:(1) 数据冗余:同一门课程由n个学生选修,"学分"就重复n-1次;同一个学生选修了m门课程,姓名和年龄就重复了m-1次。
(2) 更新异常:若调整了某门课程的学分,数据表中所有行的"学分"值都要更新,否则会出现同一门课程学分不同的情况。
(3) 插入异常:假设要开设一门新的课程,暂时还没有人选修。
这样,由于还没有"学号"关键字,课程名称和学分也无法记录入数据库。
(4) 删除异常:假设一批学生已经完成课程的选修,这些选修记录就应该从数据库表中删除。
但是,与此同时,课程名称和学分信息也被删除了。
很显然,这也会导致插入异常。
把选课关系表SelectCourse改为如下三个表:学生:Student(学号, 姓名, 年龄);课程:Course(课程名称, 学分);选课关系:SelectCourse(学号, 课程名称, 成绩)。
这样的数据库表是符合第二范式的,消除了数据冗余、更新异常、插入异常和删除异常。
另外,所有单关键字的数据库表都符合第二范式,因为不可能存在组合关键字。
第三范式(3NF)属性不依赖于其它非主属性[ 消除传递依赖]如果关系模式R是第二范式,且每个非主属性都不传递依赖于R的候选键,则称R为第三范式模式。
满足第三范式(3NF)必须先满足第二范式(2NF)。
第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。
例如,存在一个部门信息表,其中每个部门有部门编号(dept_id)、部门名称、部门简介等信息。
那么在的员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。
如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有大量的数据冗余。
第三范式(3NF):在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。
简而言之,第三范式就是属性不依赖于其它非主属性。
所谓传递函数依赖,指的是如果存在"A → B →C"的决定关系,则C传递函数依赖于A。
因此,满足第三范式的数据库表应该不存在如下依赖关系:关键字段→非关键字段x →非关键字段y假定学生关系表为Student(学号, 姓名, 年龄, 所在学院, 学院地点, 学院电话),关键字为单一关键字"学号",因为存在如下决定关系:(学号) →(姓名, 年龄, 所在学院, 学院地点, 学院电话)这个数据库是符合2NF的,但是不符合3NF,因为存在如下决定关系:(学号) →(所在学院) →(学院地点, 学院电话)即存在非关键字段"学院地点"、"学院电话"对关键字段"学号"的传递函数依赖。
它也会存在数据冗余、更新异常、插入异常和删除异常的情况,读者可自行分析得知。
把学生关系表分为如下两个表:学生:(学号, 姓名, 年龄, 所在学院);学院:(学院, 地点, 电话)。
这样的数据库表是符合第三范式的,消除了数据冗余、更新异常、插入异常和删除异常。
鲍依斯-科得范式(BCNF是3NF的改进形式)若关系模式R是第一范式,且每个属性都不传递依赖于R的候选键。
这种关系模式就是BCNF模式。
即在第三范式的基础上,数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖则符合鲍依斯-科得范式。
假设仓库管理关系表为StorehouseManage(仓库ID, 存储物品ID, 管理员ID, 数量),且有一个管理员只在一个仓库工作;一个仓库可以存储多种物品。
这个数据库表中存在如下决定关系:(仓库ID, 存储物品ID) →(管理员ID, 数量)(管理员ID, 存储物品ID) →(仓库ID, 数量)所以,(仓库ID, 存储物品ID)和(管理员ID, 存储物品ID)都是StorehouseManage的候选关键字,表中的唯一非关键字段为数量,它是符合第三范式的。
但是,由于存在如下决定关系:(仓库ID) →(管理员ID)(管理员ID) →(仓库ID)即存在关键字段决定关键字段的情况,所以其不符合BCNF范式。
它会出现如下异常情况:(1) 删除异常:当仓库被清空后,所有"存储物品ID"和"数量"信息被删除的同时,"仓库ID"和"管理员ID"信息也被删除了。
(2) 插入异常:当仓库没有存储任何物品时,无法给仓库分配管理员。
(3) 更新异常:如果仓库换了管理员,则表中所有行的管理员ID都要修改。
把仓库管理关系表分解为二个关系表:仓库管理:StorehouseManage(仓库ID, 管理员ID);仓库:Storehouse(仓库ID, 存储物品ID, 数量)。
这样的数据库表是符合BCNF范式的,消除了删除异常、插入异常和更新异常。
四种范式之间存在如下关系:范式应用我们来逐步搞定一个论坛的数据库,有如下信息:(1)用户:用户名,email,主页,电话,联系地址(2)帖子:发帖标题,发帖内容,回复标题,回复内容第一次我们将数据库设计为仅仅存在表:用户名email 主页电话联系地址发帖标题发帖内容回复标题回复内容这个数据库表符合第一范式,但是没有任何一组候选关键字能决定数据库表的整行,唯一的关键字段用户名也不能完全决定整个元组。
我们需要增加"发帖ID"、"回复ID"字段,即将表修改为:用户名email 主页电话联系地址发帖ID 发帖标题发帖内容回复ID 回复标题回复内容这样数据表中的关键字(用户名,发帖ID,回复ID)能决定整行:(用户名,发帖ID,回复ID) →(email,主页,电话,联系地址,发帖标题,发帖内容,回复标题,回复内容)但是,这样的设计不符合第二范式,因为存在如下决定关系:(用户名) →(email,主页,电话,联系地址)(发帖ID) →(发帖标题,发帖内容)(回复ID) →(回复标题,回复内容)即非关键字段部分函数依赖于候选关键字段,很明显,这个设计会导致大量的数据冗余和操作异常。
我们将数据库表分解为(带下划线的为关键字):(1)用户信息:用户名,email,主页,电话,联系地址(2)帖子信息:发帖ID,标题,内容(3)回复信息:回复ID,标题,内容(4)发贴:用户名,发帖ID(5)回复:发帖ID,回复ID这样的设计是满足第1、2、3范式和BCNF范式要求的,但是这样的设计是不是最好的呢?不一定。
观察可知,第4项"发帖"中的"用户名"和"发帖ID"之间是1:N的关系,因此我们可以把"发帖"合并到第2项的"帖子信息"中;第5项"回复"中的"发帖ID"和"回复ID"之间也是1:N的关系,因此我们可以把"回复"合并到第3项的"回复信息"中。
这样可以一定量地减少数据冗余,新的设计为:(1)用户信息:用户名,email,主页,电话,联系地址(2)帖子信息:用户名,发帖ID,标题,内容(3)回复信息:发帖ID,回复ID,标题,内容数据库表1显然满足所有范式的要求;数据库表2中存在非关键字段"标题"、"内容"对关键字段"发帖ID"的部分函数依赖,即不满足第二范式的要求,但是这一设计并不会导致数据冗余和操作异常;数据库表3中也存在非关键字段"标题"、"内容"对关键字段"回复ID"的部分函数依赖,也不满足第二范式的要求,但是与数据库表2相似,这一设计也不会导致数据冗余和操作异常。