
第一范式(1NF):在关系模式R中的每一个具体关系r中,如果每个属性值 都是不可再分的最小数据单位,则称R是第一范式的关系。例:如职工号,姓名,电话号码组成一个表(一个人可能有一个办公室电话 和一个家里电话号码) 规范成为1NF有三种方法:
一是重复存储职工号和姓名。这样,关键字只能是电话号码。
二是职工号为关键字,电话号码分为单位电话和住宅电话两个属性
三是职工号为关键字,但强制每条记录只能有一个电话号码。
以上三个方法,第一种方法最不可取,按实际情况选取后两种情况。
第二范式(2NF):如果关系模式R(U,F)中的所有非主属性都完全依赖于任意一个候选关键字,则称关系R 是属于第二范式的。
例:选课关系 SCI(SNO,CNO,GRADE,CREDIT)其中SNO为学号, CNO为课程号,GRADEGE 为成绩,CREDIT 为学分。 由以上条件,关键字为组合关键字(SNO,CNO)
在应用中使用以上关系模式有以下问题:
a数据冗余,假设同一门课由40个学生选修,学分就 重复40次。
b更新异常,若调整了某课程的学分,相应的元组CREDIT值都要更新,有可能会出现同一门课学分不同。
c插入异常,如计划开新课,由于没人选修,没有学号关键字,只能等有人选修才能把课程和学分存入。
d删除异常,若学生已经结业,从当前数据库删除选修记录。某些门课程新生尚未选修,则此门课程及学分记录无法保存。
原因:非关键字属性CREDIT仅函数依赖于CNO,也就是CREDIT部分依赖组合关键字(SNO,CNO)而不是完全依赖。
解决方法:分成两个关系模式 SC1(SNO,CNO,GRADE),C2(CNO,CREDIT)。新关系包括两个关系模式,它们之间通过SC1中的外关键字CNO相联系,需要时再进行自然联接,恢复了原来的关系
第三范式(3NF):如果关系模式R(U,F)中的所有非主属性对任何候选关键字都不存在传递信赖,则称关系R是属于第三范式的。
例:如S1(SNO,SNAME,DNO,DNAME,LOCATION) 各属性分别代表学号,
姓名,所在系,系名称,系地址。
关键字SNO决定各个属性。由于是单个关键字,没有部分依赖的问题,肯定是2NF。但这关系肯定有大量的冗余,有关学生所在的几个属性DNO,DNAME,LOCATION将重复存储,插入,删除和修改时也将产生类似以上例的情况。
原因:关系中存在传递依赖造成的。即SNO -> DNO。 而DNO -> SNO却不存在,DNO -> LOCATION, 因此关键辽 SNO 对 LOCATION 函数决定是通过传递依赖 SNO -> LOCATION 实现的。也就是说,SNO不直接决定非主属性LOCATION。
解决目地:每个关系模式中不能留有传递依赖。
解决方法:分为两个关系 S(SNO,SNAME,DNO),D(DNO,DNAME,LOCATION)
注意:关系S中不能没有外关键字DNO。否则两个关系之间失去联系。
BCNF:如果关系模式R(U,F)的所有属性(包括主属性和非主属性)都不传递依赖于R的任何候选关键字,那么称关系R是属于BCNF的。或是关系模式R,如果每个决定因素都包含关键字(而不是被关键字所包含),则RCNF的关系模式。
例:配件管理关系模式 WPE(WNO,PNO,ENO,QNT)分别表仓库号,配件号,职工号,数量。有以下条件
a一个仓库有多个职工。
b一个职工仅在一个仓库工作。
c每个仓库里一种型号的配件由专人负责,但一个人可以管理几种配件。
d同一种型号的配件可以分放在几个仓库中。
分析:由以上得 PNO 不能确定QNT,由组合属性(WNO,PNO)来决定,存在函数依赖(WNO,PNO) -> ENO。由于每个仓库里的一种配件由专人负责,而一个人可以管理几种配件,所以有组合属性(WNO,PNO)才能确定负责人,有(WNO,PNO)-> ENO。因为 一个职工仅在一个仓库工作,有ENO -> WNO。由于每个仓库里的一种配件由专人负责,而一个职工仅在一个仓库工作,有 (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的决定因素,但是它本身不是关键字,只是组合关键字的一部分。这就造成主属性WNO对另外一个候选关键字(ENO,PNO)的部 分依赖,因为(ENO,PNO)-> ENO但反过来不成立,而P->WNO,故(ENO,PNO)-> WNO 也是传递依赖。
虽然没有非主属性对候选关键辽的传递依赖,但存在主属性对候选关键字的传递依赖,同样也会带来麻烦。如一个新职工分配到仓库工作,但暂时处于实习阶段,没有独立负责对某些配件的管理任务。由于缺少关键字的一部分PNO而无法插入到该关系中去。又如某个人改成不管配件了去负责安全,则在删除配件的同时该职工也会被删除。
解决办法:分成管理EP(ENO,PNO,QNT),关键字是(ENO,PNO)工作EW(ENO,WNO)其关键字是ENO
缺点:分解后函数依赖的保持性较差。如此例中,由于分解,函数依赖(WNO,PNO)-> ENO 丢失了, 因而对原来的语义有所破坏。没有体现出每个仓库里一种部件由专人负责。有可能出现 一部件由两个人或两个以上的人来同时管理。因此,分解之后的关系模式降低了部分完整性约束。
一个关系分解成多个关系,要使得分解有意义,起码的要求是分解后不丢失原来的信息。这些信息不仅包括数据本身,而且包括由函数依赖所表示的数据之间的相互制约。进行分解的目标是达到更高一级的规范化程度,但是分解的同时必须考虑两个问题:无损联接性和保持函数依赖。有时往往不可能做到既有无损联接性,又完全保持函数依赖。需要根据需要进行权衡。
1NF直到BCNF的四种范式之间有如下关系:
BCNF包含了3NF包含2NF包含1NF
小结:
目地:规范化目的是使结构更合理,消除存储异常,使数据冗余尽量小,便于插入、删除和更新
原则:遵从概念单一化 "一事一地"原则,即一个关系模式描述一个实体或实体间的一种联系。规范的实质就是概念的单一化。
方法:将关系模式投影分解成两个或两个以上的关系模式。
要求:分解后的关系模式集合应当与原关系模式"等价",即经过自然联接可以恢复原关系而不丢失信息,并保持属性间合理的联系。
注意:一个关系模式结这分解可以得到不同关系模式集合,也就是说分解方法不是唯一的。最小冗余的要求必须以分解后的数据库能够表达原来数据库所有信息为前提来实现。其根本目标是节省存储空间,避免数据不一致性,提高对关系的 *** 作效率,同时满足应用需求。实际上,并不一定要求全部模式都达到BCNF不可。有时故意保留部分冗余可能更方便数据查询。尤其对于那些更新频度不高,查询频度极高的数据库系统更是如此。
在关系数据库中,除了函数依赖之外还有多值依赖,联接依赖的问题,从而提出了第四范式,第五范式等更高一级的规范化要求。在此,以后再谈。
各位朋友,你看过后有何感想,其实,任何一本数据库基础理论的书都会讲这些东西,考虑到很多网友是半途出家,来做数据库。特找一本书大抄特抄一把,各位有什么问题,也别问我了,自已去找一本关系数据库理论的书去看吧,说不定,对各位大有帮助。说是说以上是基础理论的东西,请大家想想,你在做数据库设计的时候有没有考虑过遵过以上几个范式呢,有没有在数据库设计做得不好之时,想一想,对比以上所讲,到底是违反了第几个范式呢?
我见过的数据库设计,很少有人做到很符合以上几个范式的,一般说来,第一范式大家都可以遵守,完全遵守第二第三范式的人很少了,遵守的人一定就是设计数据库的高手了,BCNF的范式出现机会较少,而且会破坏完整性,你可以在做设计之时不考虑它,当然在ORACLE中可通过触发器解决其缺点。以后我们共同做设计之时,也希望大家遵守以上几个范式。
那些数据库的书介绍的数据库范式,实在是晦涩难懂,我在这里给出一个通俗的描述:
1NF:一个table中的列是不可再分的(即列的原子性)
2NF:一个table中的行是可以唯一标示的,(即table中的行是不可以有重复的)
3NF:一个table中列不依赖以另一个table中的非主键的列,还是不通俗!巨寒!!
举个例子吧:有一个部门的table,我们叫它tbl_department, 它有这么几列(dept_id(pk),dept_name,dept_memo) 有一个员工table,我们叫它tbl_employee,在这个table中有一列dept_id(fk)描述关于部门的信息,若tbl_employee要满足3NF,则在tbl_employee中就不得再有除dept_id列的其它有关部门信息的列!
一般数据库的设计满足3NF即可!(个人觉得应该尽可能的满足3NF,一家之言^_^)
BCNF:通常认为BCNF是修正的第三范式,它比3NF又进一步!
4NF:
5NF:将一个table尽可能的分割成小的块,以排除在table中所有冗余的数据
第一:列满足原子性,即求每一列都不允许再次拆分
如:表中若有“地址"列。则地址还可以拆分为:国家、省份、城市等这些列,就说明地址这列还可拆分,则不满足第三范式
第二:满足第一的基础上,除主键以外每一列都依赖于主键
如:一张表是描述学员的;有学员编号,学校名称;其中学校名称和学员编号没有依赖关系。应把学校名称放在学校表中
第三:满足第一第二的基础上,除主键以外的列都直接依赖主键。
如:城镇表依赖市表,市表依赖省表,则可以推断出城镇依赖省表;现在城镇表和省表之间就是间接相关
规范化为什么重要?目前很多的数据库由于种种原因还没有被规范化。本文中解释了其中一些原因,并用不同形式的范式(normal form)规范化了一个保险公司的理赔表。在这个过程中表的改变以及添加的一些附加表使数据库效率更高、错误更少、更容易维护。
数据库的规范化是优化表的结构和把数据组织到表中的实践,这样做数据才能更明确。规范化使你能够改变业务规则、需求和数据而不需要重新构造整个系统。
通过改变存储数据的方式--仅仅改变一丁点--并改变访问这些信息的程序,你就可以消除很多错误或垃圾数据出现的机会并减轻更新信息所必要的工作量。
公司现实存在的一个问题可以用一句话概括"我们一般都这样做"。我们一般像采用那种方式存储信息;我们一般允许人们把任何信息写入 ;我们一般采用那种方式编程。这通常是一件坏事,特别是对于年轻的和正在学习的公司来说。但是,当有新的系统和更好的完成任务的途径的时候,有时"采用那种方式任务完成得很好"这句话可能需要重新探讨和修改。规范化数据就是公司常常采用的有益的方式之一。
尽管对于COBOL程序(例如任何COBOL程序员都熟悉的文件布局)使用数据来说,把它们(数据)存储在关系数据库中与存储在平面文件中很相似,但是存储在平面文件中的方法并不是完成任务的必要的的途径,特别是由于你不了解两者之间的差别或害怕改变,而简单地把过去的观念带入到现在的方式。
注意:Dictionarycom是这样定义规范化的:"使其标准,特别使导致它符合某种标准或规范。"或"某种标准的强制接受"。Webopedia认为规范化是"在关系数据库设计中,组织数据以最小化冗余的过程。规范化通常包括把一个数据库分成两个或多个表并定义表之间的关系。其目标是隔离数据,这样添加、删除和修改某个字段只需要在一个表中进行,接着可以通过定义的关系传递到数据库中剩余的表中"。我更喜欢这个定义。
术语
在你了解现实世界中的一个保险公司的例子之前,你需要了解一些在讨论中会用到的术语。处理数据库的时候,特别是在处理规范化问题的时候,下面一部分讲到的一组新的关键字很有作用:
· 关系(Relation):从本质上说,关系是一个包含行和列的二维表或数组。
· 关联(Relationship):关联是不同表之间的数据彼此联系的方法。关联同时存在于形成不同实体的数据项之间和表实体本身之间,构成了数据库规范化的基本核心问题。数据关联有三种基本的类型,对它们有所了解是很重要的:
一对一(1:1):一对一关联意味着任何给定的每个(而不是大多数)实例严密地与另一个实体的一个实例对应。每个人只有一个正确的指纹就是的。每个电话号码准确地与一个付帐的独立私人客户对应(不是公司)。美国的每个人都只有一个社会保障号码。
一对多(1:M):一对多关联意味着给定实体的一个实例可以可以与另一个实体的零个实例、一个实例或者多个实例关联。每个人可能没有小孩、有一个小孩或多个小孩。每个人可能没有汽车、有一辆汽车或多辆汽车。
多对多(M:N):多对多关联(给定实体的零个、一个或多个实例与另一个实体的零个、一个或多个实例关联)是一种直接模拟很复杂的关联,它经常被分解为多个1:M关联。由于多个家庭混合在一起,一个或多个小孩可能没有父母亲(孤儿)、一个父母(单亲家庭),多于一个父母(两个仍然在一起或者离婚的两个父母、或者离婚了又复婚了的父母)。房屋或财产可以转让给一个人或多个人,而这些人(一个或多个)在遗嘱上可能又一个或多个房屋或财产。
· 属性(Attribute):属性被认为是程序或数据库中的某些组件的可以修改的特性或特征,它可以被设置为不同值或者关系或表中的列。
· Tuple:Tuple是关系数据库或非关系数据库中的排序了的一组值或值属性:关系中的一行。
· 删除异常:删除异常指由于其它数据故意的删除而导致的数据矛盾或未预料到的数据(信息)丢失。
· 插入异常:插入异常指由于数据的缺少或缺乏导致没有能力把信息添加到数据库。
· 更新异常:更新异常指由于数据冗余或者冗余数据的不完整更新造成的数据矛盾。
· 关系的分解:关系的分解指把一个关系分解成多个关系,从而使关系符合更高的范式。
· 数据冗余:数据冗余指数据库中没有必要的数据重复。
· 数据完整性:数据完整性指数据库中数据的一致性。保证数据完整性很重要,只有这样用户才知道他们依赖的数据是正确的、他们查询的结果以及程序才是精确的和符合期望的。
· 原子值:原子值是一个值,它既不是能被进一步拆分的一组值,也不是一个重复的组。每个列都有一个完整的值,但是只有一个值--这个值不能被分解为多个部分,它要么被数据库使用,要么被使用数据库的用户访问的信息。
· 参考完整性规则:参考完整性规则指存储在非空的外部健中的值必须是某种关系中的关键数据项。
· 外部健:外部健是一个关系中的一组属性(一个或多个列),它同时也是某种(相同的或其它的)关系中的主键。它是关系之间的逻辑链接。参考自己关系的外部健称为递归外部健。
· 功能依赖:功能依赖意味着一行中某个属性的值由该行中另一个属性的值决定。这通常出现在主键(使某行的信息片断)与该行的其它信息之间。城市和州的组合依赖于Zip(邮政)代码,即使给定的一个州中有很多Zip代码与某个城市关联。美国的每个合法的人员身份依赖于他的社会保障号码。
· 决定性:功能依赖左边的属性决定行中其它属性的值(Zip代码决定了城市和州;社会保障号码决定了人的身份;执照号码和州决定了汽车的拥有者)。
· 实体完整性规则:实体完整性规则指某一行的关键属性可能为空(如果你在某个城市就有一个Zip代码;如果你有一辆汽车就有一个执照号码)。
· 约束:约束是一种规则,它限定了数据库中的值。电话号码必须是数字的;美元数量必须是数字的;state必须是合法的州或省;country必须是合法的国家;日期不能是2月31号。
现在你已经知道了很多相关的术语了,我们可以看看相关术语中规范会的意义了。下面的例子并不是典型的雇员―经理―部门示例,也不是学生―教授―课程提供示例。我将演示一个假设的保险公司的数据库。数据库中的表比本示例中用到的要复杂得多,但是与人们遇到的比较相近。
图1显示了理赔(claim)表的非规范化定义。尽管在某个保险公司的数据库中的表比它多得多,但是这些表为我们提供了一些背景,通过它我们可以看到规范化和其分支。请记住每个章节中的示例都只有部分列,这样就简化了示例并使你轻易地看到发生变化的东西。
CLAIM_NUM、 OCCURANCE_NUM 、 CLAIM_STATUS、 ACCDNT_YR、 ACCDNT_DT、 REPORTED_DT、 ENTERED_DT、 CLAIM_DT1、 CLAIM_DT2、 CLAIM_DT3 、 CLAIM_DT4、 CLAIM_DT4 、 CLAIM_DT5 、 CLAIM_DT6 、 CLAIM_DT7、 CLAIM_DT8 、 CLAIM_DT9 、 CLAIM_DT10、 CLOSED_DT 、 DEATH_DT、 ASSIGNED_DT、 ADJSTER_CD 、ADJUSTER_NAME 、 AGENT_CD 、 AWARD_CD 、 CAUSE_CD 、 CAUSE_DESC、 LOCATION 、 SITE 、 COVERAGE_CD 、 COVERAGE_DESC、 DED_RECOV、 DEDUCTIBLE_REMAIN 、 PAID_1 、 RESERVED_1 、 PAID_2 、 RESERVED_2 、 PAID_3 、 RESERVED_3 、 PAID_4 、 RESERVED_4 、 PAID_5 、 RESERVED_5 、 PAID_6 、 RESERVED_6 、 PAID_7 、 RESERVED_7 、 PAID_8 、 RESERVED_8、 PAID_9 、 RESERVED_9 、 PAID_10 、 RESERVED_10 、 LEGAL_FLG、 KEY1、 KEY2、 KEY3、 KEY4、 KEY5、 KEY6、 KEY7、 KEY8、 KEY9、 KEY10、 SEVERITY_CD 、 POLICY_NUM 、 PAYMENT_NUM 、 SSN、 STATE、 ACTVY_DT、 ENTRY_DT、 ADMIN_CD、ADMIN_DESC、 REOPEN_DT、 INSURED_NAME、 INSURED_ADDRESS、 INSURED_PHONE、 INSURED_CITY、 INSURED_STATE、 INSURED_ZIP、 CLAIMANT_NAME、 CLAIMANT_ADDRESS、 CLAIMANT_CITY、 CLAIMANT_STATE、 CLAIMANT_ZIP、 CLAIMANT_PHONE、 SPECIAL_DT_1 、 SPECIAL_DT_2、 SPECIAL_DT_3、 SPECIAL_DT_4 、 SPECIAL_DT_5、 SPECIAL_DT_6 、 SPECIAL_DT_7 、SPECIAL_DT_8 、SPECIAL_DT_9 、 SPECIAL_DT_10 、 GROSS_PD、 POLICY_ID
1NF即第一范式,是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。
2NF即第二范式,是指每个表必须有且仅有一个数据元素为主关键字(Primary key),其他数据元素与主关键字一一对应。
3NF即第三范式,是指表中的所有数据元素不但要能唯一地被主关键字所标识,而且它们之间还必须相互独立,不存在其他的函数关系。
扩展资料:
第二范式的规则是要求数据表里的所有非主属性都要和该数据表的主键有完全依赖关系;如果有哪些非主属性只和主键的一部份有关的话,它就不符合第二范式。如果一个数据表的主键只有单一一个字段的话,它就一定符合第二范式(前提是该数据表符合第一范式)。
如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。在第一范式1NF中表的每一行只包含一个实例的信息。
参考资料来源:
百度百科——范式
百度百科——1NF
百度百科——第二范式
百度百科——第三范式
以上就是关于那位高手能给我解释一下数据库的第三范式是怎么回事全部的内容,包括:那位高手能给我解释一下数据库的第三范式是怎么回事、请达人通俗易懂的说明一下数据库的第一、第二、第三范式是什么意思最好有例子。。、数据库规范化三个范式应用实例等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)