关系数据理论
关系数据理论(关系规范化理论)是数据库逻辑设计的理论指南。
规范化理论研究的是关系模式中各属性之间的数据依赖关系及其对关系模式性能的影响,探讨“好”的关系模式应该具备的性质,以及达到“好”的关系模式的设计算法。规范化理论是判断关系模式优劣的理论标准。
首先,要搞清楚什么叫码
U(全属性集)完全函数依赖于我们的候选码。
symbols
symbol | description | |
---|---|---|
r | r belongs to R(U) | r是全元组集的子集 |
x->y | y depends on x, x decide y | 函数依赖,x y 是属性子集 |
r[x] = s[x] => r[y] = s[y] | functionally dependence | |
R(U) | The Relation schema on universal set | |
F | 函数依赖,多值依赖 | 依赖集合 |
U | 属性集合 | |
自然连接 | 两个关系有一个相同的属性,依照这个属性进行连接 | |
F+ | F的闭包 | 所有引申结果 |
数据依赖
数据依赖是一个关系内部属性与属性之间的一种约束。这种约束关系是通过属性间值是否相等体现出的数据间的关联关系。
数据依赖包括函数依赖FD
和多值依赖MVD
一、函数依赖概念
关系模式上的函数依赖是语义范畴的概念,我们只能根据语义来确定函数依赖!
函数依赖概念:相当于数学中的函数,U是属性全集,x和y是U上的子集,x对应唯一确定的y,即x->y(y依赖于x)。
当然这里的y可以为空。
函数依赖实际上跟函数真的很像,每种关系都有一个X,通过这个X必定会映射到唯一一个Y上,也就是函数的唯一值对应。
x->y is a symbol.
平凡的函数依赖与非平凡的函数依赖
非平凡
if x->y and y not belong to x
then
is a ungeneral dependence
平凡
if x->y and y belong to x
then
is a general dependence
什么叫做平凡的?平凡的就是必定成立,所以实际上没有什么意义,我们一般说的依赖都是非平凡依赖。
完全函数依赖与部分函数依赖
2、完全依赖和不完全依赖:U是属性全集,x和y是U上的子集,x1是x的真子集,如果x->y,且x1不能确定y,则是完全函数依赖,反之x1->y,则是不完全函数依赖。
注意这里的集合x,y都是属性,那么对于x1是x的真子集,意思就是x可以是多个属性组成的,x1是其中的。那么这样完全和部分依赖就很好理解了。
也就是只有x可以决定y,而x的子集不可以,则称完全函数依赖。
so部分和完全的函数依赖都是函数依赖。
传递函数依赖与直接函数依赖
3、传递依赖:U是属性全集,x、y和z是U上的子集,x->y(但是y不能确定x),y->z,则x->z。
实际上就是很简单的依赖传递了。
如果x可以唯一决定y,且x不是y的平凡依赖,也即是y不是x的子集。那么如果有z依赖于y,那么z也可以依赖于x。
二、函数依赖的逻辑蕴含
关系模式R,F是其函数依赖的集合,X,Y是其属性子集,如果从F的函数依赖能够推出X->Y,则称F逻辑蕴涵X->Y。
被F所逻辑蕴涵的函数依赖的全体所构成的集合称作F的闭包,记作F+ 。(有集合论那味道了)
Armstrong公理体系
基本公理 | |
---|---|
自反律 | |
增广律 | x->y belongs to F and z belongs to U so that xz->yz belongs to F |
传递律 |
从上面的公理有推论:
推理规则 | ||
---|---|---|
合并规则 | x->y and x->z so that xy->z | |
伪传递规则 | x->y and wy->z so that xw->z | 实际上就是依赖替换 |
分解规则 | y的子集(把y分解了)一定依赖于y的依赖 |
码的定义
码 | 一般指的是候选码和主码 | caution |
---|---|---|
候选码 | 这个码(可以是组)可以唯一决定一个元组(也就是一条记录),当然这个不能重复啦 | |
主码 | 从候选码里面选一个 | |
主属性 | 所有候选码中属性的集合 | |
非主属性 | 不在所有候选码中的属性 | |
全码 | 整个schema所有的属性作为了候选码 | |
外码 |
实体完整性:主属性不为空。
二、范式及其规范化
NF | |
---|---|
1NF | 属性不能再拆分 |
2NF | 非主属性完全依赖于码 |
3NF | 非主属性既不部分也不传递依赖于码 |
BCNF | 每个决定性因素(函数依赖)都要包含码 |
4NF | 每一个非平凡多值依赖都要包含有码 |
作用与背景:消除关系模式的数据冗余,解决删除和插入操作的异常。从而为不同程度的规范化设立不同的标准。
关系模式满足某个范式,则称这个R属于该范式。
- 1NF:属性不能再拆分。
- 举一个反例,关系模式R(身份,身体状况),明显身份可以拆分为姓名,编号等,所以不是第一范式。
- 2NF:非主属性完全依赖于码。
- 举一个反例,关系模式R(姓名,学号,班级编号,班级名),满足1NF,候选码为学号和班级编号,(学号,班级编号)->姓名,(学号,班级编号)->班级名,但是学号->姓名,班级编号->班级名,所以不是第二范式。(通过完全依赖概念得出)
- 这里的码指的是主码。
- 也就是每个非主属性一定要完全依赖于码。不能是主属性的子集的依赖。
- 使用模式分解消除部分依赖。
3NF
- 3NF:非主属性既不部分也不传递依赖于码。
- 首先要满足第二范式,其次 非主属性 之间不存在函数依赖
- 举一个反例,关系模式(姓名,学号,班级,班主任),满足2NF,主键是学号,但是学号->班级,班级->班主任,得出学号->班主任,所以不是第三范式。(通过传递依赖概念得出)
- 也就是非主属性码之间不能有依赖。
- 使用模式分解,消除非主属性对码的传递依赖。
- 任何2元关系都是3NF
BCNF
- BCNF:消除主属性对码的部分依赖和传递依赖。
-
反例不好举出,凑一个吧,满足3NF,关系模式(姓名,学号,学科号,成绩),假设名字没有重复,得出依赖姓名->学号,学号->姓名,(学号,学科号)->成绩,(姓名,学科号)->成绩,可以看出主属性对码的部分依赖,达不到BCNF。
-
BCNF也就是不可以有:**主属性对于我们的码是部分依赖。**也就是有个主属性会依赖于一个码的子集。
-
如果要函数决定别人,那么就一定要包含码。
-
每个决定性因素都要包含码。(每个依赖都要包含码)
-
全码一定BCNF
-
4NF
- 4NF:就是限制关系模式的属性之间不允许有非平凡且非函数依赖的多值依赖。
- 关系模式R< U , F > belong to 1NF,若对于每一个是非平凡的多值依赖X->->Y(Y not belong X),X都含有码,则称R belong to 4NF。
- 每一个非平凡多值依赖都要包含有码。
这个知识点很重要,要caution。感性感知很容易,但是要系统化分析。
三、多值依赖
Asserted:
symbol | definition | description |
---|---|---|
X | ||
Y | ||
Z | U-X-Y | 可以为空 |
也就是有一个属性(组),可以映射到多组的值,那么在我们进行关系化的时候,放在一个表,会使得这多组的值,进行笛卡尔积。
注意,必须要完全笛卡尔积了(对于一个值,有所有的对应属性值映射),才能算是多值依赖。
如果有一个属性组X(不一定是码),我们能映射到一组值。如果这组值,可以由X的中的一个固定属性子集唯一决定,其他属性集的变化,只是使得外部属性的再重复,那么就说是多值依赖。
怎么说,多值依赖就是数据重复的问题。
多值依赖有对称性,实际上也就是我们笛卡尔积的对称性。
- 多值依赖具有对称性
- 多值依赖具有传递性
- 函数依赖是多值依赖的特例
- 若X->->Y,X->->Z,则X->->YZ
- 若X->->Y,X->->Z,则X->->Y and Z
- 若X->->Y,X->->Z,则X->->Y - Z, X->->Z - Y
注意多值依赖是在模式上的,如果我们从一个r上看,那么只能说是在关系上暂时成立(反映了范围性)。
若Z为空,则称平凡多值依赖。
全码不一定4NF.
多值依赖和函数依赖
多值依赖是元组产生依赖,函数依赖是相等产生依赖。
- 函数依赖规定某些元组不能出现在关系中,也称为相等产生依赖。
- 多值依赖要求某种形式的其它元组必须在关系中,称为元组产生依赖。
多值依赖的有效性与属性集的范围有关,而函数依赖的有效性则与属性集的范围无关。
- X->Y在属性集W(XY <= W <= U)上成立,在U上也成立。
- 而X->->Y在属性集W(XY <= W <= U)上成立,但在U上不一定成立。
- 也就是范围扩大,就不一定成立了。
- 范围缩小,一定成立
四、结论
特殊的关系 | 一定满足 |
---|---|
二元关系 | 4NF |
全是主属性 | 3NF |
全码 | BCNF |