浅谈关系数据库理论

浅谈关系数据库理论

1.规范化问题提出

1.规范化理论的主要内容

​ 在关系数据库中,关系模型包括一组关系模式,并且关系之间并不是完全孤立的。设计一个适合的关系型数据库的关键是设计关系型数据库的模式,具体包括,数据库中应该包含多少个关系模式,每个关系模式应该包含哪些属性,以及如何将这些相互关联的关系模式组建成一个完整的关系型数据库。

​ 关系数据库规范化理论主要包含三个方面的内容

(1)函数依赖

(2)范式

(3)模式设计

其中,函数依赖起着核心的作用,是模式分解和模式设计的基础,范式是模式分解的标准。

2.不合理的关系模式存在的异常问题

1.数据冗余

2.插入异常

3.更新异常

4.删除异常

……

​ 经过分解后的关系模式是一个鬼烦的关系数据库模式,于是得出结论一个规范的关系模式应该具有以下几个条件

(1)尽可能少的数据冗余

(2)没有插入异常

(3)没有删除异常

(4)没有更新异常

​ 按照一定的规范设计关系模式,将结构复杂的关西分解成简单的关系,从而把不规范的关系数据库模式转变为规范的关系数据库模式,这就是关系的规范化。

2.函数依赖

1.函数依赖的定义

​ 关系模式之间属性之间想互依赖、相互制约的联系称为数据依赖。数据依赖一般分为函数依赖和多值依赖。其中,函数依赖是重要的数据依赖。

​ 函数依赖。关系模式属性之间的一种逻辑依赖关系。

即,设关系模式R(U,F),U是属性全集,F是U上的函数依赖所构成的集合,X,Y是U的子集,如果对于R中任意可能的一个关系r,对于每一个具体的X的值,Y都有唯一的具体值与之对应,则称X决定函数Y,或者函数Y依赖于X,记为X→Y。X为决定因素,Y为依赖因素。

说明

(1)平凡函数依赖与非平凡函数依赖

​ 当属性集Y是属性集X的子集的时候,则必然存在着函数依赖X→Y,这类型的韩数依赖称为平凡函数依赖。

​ 如果Y不是X的子集的时候,这类型的函数函数依赖称之为非平凡函数依赖。

(2)函数依赖不是关系模式R的某些关系实例的约束条件,而是关系模式R之下的一切可能的关系实例都要满足的约束条件。

(3)函数依赖是语义范畴的概念。我们只能通过语义来确定一个函数依赖,无法通过其形式化定义来证明一个函数依赖是否成立,实际上。函数依赖是对现实世界中事物性质之间的相关性的一种断言。

(4)函数依赖于属性之间的联系类型有关。

2.函数依赖的逻辑蕴含的定义

​ F是在关系模式R(U)上成立的函数依赖集合,X,Y时属性集U的子集,X→Y是一个函数依赖。如果从F中能够推导出X→Y,即,如果对于R的每个满足F的关系r也满足X→Y,则称X→Y为F的逻辑蕴含,或者F逻辑蕴含X→Y,记作F|=X→Y。

​ 设F是函数依赖集,被F逻辑蕴含的全部函数依赖集合称为函数依赖F的闭包.记作F+

3.函数依赖的推理规则及其正确性

​ 1.Armstrong公理

(1)自反律

(2)增广律

(3)传递律

2.推论

(1)合并律

(2)伪传递律

(3)分解律

(4)复合律

4.完全函数依赖与部分函数依赖

​ 设有关系模式R(U),U是属性全集,X,Y是U的子集,如果X→Y,并且对于X的任何一个真子集X’,都有X’不决定Y,则称Y对X完全函数依赖。如果存在X的某个真子集X’决定Y,则称,Y对X部分函数依赖。

5.传递函数依赖

​ 设有关系模式R(U),U是属性全集,X,Y,Z是U的子集,若X决定Y,但是Y不决定X而Y决定Z,则称Z对X传递函数依赖。如果,X决定Y,Y决定X,Y决定Z,则称,Z对X直接函数依赖。
即,函数依赖分为完全函数依赖和,部分函数依赖,传递函数依赖三类,它们是规范化理论的依据和规范化程度的准则。

6.属性集的闭包及其算法

​ 在实际的工作中,人们往往想要知道某个函数依赖是否成立,如果已经求出F+,则只要检查该函数依赖是否在F+即可得到准确的结果。

​ 为了能尽快的找到F+,人们将计算F+,简化为计算属性集的闭包X+,即,若要判断某个函数是否在F+中,只要找到那些由X决定的属性集,即X的属性集的闭包X+就能得到答案。

​ 1.设有关系模式R(U),属性集是U,F是R上的函数依赖集,X是U的子集,用函数依赖得推理规则可从F推出的函数依赖X→A中所有A得集合,称为属性即X关于F的闭包。记作X+

即X+={属性A|X→A在F+中}

​ 2.属性集闭包算法

​ 设属性集X的闭包是result

输入:属性集U,U上的函数依赖集F,X,X包含于U。

输出:X相对于F的闭包X+

方法:result=X

do

{

if F 中有某个函数依赖Y→Z满足Y包含于result //Y为已经找到的属性集闭包的子集

then result=result和Z的交集

}

while (result 有所改变)

​ 3.属性值闭包算法的用途

(1)判断属性集X是否为关系的码,通过计算X+,查看X+是否包含了R中的全部属性,如果是,则X是R的一个码,否则,不是码。

(2)通过检验Y是否包含于X+,我们可以去验证X→Y是否成立。

(3)该算法还给我们另一只种设计函数依赖集F的闭包F+的方法,对于任意的子集X,可以计算其闭包X+,对于任意的Y包含于X+,输出一个函数依赖X→Y。

7.候选码的求解理论及其算法

1.候选码

​ 设关系模式R的属性集是U,X是U的一个子集,F是在R上成立的一个函数依赖集。如果X→U在R上成立(即X→U在F+中),那么称X是R的一个超码。

​ 如果X→U在R上成立,但是,对于X的任一真子集X都有X’→U不成立(即X→U不在F+中),那么称X是R上的一个候选码。

​ 超码虽然能决定所有的属性,但是,其中也可以包含除候选码以外的其他属性。

2.快速求解候选码的一个充分条件

​ 对于给定的关系模式R(A1,A2……)和函数依赖集F,可以将其属性分为·11以下四类

(1)L类:仅出现在F中的函数依赖的左边的左部属性

(2)R类:仅出现在F中的函数依赖的右边的右部属性

(3)N类:在F的函数依赖左右两边均未出现的属性

(4)LR类:在F的函数依赖左右两边都出现的属性

定理

​ X属于R

(1)若X是L属性,则X必是R的任一候选码的成员

(2)若X是L属性,且X+包含R的全部属性,则X必为R的唯一候选码。

(3)若X是R属性,则X不在R的任何候选码中

(4)若X是N属性,则X必为R的任一候选码的成员

(5)若X是R的N类和L类属性的组合组成的属性集,且X+包含了R的全部属性,则X是R的唯一候选码。

(6)若X是LR属性,则X可能为R的任一候选码成员,也可能不是R的任一候选码成员。

3.多属性函数依赖集候选码的求解算法

​ 设有关系模式R,F是R上的函数依赖集,求R的所有候选码

​ 输入:关系模式R以及函数依赖集F

​ 输出:关系模式R的所有候选码

​ (1)根据函数依赖集F,将R的所有属性分类(L、R、LR、N)并令X代替L类属性和N类属性

​ 令Y代替LR类属性。

​ (2)求X+,若X+包含了R的全部属性,则X是R的唯一候选码,转(5),否则,转(3)。

​ (3)在Y中任取一个属性A,求(XA)+,如果它包含了R的全部属性则转(4),否则,调换Y中的其他 属性重复这一操作,直到试完Y中的全部属性。

​ (4)如果已经找出所有的候选码,则转(5),否则在Y中依次取两个属性,三个属性……求它们 与X的属性集的闭包,直到闭包包含R的全部属性。

​ (5)停止,输出结果。

8.函数依赖推理规则的完备性

​ 推理规则的正确性是指从函数依赖集F使用推理规则退出函数依赖必定在

F+中。完备性是指F+中的函数依赖都能从F中使用推理规则推出。

​ 正确性保证了推出的所有的函数依赖都是正确的。完备性保证了可以推出所有被蕴含的函数依赖。这就保证了推导的有效性和可靠性。

9.函数依赖集的等价、覆盖和最小函数依赖集

​ 1.关系模式R有连个函数依赖集F和G,如果满足F+=G+,则称F和G是等价的函数依赖,记作F \equiv G。

如果F与G等价,就说F覆盖G,或者G覆盖F。

​ 两个等价的函数依赖在表示能力上是完全相同的。

2.最小函数依赖

​ 函数依赖集F中的函数依赖很多。我们应该去掉无关的函数依赖、平凡函数依赖、函数依赖中的无关属性,以求得F上的函数依赖数量最少的最小函数依赖集 Fmin

​ 设F是属性集U上的函数依赖集。如果Fmin是F的一个最小函数依赖集,那么

(1)Fmin+=F+

(2)每个函数依赖的右边都是单属性

(3)Fmin中没有冗余的函数依赖(即在Fmin中不存在这样的函数依赖X \rightarrow Y,使得Fmin与Fmin-{X \rightarrow Y}等价),即减少任何一个函数依赖都与原来的F不等价

(4)每个函数依赖的左边没有冗余的属性,减少任何一个函数依赖的左部属性之后,都将与原来的F不等价。

3.最小函数依赖求解算法

(1)将F中的每个函数依赖的右边均变成单属性。

​ 如X \rightarrow Z,Z=Z1,Z2……,多于一个属性,使用推理规则中的分解律,分解为X \rightarrow Z1,X \rightarrow Z2……,代替 X \rightarrow Z

​ 使函数依赖都变为右边是单属性

(2)去掉F中的函数依赖的左部冗余属性。

​ 一个一个检查左边是非单属性的函数依赖,如XY \rightarrow A,现在要判断左边是否具有冗余属性,就以X \rightarrow A代替原来的函数依赖,判断是否等价,只要在G+中求X+,并且判断是否包含A,则说名X \rightarrow A是否可以代替原来的函数依赖。依次判断,就可以消除函数依赖的左边的多于属性。

(3)在G中消除冗余的函数依赖

​ 从的一个函数依赖(X \rightarrow Y)开始,在G中去掉它,然后在剩下的函数依赖中求X+,判断X+是否包含Y,若是,则去掉(X \rightarrow Y),若不包含,则不能去掉。依次进行下去。

10.关系模式分解

​ 分解就是使用关系代数的投影运算把一个关系模式拆成几个关系模式,使数据结构更加合理。避免在操作的时候出现异常情况。

1.模式分解题

​ 两个角度考虑

(1)是否无损分解。

(2)分解之后是否还保持函数依赖。

2.无损分解的测试算法

​ 输入:一个关系模式R,F是R上的函数依赖集,R的一个分解P{R1,R2,……}

​ 输出:判断P相对于F是否是无损连接分解

(1)构造一个k行n列的表格,每一列对应一个属性Aj,每一行对应一个模式Ri。如果Aj在Ri中,则在表中的第i行第j列处填上aj,否则在该处填上bij

(3)把表格看成R的一个关系,根据F中的每个函数依赖,修改表中元素符号的;

​ 即

​ a.对F中的某个函数依赖(X \rightarrow Y),再表中找X分量上相等的行,把这些行的Y分量都改成一致。

​ b.如果列中有一个是aj,那么这一列上(X相同的行)的元素都改成aj

​ c.如果列中没有aj,那么这一列上的元素都改成bij,

​ d.对F中所有的函数依赖,反复的执行上述的修该操作,一直到表格不能修改为止

(3)若修改到最后,表中有一行全为a,那么P相对于R是无损连接分解。

3.保持函数依赖的分解

​ 通过保持函数依赖的分解后,即将R分解为R1,R2,……,函数依赖集F应该被在Ri上的投影所蕴含。因为,F中函数依赖实质上是对对关系模式R的完整性约束,R分解后也要保持F的有效性,否则数据的完整性将受到破坏。

​ 但是,一个无损连接分解不一定是一个保持函数依赖的,同样,一格保持函数依赖的分解也不一定是无损连接分解。

11.关系模式的范式

​ 关系模式规范化的基本思想就是消除关系模式中的数据冗余,消除数据依赖中不合适的部分。解决数据操纵时发生的异常情况。这就要求关系模式一定要能满足一定的条件。

​ 把关系模式规范化过程中为不同程度的规范化要求设立不同的标准称为范式。

​ 由于规范化程度不同,就产生了不同的范式。

1.第一范式

​ 如果关系模式R中的属性均为原子属性,即每个属性都是不可再分的原子项。则称R属于第一范式,简称1NF,记作R$\in$1NF。

​ 1NF是关系模式应该具备的最起码的条件

2.第二范式

​ 如果关系模式r$\in 1 N F , R R 1NF,且每个非主属性都完全函数依赖于关系模式的主码。则称R属于第二范式,记作R \in$2NF。

​ 如果关系的主码是单属性,则不可能存在对主码的部分函数依赖。

结论

(1)从1NF关系中消除非主属性对主码的部分函数依赖就可以得到2NF关系。

(2)如果R的主码是单属性,或者R的全体属性都是主属性,则R$\in$2NF。

2.2NF规范化

​ 将1NF关系模式通过投影分解,转换成2NF关系模式的集合。

​ 分解是遵循“一事一地”原则,即让一个关系只描述一个实体或者实体之间的联系。如果多于一个实体或者联系,则使用投影分解。

3.第三范式

​ 如果R属于第二范式,而且每个非主属性都不传递依赖于R的主码,则称R属于第三范式。记作R$\in$3NF。

第三范式的规范化

​ 3NF可以通过将2NF的关系模式进行投影分解转换成3NF关系模式的集合。

​ 3NF规范化时遵循的原则与2NF相同,即,让一个关系只描述一个实体或者一个实体之间的联系。

4.BC范式

​ 如果关系模式R$\in 1 N F , X 1NF,且所有函数依赖X \rightarrow Y ( X Y(X \notin Y ) , X R R B C R Y),决定因素X都包含了R的一个候选码,则称R属于BC范式。记作R \in$BCNF.

​ BCNF的性质

(1)满足BCNF的关系将消除任何属性(主属性或者非主属性)对主码的部分函数依赖和传递函数依赖。也就是说,R属于BC范式,则,R属于第三范式。

(2)如果R属于第三范式,但是R不一定属于BC范式。

猜你喜欢

转载自blog.csdn.net/qq_45066719/article/details/95086963