当前位置:文档之家› 数据库-范式

数据库-范式

1:Redundancy(冗余),可能带来的问题:冗余存储(redundant storage),插入/删除/更新异常(insert/delete/update anomalies)
冗余来源于完整性约束(Integrity constraints), 特别是函数依赖(functional dependencies)
2:函数依赖(functional dependency简写为FD)的定义:在一个关系模式R的所有关系实例中任取两个元组,如果他们的X属性的投影完全相同,则Y一定相同,则有X决定Y,或称Y依赖于X,用关系代数表示为:
for every allowable instance r of R:
例:Hourly_Emps (ssn, name, lot, rating, hrly_wages, hrs_worked),以下简写为Hourly_Emps(SNLRWH),的一个函数依赖为:S--> SNLRWH 3:关于函数依赖的三个定理及两个推论:
Armstrong’s Axioms:
自反律: 如果Y X,则有X—>Y
增广律: 如果X→Y,则对于任意的Z有XZ→YZ
传递律: 如果X→Y and Y→Z,则X→Z
推论:
两个推论的证明:
(1):Union:可以直接使用定义证明。

设r是R的任意一个关系,s,t是r的任意两个元组,若s[X]=t[X],由X→Y可得s[Y]=t[Y],
由X→Z可得s[Z]=t[Z],则有s[YZ]=t[YZ],即当s[X]=t[X]时一定可以得到s[YZ]=t[YZ],则根据函数依赖的定义可以有X→YZ。

(2):Decomposition:
Y⊆YZ,由自反律得YZ→Y,又X→YZ,由传递律得X→Y
同理可证X→Z。

4:函数依赖集的闭包:
5:属性闭包的定义:
X的属性闭包记为+X,是一个属性集合,集合中的元素A要求
X→A 在函数依赖F的属性闭包中(求属性闭包要注意是在哪个函数依赖的基础上求的)。

6:计算属性闭包的算法:
为什么需要属性闭包:对于函数依赖闭包的求解是一个NP难度问题,经常不需要求一个函数依赖的属性闭包,而只需要判断一个函数依赖
是否属于函数的依赖闭包,如判断A→E是否属于F的依赖闭包,只需求出A的属性闭包,若F属于此属性闭包则可以判断A→E属于F 的依赖闭包,否则不属于。

7关键字的重新定义:
设有关系模式R(A1,A2,…,An),F是它的函数依赖集,X是{A1,A2,…,An}的一个子集.如果:(两个条件都要满足)
1) X→A1A2…An 属于F的闭包,
2)不存在X的真子集Y使得Y→A1A2…An成立,且Y A1A2…An 属于F 的闭包.
则称X是R的一个候选关键字.
8:三种范式(normal forms 简写为NF)
(1):如果一个关系模式R的每一个具体关系r的每个属性值都是不可再分的数据单位,则称R为第一范式,简称1NF,关系型数据库一定是1NF
(2):BC范式(BCNF),对于所有的在F +中的函数依赖X→A有A∈X (平凡依赖),或者
X包含R的一个关键字属性。

注:对于某一个确定的函数依赖,只要满足上面的一个条件即可。

(3):3范式(3NF)对于所有的在F +中的函数依赖X→A有A∈X (平凡依赖),或者
X包含R的一个关键字属性,或者
A是某个关键字属性的一部分。

对于某一个确定的函数依赖,只要满足上面的一个条件即可。

BC范式是没有任何冗余的范式,3范式允许冗余的存在,一个数据库是BC范式则一定是3NF。

定义中是要求对F+中的所有函数依赖都进行判断;实际操作的时候只需对F中的函数依赖进行判断即可9:decomposition(分解):要求:
(1)Each new relation scheme contains a subset of the attributes of R and no attributes that do not appear in R
(2)Every attribute of R appears as an attribute of one of the new relations.
简单来说,关系的分解就是要求分解后的关系与原来关系中所包含的属性一样的多,不能多属性也不能少属性。

10:分解可能带来的问题:
(1):分解的太彻底造成某些查询语句的复杂度太高,分解不彻底又存在冗余问题,所以第一个问题是需要由需求来定的(2):分解需要具有无损连接性,即:
(3):依赖保持性(如何判定在后面讲述)。

11:判断分解的无损连接性:
(1)对于分解成两个关系的情况,假设分解成了(X和Y)a:如果X∩Y→X或者X∩Y→Y则,具有无损连接性。

b:特别的,如果U→V对于R成立,则分解UV和R – V具有无损连接性。

c:如果有R上的函数依赖X→Y成立,且X与Y的交集是空集,则分解R-Y和XY是无损连接分解
d:设一个关系R无损连接分解为R1和R2,接着有将R1无损连接分解为R11和R12.这样将关系R分解为R11,R12和R2是无损连接的.
(2)对于分解成多个关系且不知道分解顺序的情况,判断算法:关系模式R(A1,A2,A3,…,An),它的函数依赖集F,以及分解
ρ={R1,R2,…,Rk} ,判断ρ是否具有无损连接性.
1)构造一个k行n列的表,第i行对应于关系模式Ri,第j列对应
于属性Aj,如果Aj属于Ri,则在第i行第j列上放符号ai,否则放
符合bij.
2)逐个地检查F中的每一个函数依赖,并修改表中的元素.其方
法为:取得F中一函数依赖X Y,在X的分量中寻找相同的行,然
后将这些行中的Y的分量改为相同的符号.如果其中有ai的则
将bij改为ai;若其中无ai,则改为bij.
3)这样反复进行,如果发现某一行变成a1,a2,…,an,则分
解具有无损连接性.
12:依赖保持性,定义:
假如R被分解成了X和Y,如果(F X union F Y ) + = F+,则此分解具有依赖保持性。

13:分解成BC范式,依据:如果X Y不满足BC范式的条件,则将R 分解成R – Y和XY,分解的结果肯定满足无损连接性,但是依赖保持性不能确保,以上步骤完成后可以以下方法检验依赖保持性:
例:
如果分解完后发现不满足依赖保持性,将丢失的函数依赖加进来再进一步分解。

13:最小函数依赖集,与原函数依赖集等价的最小的函数依赖集,课件上的定义为:
要求:(1)函数依赖的右边是单属性
(2)除掉各个依赖左边的多余属性
要判断在XY→A中Y是否为多余属性,只要在F求X的属性闭包,若A包涵在X的属性闭包中则Y为多余属性,否则不是
(3)删除依赖集中多余的依赖。

从第一个依赖开始,从F中除掉它(假设该依赖为X→Y),然后在剩下的依赖中求X的闭包,如果Y包涵在闭包当中,则删除X→Y这个依赖,否则保留
14:根据最小依赖集进行三范式分解算法:
15:候选关键字求解:
(1)关系模式R(A1,A2,…,An)和函数依赖集F,可将R的属性分为四类
1)只出现在F的函数依赖左部的属性为L类
2)只出现在F的函数依赖右部的属性为R类
3)在F的函数依赖左右两边都未出现的属性为N类
4)在F的函数依赖左右两边都出现的属性为LR类
(2)如果一个函数依赖集F中的所有函数依赖左右两边都是单个属性,则该函数依赖集为单属性函数依赖集否则为多属性函数依赖集
因果函数依赖图G是一个有序二元组(R,F),记作G=(R,F),建成依赖图.其中:
1) R={A1,A2,..An}是一个有限空集,Ai(i=1,..,n)是G的结点,它们表示对应关系模式R(A1,A2,…,An)的属性,R表示其属性全集.
2)F是G的边集,其元素是G的一条有向线段(即边),每条边(Ai,Aj)表示
一个函数依赖Ai Aj,F是R的单属性最小依赖集.
图G是一个有向图,简称为FDG.
(3):开路/回路:在一条路{Ai0,Ai1},…{Ail-1,Ail}中,若Ai0<>Ail,则称该路为开路否则为回路.
引入线/引出线:若结点Ai到Aj是连接的,则边(Ai,Aj)是Ai的引出线,同时也是Aj的引入线.
原始点:只有引出线无引入线的结点.它表示L类属性
终结点:只有引入线无引出线的结点.它表示R类属性
孤立结点:即没有引入线没有引出线的结点.
独立回路:不能被其他结点到达的回路为独立回路.
关键点/关键属性:原始点,孤立点称为关键点.关键点对应的属性称为关键属性.
(4)单属性依赖集候选关键字算法
1)求F的最小依赖集F’
2)作函数依赖图FDG
3)从图中找出关全部键属性集X(X可以为空)
4)查看G中有无独立回路,若无则X为R的唯一候选关键字,结束.否则转5)
5)从各独立回路中各取一结点对应的属性与X组成一候选关键字,并重复这一过程取尽所有可能组合,即为R的候选关键字.
(5)多属性依赖集候选关键字算法
1)求F的最小依赖集F’
2)将R的属性分为L,R,N,LR四类,并令X代表L,N两类,Y代表R类.
3)求X+.若X+包含了R的全部属性,则X为R的唯一候选关键字,结束.否则转4)
4)在Y中取一属性A,求(XA)+.若它包含R的全部属性,转5).否则,调换一属性反复进行这一过程,直到试完所有Y中的属性.
5)如果已经找出所有候选关键字,则结束.否则在Y中一次取两个,三个,….求它们的属性闭包,直到其闭包中包含R的全部属性.。

相关主题