『数据库』朴实无华且枯燥的数据库文章--关系数据理论
『数据库』 朴实无华且枯燥的数据库教程–入门必看!(不收藏,真的吃亏了)
问题的提出
一、概念回顾
关系:描述实体、属性、实体间的联系。
从形式上看,它是一张二维表,是所涉及属性的笛卡尔积的一个子集。
关系模式:用来定义关系。
关系数据库:基于关系模型的数据库,利用关系来描述现实世界。
从形式上看,它由一组关系组成。
关系数据库的模式:定义这组关系的关系模式的全体。
二、关系模式的形式化定义
关系模式由五部分组成,即它是一个五元组:
R(U, D, DOM, F)
R: 关系名
U: 组成该关系的属性名集合
D: 属性组U中属性所来自的域
DOM: 属性向域的映象集合
F: 属性间数据的依赖关系集合
1.属性间的联系
1)一对一联系
设X,Y为关系中的属性或属性组,它们的所有可能取值组成两个集合。如果对于X中的任一具体值Y中至多有一个值与之对应,称X,Y这两个属性之间是一对一联系。
2)一对多联系
如果属性值集合X中的任一个具体值,至多与Y中的一个值相对应,而Y中的任一个具体值却可以和X中的多个值相对应,则称两个属性间从X到Y为m:1的联系或从Y到X是1:m的联系。
注意:这里指的是属性值个数的多少,而不是具有相同属性值的有多少个元组,二者正好相反。
3)多对多联系
在X,Y两个属性值集中,如果任一个值都可以至多和另一个属性值集中多个值对应,反之亦然,则称属性X和Y是m:n关系。
三、什么是数据依赖
1. 完整性约束的表现形式
- 限定属性取值范围
- 定义属性值间的相互关连(主要体现于值的相等与否),这就是数据依赖,它是数据库模式设计的关键
2. 数据依赖
- 一个关系内部属性与属性之间的约束关系
- 现实世界属性间相互联系的抽象
- 数据内在的性质
- 语义的体现
3. 数据依赖的类型
- 函数依赖(Functional Dependency,简记为FD)
- 多值依赖(Multivalued Dependency,简记为MVD)
- 其他
四、关系模式的简化表示
关系模式R(U, D, DOM, F),简化为一个三元组:R(U, F) 。
当且仅当U上的一个关系r满足F时,r称为关系模式 R (U, F)的一个关系。
五、数据依赖对关系模式的影响
【例1】 建立一个描述学校教务的数据库:
学生的学号(Sno)、所在系(Sdept)、系主任姓名(Mname)、课程名(Cname)、成绩(Grade)
【解析】
单一的关系模式 :
Student <U、F>
U ={ Sno, Sdept, Mname, Cname, Grade }
学校数据库的语义:
⒈ 一个系有若干学生, 一个学生只属于一个系;
⒉ 一个系只有一名主任;
⒊ 一个学生可以选修多门课程, 每门课程有若干学生选修;
⒋ 每个学生所学的每门课程都有一个成绩。
属性组U上的一组函数依赖F:
F ={ Sno → Sdept, Sdept → Mname, (Sno, Cname) → Grade }
关系模式Student<U, F>中存在的问题
1.数据冗余太大
浪费大量的存储空间
例:每一个系主任的姓名重复出现
2.更新异常(Update Anomalies)
数据冗余 ,更新数据时,维护数据完整性代价大
例:某系更换系主任后,系统必须修改与该系学生有关的每一个元组
3.插入异常(Insertion Anomalies)
该插的数据插不进去
例,如果一个系刚成立,尚无学生,我们就无法把这个
系及其系主任的信息存入数据库。
4.删除异常(Deletion Anomalies)
不该删除的数据不得不删
例,如果某个系的学生全部毕业了, 我们在删除该系学生信息的同时,把这个系及其系主任的信息也丢掉了。
分解关系模式
把这个单一模式分成3个关系模式:
S(Sno,Sdept,Sno → Sdept);
SC(Sno,Cno,Grade,(Sno,Cno) → Grade);
DEPT(Sdept,Mname,Sdept→ Mname)
规范化
规范化理论正是用来改造关系模式,通过分解关系模式来消除其中不合适的数据依赖,以解决插入异常、删除异常、更新异常和数据冗余问题。
一、函数依赖
1.函数依赖
设R(U)是一个属性集U上的关系模式,X和Y是U的子集。
若对于R(U)的任意一个可能的关系r,r中不可能存在两个元组在X上的属性值相等, 而在Y上的属性值不等, 则称“X函数确定Y” 或 “Y函数依赖于X”,记作X→Y。
若X→Y,则X称为这个函数依赖的决定属性组,也称为决定因素(Determinant)。
函数依赖与属性间的联系类型有关:
(1) 一对一联系:X←→Y
(2) 多对一联系:X→Y
(3) 多对多联系:不存在依赖关系
(4) 可从属性间的联系类型来分析属性间的函数依赖
ps:
- 函数依赖不是指关系模式R的某个或某些关系实例满足的约束条件,而是指R的所有关系实例均要满足的约束条件。
- 函数依赖是语义范畴的概念。只能根据数据的语义来确定函数依赖。
- 数据库设计者可以对现实世界作强制的规定。
2.平凡函数依赖与非平凡函数依赖
在关系模式R(U)中,对于U的子集X和Y,
如果X→Y,但Y⊈X,则称X→Y是非平凡的函数依赖
若X→Y,但Y⊆X, 则称X→Y是平凡的函数依赖
ps:于任一关系模式,平凡函数依赖都是必然成立的,它不反映新的语义,因此若不特别声明, 我们总是讨论非平凡函数依赖。
3.完全函数依赖与部分函数依赖
在R(U)中,如果X→Y,并且对于X的任何一个真子集X’,都有X’ Y, 则称Y对X完全函数依赖,记作X F Y。
若X→Y,但Y不完全函数依赖于X,则称Y对X部分函数依赖,记作。 ,
4.传递函数依赖
在R(U)中,如果, , ,,则称Z对X传递函数依赖。记为:
ps:如果, 即,则Z直接依赖于X。
二、码
设K为R<U,F>中的属性或属性组合。若K U, 则K称为R的侯选码(Candidate Key)。
若候选码多于一个,则选定其中的一个做为主码(Primary Key)。
1.主属性与非主属性
- 包含在任何一个候选码中的属性 ,称为主属性(Prime attribute)
- 不包含在任何码中的属性称为非主属性(Nonprime attribute)或非码属性(Non-key attribute)
2.全码
- 整个属性组是码,称为全码(All-key)
3.外部码
关系模式 R 中属性或属性组X 并非 R的码,但X 是另一个关系模式的码,则称 X 是R 的外部码(Foreign key)也称外码。
主码与外部码一起提供了表示关系间联系的手段
4.关系码的性质
- 每个关系必有码。
- 主码具有标识元组的唯一性。主码是用来唯一标识关系中的元组的。
- 关系码具有最小性。若抽去主码中任意一属性,则主码就失去标识的唯一性。
- 主码中的任一属性值不能取空。
【返例】
关系模式S(S# , SN , SD , DEAN , C# , G)
主码:(S#,C#)
函数依赖:
三、范式
范式是符合某一种级别的关系模式的集合
关系数据库中的关系必须满足一定的要求。满足不同程度要求的为不同范式。
范式的种类:
- 第一范式(1NF)
- 第二范式(2NF)
- 第三范式(3NF)
- BC范式(BCNF)
- 第四范式(4NF)
- 第五范式(5NF)
各种范式之间存在联系:
1NF ⊃ 2NF ⊃ 3NF ⊃ BCNF ⊃ 4NF ⊃ 5NF
某一关系模式R为第n范式,可简记为R∈nNF。
一个低一级范式的关系模式,通过模式分解可以转换为若干个高一级范式的关系模式的集合,这种过程就叫规范化
四、2NF
1.1NF的定义
如果一个关系模式R的所有属性都是不可分的基本数据项, 则R∈1NF
第一范式是对关系模式的最起码的要求。不满足第一范式的数据库模式不能称为关系数据库
但是满足第一范式的关系模式并不一定是一个好的关系模式
2.2NF的定义
若R∈1NF,且每一个非主属性完全函数依赖于码,则R∈2NF。
- 采用投影分解法将一个1NF的关系分解为多个2NF的关系,可以在一定程度上减轻原1NF关系中存在的插入异常、删除异常、数据冗余度大、修改复杂等问题。
- 将一个1NF关系分解为多个2NF的关系,并不能完全消除关系模式中的各种异常情况和数据冗余
五、3NF
3NF的定义
关系模式R<U,F> 中若不存在这样的码X、属性组Y及非主属性Z(Z ⊈ Y), 使得X→Y,Y→Z成立,Y \→ X,则称R<U,F> ∈ 3NF。
若R∈3NF,则每一个非主属性既不部分依赖于码也不传递依赖于码。
(1) 每个非主属性既不部分依赖,也不传递依赖于R的任何码。
(2) 从1NF→2NF:消除非主属性对码的部分函数依赖
(3) 从2NF→3NF:消除非主属性对码的传递函数依赖
(4) 从一个表中删去不依赖于主码的数据列。
- 采用投影分解法将一个2NF的关系分解为多个3NF的关系,可以在一定程度上解决原2NF关系中存在的插入异常、删除异常、数据冗余度大、修改复杂等问题。
- 将一个2NF关系分解为多个3NF的关系后,仍然不能完全消除关系模式中的各种异常情况和数据冗余。
六、BCNF
关系模式R<U,F>∈1NF,若X→Y且Y ⊈ X时X必含有码,则R<U,F> ∈BCNF。
等价于:每一个决定属性因素都包含码
若R∈BCNF
▪ 所有非主属性对每一个码都是完全函数依赖
▪ 所有的主属性对每一个不包含它的码,也是完全函数依赖
▪ 没有任何属性完全函数依赖于非码的任何一组属性
3NF与BCNF的关系
如果R∈3NF,且R只有一个候选码
BCNF的关系模式所具有的性质
1.所有非主属性都完全函数依赖于每个候选码
2.所有主属性都完全函数依赖于每个不包含它的候选码
3.没有任何属性完全函数依赖于非码的任何一组属性
七、多值依赖
1.定义
设R(U)是一个属性集U上的一个关系模式, X、 Y和Z是U的子集,并且Z=U-X-Y。关系模式R(U)中多值依赖X→→Y成立,当且仅当对R(U)的任一关系r, r在(x,z)上的每个对应一组Y的值,这组值仅仅决定于x值而与z值无关。
2.多值依赖的另一个等价的形式化的定义:
在R(U)的任一关系r中,如果存在元组t,s 使得t[X]=s[X],那么就必然存在元组 w,v r,(w,v可以与s,t相同),使得w[X]=v[X]=t[X],而w[Y]=t[Y],w[Z]=s[Z],v[Y]=s[Y],v[Z]=t[Z]
(即交换s,t元组的Y值所得的两个新元组必在r中),则Y多值依赖于X,记为X→→Y。 这里,X,Y是U的子集,Z=U-X-Y。
3.平凡多值依赖和非平凡的多值依赖
▪ 若X→→Y,而Z=φ,则称X→→Y为平凡的多值依赖
▪ 否则称X→→Y为非平凡的多值依赖
4.多值依赖的性质
(1)多值依赖具有对称性
若X→→Y,则X→→Z,其中Z=U-X-Y
(2)多值依赖具有传递性
若X→→Y,Y→→Z, 则X→→Z –Y
(3)函数依赖是多值依赖的特殊情况。
若X→Y,则X→→Y。
(4)若X→→Y,X→→Z,则X→→Y∪Z。
(5)若X→→Y,X→→Z,则X→→Y∩Z。
(6)若X→→Y,X→→Z,则X→→Y-Z,X→→Z -Y
5.多值依赖与函数依赖的区别
(1) 有效性
多值依赖的有效性与属性集的范围有关
若X→→Y在U上成立,则在W(X Y ⊆ W ⊆ U)上一定成立;反之则不然,即X→→Y在W(W ⊂ U)上成立,在U上并不一定成立
▪ 多值依赖的定义中不仅涉及属性组 X和 Y,而且涉及U中其余属性Z。
▪ 一般地,在R(U)上若有X→→Y在W(W ⊂ U)上成立,则称X→→Y为R(U)的嵌入型多值依赖
只要在R(U)的任何一个关系r中,元组在X和Y上的值满足定义(函数依赖),则函数依赖X→Y在任何属性集W(X Y ⊆ W ⊆ U)上成立。
(2)
▪ 若函数依赖X→Y在R(U)上成立,则对于任何Y’ ⊂ Y均有X→Y’ 成立
▪ 多值依赖X→→Y若在R(U)上成立,不能断言对于任何Y’ ⊂ Y有X→→Y’ 成立
- 函数依赖规定某些元组不能出现在关系中,也称为相等产生依赖。
- 多值依赖要求某种形式的其它元组必须在关系中,称为元组产生依赖。
八、4NF
关系模式R<U,F>∈1NF,如果对于R的每个非平凡多值依赖X→→Y(Y ⊈ X),X都含有码,则R∈4NF。
如果R ∈ 4NF, 则R ∈ BCNF
- 不允许有非平凡且非函数依赖的多值依赖
- 允许的非平凡多值依赖是函数依赖
各级范式的关系
(1) 4NF⊂BCNF⊂3NF⊂2NF⊂1NF
(2) 如果关系满足某个范式要求,也会满足级别较低的所有范式的要求
(3) 较高层次的范式比较低层次的范式更合乎要求
九、规范化小结
- 关系数据库的规范化理论是数据库逻辑设计的工具
- 一个关系只要其分量都是不可分的数据项,它就是规范化的关系,但这只是最基本的规范化
- 规范化程度可以有多个不同的级别
- 规范化程度过低的关系不一定能够很好地描述现实世界,可能会存在插入异常、删除异常、修改复杂、数据冗余等问题
- 一个低一级范式的关系模式,通过模式分解可以转换为若干个高一级范式的关系模式集合,这种过程就叫关系模式的规范化
- 目的:尽量消除插入、删除异常,修改复杂,数据冗余
- 基本思想:逐步消除数据依赖中不合适的部分
实质:概念的单一化
规范化步骤
- 消除不合适的数据依赖
- 使各关系模式达到某种程度的“分离”
- 采用“一事一地”的模式设计原则
让一个关系描述一个概念、一个实体或者实体间的一种联系。若多于一个概念就把它“分离”出去 - 所谓规范化实质上是概念的单一化
- 不能说规范化程度越高的关系模式就越好
- 在设计数据库模式结构时,必须对现实世界的实际情况和用户应用需求作进一步分析,确定一个合适的、能够反映现实世界的模式
- 上面的规范化步骤可以在其中任何一步终止
数据依赖的公理系统
一、逻辑蕴含
对于满足一组函数依赖 F 的关系模式R <U,F>,其任何一个关系r,若函数依赖X→Y都成立, (即r中任意两元组t,s, 若t[X]=s[X],则t[Y]=s[Y]),则称F逻辑蕴含X →Y
二、Armstrong公理系统
一套推理规则,是模式分解算法的理论基础
用途
- 求给定关系模式的码
- 从一组函数依赖求得蕴含的函数依赖
关系模式R <U,F >来说有以下的推理规则:
A1.自反律(Reflexivity):若Y ⊆ X ⊆ U,则X →Y为F所蕴含。
A2.增广律(Augmentation):若X→Y为F所蕴含,且Z ⊆ U,则XZ→YZ为F所蕴含。
A3.传递律(Transitivity):若X→Y及Y→Z为F所蕴含,则X→Z为F所蕴含。
注意:由自反律所得到的函数依赖均是平凡的函数依赖,自反律的使用并不依赖于F
三、函数依赖闭包
1.F的闭包:
在关系模式R<U,F>中为F所逻辑蕴含的函数依赖的全体叫作 F的闭包,记为。
2.X关于函数依赖集F 的闭包:
设F为属性集U上的一组函数依赖,X ⊆U, XF+ ={ A|X→A能由F 根据Armstrong公理导出}, 称为属性集X关于函数依赖集F 的闭包
3.关于闭包的引理
引理:
设F为属性集U上的一组函数依赖,X,Y ⊆ U,X→Y 能由F 根据Armstrong公理导出的充分必要条件是
用途:
将判定X→Y是否能由F根据Armstrong公理导出的问题,转化为求出XF+ 、判定Y是否为XF+的子集的问题
4.求闭包的算法
求属性集X(X ⊆ U)关于U上的函数依赖集F 的闭包X_F^+
输入:X,F 输出:
步骤:
(1)
(2)求B,这里
(3)
(4)判断吗?
(5)若相等或 , 则就是, 算法终止。
(6)若否,则 i=i+l,返回第(2)步。
令ai =|X(i)|,{ai }形成一个步长大于1的严格递增的序列,序列的上界是 | U |,因此该算法最多 |U| - |X| 次循环就会终止。
算法(求属性集的闭包)
判定X→Y是否能由F根据Armstrong公理导出,
可转化为求,判定是否成立。
输入:X,F
输出:
1)开始: := X;
2)考察每个F中的函数依赖 A→B, 若 ,则 :=
3)继续考察,直到 不再增大为止。
5. Armstrong公理系统的有效性与完备性
有效性:由F出发根据Armstrong公理推导出来的每一个函数依赖一定在F+中
Armstrong正确
完备性:F+中的每一个函数依赖,必定可以由F出发根据Armstrong公理推导出来
Armstrong公理够用,完全
完备性:所有不能用Armstrong公理推导出来f, 都不为真;若 f 不能用Armstrong公理推导出来, f∉F+
6. 函数依赖集等价
如果,就说函数依赖集F覆盖G(F是G的覆盖,或G是F的覆盖),或F与G等价。
的充分必要条件是 ,和
7. 最小依赖集
如果函数依赖集F满足下列条件,则称F为一个极小函数依赖集。亦称为最小依赖集或最小覆盖。记作Fm:
(1)单属性化: F中任一函数依赖的右部仅含有一个属性。
(2)无冗余化: F中不存在这样的函数依赖X→A,使得F与F-{X→A}等价。
(3)既约化: F中不存在这样的函数依赖X→A, X有真子集Z使得F-{X→A}∪{Z→A}与F等价
8. 极小化过程
每一个函数依赖集F均等价于一个极小函数依赖集Fm。此Fm称为F的最小依赖集。
(1)逐一检查F中各函数依赖FDi:X→Y,若Y=A1A2 …Ak, k > 2,则用 { X→Aj |j=1,2,…, k} 来取代X→Y。
(2)逐一检查F中各函数依赖FDi:X→A,令G=F-{X→A}, 若A∈XG+, 则从F中去掉此函数依赖。
(3)逐一取出F中各函数依赖FDi:X→A,设X=B1B2…Bm,逐一考查Bi (i=l,2,…,m),若A ∈(X-Bi )F+ ,则以X-Bi 取代X。
模式的分解
把低一级的关系模式分解为若干个高一级的关系模式的方法不是唯一的
只有能够保证分解后的关系模式与原关系模式等价,分解方法才有意义
三种模式分解等价的定义:
1.分解具有无损连接性
2.分解要保持函数依赖
3.分解既要保持函数依赖,又要具有无损连接性
具有无损连接性的模式分解
-
关系模式R<U,F>的一个分解 ρ={ R1<U1,F1>,R2<U2,F2>, …, Rn<Un,Fn>}
若R与R1、R2、…、Rn自然连接的结果相等,则称关系模式R的这个分解ρ具有无损连接性(Lossless join) -
具有无损连接性的分解保证不丢失信息
-
无损连接性不一定能解决插入异常、删除异常、修改复杂、数据冗余等问题
-
如果一个分解具有无损连接性,则它能够保证不丢失信息
-
如果一个分解保持了函数依赖,则它可以减轻或解决各种异常情况
-
分解具有无损连接性和分解保持函数依赖是两个互相独立的标准。具有无损连接性的分解不一定能够保持函数依赖;同样,保持函数依赖的分解也不一定具有无损连接性。
小结
- 若要求分解具有无损连接性,那么模式分解一定能够达到4NF
- 若要求分解保持函数依赖,那么模式分解一定能够达到3NF,但不一定能够达到BCNF
- 若要求分解既具有无损连接性,又保持函数依赖,则模式分解一定能够达到3NF,但不一定能够达到BCNF
- 规范化理论为数据库设计提供了理论的指南和工具
也仅仅是指南和工具 - 并不是规范化程度越高,模式就越好
必须结合应用环境和现实世界的具体情况合理地选择数据库模式
写在最后:
本数据库专栏是由爱吃老谈酸菜的DV一同完成的,博客链接在主页友链,是我的好哥们✈
Name:风骨散人,目前是一名双非在校大学生,预计考研,热爱编程,热爱技术,喜欢分享,知识无界,希望我的分享可以帮到你!名字的含义:我想有一天我能有能力随心所欲不逾矩,不总是向生活低头,有能力让家人拥有富足的生活而不是为了生计而到处奔波。“世人慌慌张张,不过是图碎银几两。偏偏这碎银几两,能解世间惆怅,可让父母安康,可护幼子成长 …”
文章主要内容:
Python,C++,C语言,JAVA,C#等语言的教程
ACM题解、模板、算法等,主要是数据结构,数学和图论
设计模式,数据库,计算机网络,操作系统,计算机组成原理
Python爬虫、深度学习、机器学习
计算机系408考研的所有专业课内容
目前还在更新中,先关注不迷路。微信公众号,cnblogs(博客园),CSDN同名“风骨散人”
如果有什么想看的,可以私信我,如果在能力范围内,我会发布相应的博文!
感谢大家的阅读!😘你的点赞、收藏、关注是对我最大的鼓励!