1NF:每一字段只存储一个值,属性不能再分;
2NF:如果一个表属于1NF,任何属性只依赖于关键字。不存在部分依赖;
3NF:如果一个表属于2NF,非主属性都不传递依赖于候选键(不存在传递依赖)
BCNF:设R是一个关系模式,且每个属性(包括主属性)都不传递依赖于R的候选键
若一个关系模式R不是3NF,就会产生插入异常、删除异常、更新异常和数据冗余度等问题。所以一般情况下,关系模式应至少达到3NF。
函数依赖和多值依赖是两种最重要的数据依赖。如果只考虑函数依赖,则属于BCNF的关系模式规范化程度为最高。如果考虑多值依赖,则属于4NF的关系模式规范化程度为最高。
规范化是减少数据冗余和数据异常的一种分解过程。
1.考到范式的一个选择题
设有一个关系模式R(A,B,C,D),函数依赖集F={A→B,B→C,C→D,D→A},那么R共有4个侯选码。R的每个属性都不可分,其可达到的最高范式是BCNF 。
试题分析:
只要能推导出整个属性组U={A,B,C,D},况且没有多余元素就是候选码。在这个关系模式中,单个的A、B、C、D都能推导出U,况且只有自身一个元素无多余元素,所以都是候选码。
传递依赖的完整定义:设有关系模式R(U),X、Y、Z是属性或属性组,如果有X→Y,Y→Z,而且Y→X不成立、Z不是Y的子集、Z不是X的子集。注意,而且后面的三个条件必须都成立,才能称之为传递依赖。
很多人可能误认为R中存在传递依赖如,由A→B、B→C尽管可以得出A→C,但是C并不传递依赖A,因为由C→D、D→A可知C→A,不满足传递依赖定义中的条件“Y→X不成立”。但是,A→C是成立的,因为它可根据Armstrong推理系统中的传递律(注意,不是传递依赖,不要把两者搞混了),只是不符合传递依赖的定义罢了。
根据BCNF的定义可知,满足BCNF定义的关系模式中的每一个函数依赖的左部都含有候选码,显然,R满足BCNF的要求。
下面再看一个例题:已知关系R(A,B,C,D,E)和函数依赖集F为{AB→D,BC→E,D→C},R的每个属性均不可分,则R能满足的最高范式是2NF 。
试题分析:根据函数依赖集能推导出全部属性,而且没有多余属性的属性或者属性组就是候选码。由AB→D、D→C可得AB→C,根据Armstrong推理系统中的自反律、合并规则可得AB→BC,又BC→E,所以AB→E,因此AB能推出所有属性,而且不含多余属性,所以它是候选码。R只有AB这一个候选码。显然,非主属性C、E都是传递依赖于AB,所以R不是3NF。
那么非主属性E是否部分函数依赖于码AB呢?首先来看部分函数依赖的定义:在关系模式R(U)中,对于属性组X、Y,如果有X→Y,并且对于X的任何一个真子集X’都不能得出X’ →Y,则称Y对X完全函数依赖。而如果X→Y,但Y不完全函数依赖于X,则称Y对X部分函数依赖。可见部分函数依赖是在完全函数依赖的基础上定义的,也就是说不满足完全函数依赖就是部分函数依赖。
该题中,根据Armstrong推理系统可得AB→E,属性组AB的真子集有A、B、空集φ,但由单个的A不能得出A→E,由单个的B也不能得出B→E,空集φ显然也不能得出φ→E,所以E是完全函数依赖AB。同理,可以得出其它非主属性C、D都是完全函数依赖码AB,所以R∈2NF。
Armstrong推理
自反律:若属性集Y 包含于属性集X,属性集X 包含于U,则X→Y 在R 上成立。(此处X→Y是平凡函数依赖)
增广律:若X→Y 在R 上成立,且属性集Z 包含于属性集U,则XZ→YZ 在R 上成立。
传递律:若X→Y 和 Y→Z在R 上成立,则X →Z 在R 上成立。