数据库-范式
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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+,则此分解具有依赖保持性。