规范化
即对关系模式(Relation schemes)进行分析,找出其函数依赖(Functional Dependencies),如果不满足范式(Normal Forms),进行分解(Decomposition)。
Functional Dependencies
如果存在到的函数依赖,表示方法为:
例如,当我们知道学号,我们就能找到唯一对应的学生姓名,存在学号到学生姓名的函数依赖。
严谨的函数依赖证明方法为:
其中,t指代关系模型r(R)中的元组,与是属性。例如,当两条记录中学号一样,则我们能推出两条记录中的学生姓名是一样的。
一个推论,如果:
则K是超码。
三种函数依赖类型:
Trivial(平凡的)函数依赖: is trivial if 。例子:
Partial(部分) Functional Dependencies: is Partial if and ,表示方法为。例如:
Transitive(传递)Functional Dependencies: is Transitive if 。例如:,因为
Normal form
Normal form (范式, NF) is a collection of relation schemas that meet certain level. A relation schema R is the nth normal form denoted by
1NF
A relation schema R is in first normal form ( 1NF) if the domains of all attributes of R are atomic. 属性都是原子的。
2NF
If the relation schema and no any non-prime attribute(非主属性)is partially dependent on the candidate key, then 。要求数据库表中的每一列都和主键直接相关,而不能只与主键的某一部分相关
例子:
未拆分的版本中,候选码为(sno, cno),存在函数依赖,因此不满足2NF,拆分后满足。
现在我们画出拆分后版本的函数依赖图,注意,虽然拆分后存在这样不和谐的函数依赖,根据定义它依然满足2NF的要求:
3NF
If the relation schema and no candidate key X, attribute set Y and non-prime attribute Z( ), so that , then .不能存在传递函数依赖
上例中进一步拆分的结果为:
一定牢记全部限制,例如,那么它满足3NF
BCNF
BCNF(Boyce Codd Normal Function): If the relation schema and for each non-trivial functional dependency , X contains a candidate key,then . 所有函数依赖的左侧都包含候选码。
例子:
巴斯-科德范式(BCNF)也被称为3.5NF,至于为何不称为第四范式,这主要是由于它是第三范式的补充版,第三范式的要求是:任何非主键字段不能与其他非主键字段间存在依赖关系,也就是要求每个非主键字段之间要具备独立性。而巴斯-科德范式在第三范式的基础上,进一步要求:任何主属性不能对其他主键子集存在依赖。
4NF
要求把同一表内的多对多关系删除。
假设每个供应商(SNO)可以生产多个零件(PNO),可以供应给多个工程(ENO),一个工程(ENO)需要多个零件(PNO),但同一个工程(ENO)的同一个零件(PNO)必须来自同一个供应商。关系SPE(SNO,PNO,ENO)对应的表数据可能是如下:
此时表SPE存在如下的函数依赖:(PNO,ENO)→SNO
根据BCNF的定义,此时表SPE属于BCNF。但是这样的关系模式仍具有不好的地方:数据冗余度太大。假如供应商S3生产了n个零件,每个零件供应给m个工程,那么显然S3要在表中重复m*n次。
4NF通俗地说,对于有三个属性的表,给定属性A一个值,剩余两个列之间不存在多对多的关系。例如,在SPE表中,给定SNO=S1,PNO和ENO之间很明显存在多对多的关系,故上表是不属于4NF的。
分解表(不同SNO的PNO不再共用):
表1(SNO,PNO)
表2(PNO,ENO)
Functional-Dependency Theory
基础概念
我们将关系模式r(R)的R定义为R(U,F),U是属性名,F是函数依赖。
如果从现有F可以推出新的函数依赖(例如)那么说F逻辑蕴含(logically imply)
F的闭包(closure)定义为所有原来的和可推出的函数依赖。
Armstrong axioms
阿姆斯特朗公理(Armstrong axioms):
自反律。若Y⊆X⊆U,则X→Y为F所蕴含。
增广律。若X→Y为F所蕴含,且Z⊆U,则XZ→YZ为F所蕴含。
传递律。若X→Y及Y→Z为F所蕴含,则X→Z为F 所蕴含。
还可以推出:
Union rule (合并律):if holds and holds, then holds.
Decomposition rule (分解律):if holds, then holds and holds.
Pseudo-transitivity rule (伪传递律):if holds and holds, then .
Closure of Attribute Sets
if ,那么我们说attribute is **functionally determined(函数确定)**by a
Let be a set of attributes in r(R) with functional dependencies F. We call the set of all attributes functionally determined by under F the closure of under F denoted as (属性集闭包)
可以推出,如果包含所有属性,那么为超码。
设有关系模式R,U= {A,B,C}为R的属性集, F为R上的函数依赖集
只在F右部出现的属性,不属于候选码
只在F左部出现的属性,一定存在于某候选码当中
两边都没有出现的属性,一定存在于候选码中
其他属性逐个与②③的属性结合得X,求属性闭包 ,直至X的闭包等于U。若等于U,则X为超码,如果验证发现子集无超码则为候选码
算法:
例子(注意闭包加上大括号!!!!!):
对于r(A,B,C,G,H,I),存在,, ,,,求
初始化
对于,因为,所以
对于,因为,所以
对于,因为,所以
对于,因为,所以
所以
BCNF Decomposition Algorithm
两条要求:
Dependency preservation(保持函数依赖,尽量保持)分解之后不能丢失函数依赖
Lossless decomposition(无损分解,必须无损)
无损分解要求:there is no loss of information by replacing r(R) with two relation schemas and 即:
=
一个辅助判断标准是should be the key of B or C.
例子1不满足无损分解:
例子2满足无损分解:
算法:即找到一个左侧不包含候选码的函数依赖,将分解为和。依照分解顺序不同,分解结果不是唯一的。最后检查是否满足无损分解。
例子1:
在左侧,存在左侧不包含候选码的函数依赖,将原模式分解为和
例子2:
对于关系R,有五个属性ABCDE,存在函数依赖
显然R不满足BC范式,分解过程为:
对于,,分解为
对于,,分解为
分解为
例子3:
对于关系R,有五个属性ABCD,存在函数依赖
显然R不满足BC范式,候选码为BD,分解过程为:
对于,,分解为
对于,,分解为
分解为
或者:
对于,,分解为
对于,,分解为
分解为
最后更新于