一、规范化理论的主要内容
在关系数据库系统中,关系模型包括一组关系模式,并且关系之间不是完全孤立的(主外键)。
设计一个合适的关系型数据库系统,关键是设计关系型数据库的模式。
具体包括:
【1】数据库当中应包括多少个关系模式(可以理解为表)。
【2】每一个关系模式应该包括哪些属性(描述对象的特征)。
【3】如何将这些相互关联的关系模式组建成一个完整的数据库 。
关系数据库的规范化理论主要包括三个方面的内容:
【1】函数依赖
【2】范式
【3】模式设计
如果不使用关系型数据库的规范化理论,可能导致以下问题:
【1】数据冗余
【2】插入异常
【3】删除异常
【4】更新异常
将所有数据都存在一张大表上面,则叫做泛模式。
泛模式就是存储了所有数据的一张大表。
例如Student关系模式就是一个泛模式:
由于泛模式有很多问题,因此我们需要使用函数依赖将泛模式切割成许多小的表。把泛模式合理的分解成若干模式后可以使每个关系模式的结构清晰和简洁。
一个规范的关系模式应该具备以下四个条件:
【1】尽可能少的数据冗余
【2】没有插入异常
【3】没有删除异常
【4】没有更新异常
二、数据依赖
数据依赖:指的是关系模式中的各属性之间相互依赖,相互制约的联系。
数据依赖分为:
【1】函数依赖
【2】多值依赖
函数依赖是最重要的数据依赖。
1、函数依赖
函数依赖分为完全函数依赖,部分函数依赖和传递函数依赖。
- 函数依赖(FD)
是关系模式中属性之间的一种逻辑依赖关系。在一个表里面,属性X可以映射到属性Y,也就是说知道了X就能确定Y,称X为决定因素。
一个特定的X决定一个特定的Y(是一对一的关系)
例如:
有一个关系模式S(Sno,Sname,Sage)
如果知道了一个学生的学号Sno,那我就能确定他的姓名Sname和年龄Sage。
知道了一个学生的姓名也是可以确定其他属性的,这也是满足函数依赖关系的。(前提示学生的姓名没有重名的情况,否则就不是函数依赖了)
2、完全函数依赖
- 完全函数依赖
如果我想知道某位学生的某一门课的成绩Grade,那我必须得同时知道他的学号Sno和课程号Cno。
但如果我只知道一部分信息,比如他的Sno或者Cno可以吗?答案是不行的!此时称Y[Grade]完全依赖于X[Sno,Cno]。
3、部分函数依赖
- 部分函数依赖:
如果我想知道某位学生的姓名Sname,那我知道他的学号Sno就可以了。也就是说Y[Sname]只函数依赖于X[Sno,Cno]中的子集x[Sno],此时称Y部分函数依赖于X。
只有左边是组合的情况下才有可能出现部分函数依赖
4、传递函数依赖
传递函数依赖:
有一个关系模式S(Sno,Sdept,Mname)
如果我知道了一个学生的学号Sno,那我就能知道他所在的系Sdept。
如果我知道了某一个系Sdept,那么我就能知道这个系的系主任的姓名Mname。
也就是说,我知道了一个学生的学号Sno,其实我就知道了他所在系的系主任的姓名Mname。但这个过程中,他们是不存在直接函数依赖的,我需要通过系名称Sdept作为一个桥梁去把二者联系起来的。
注意:这里Sdept无法反推出Sno
仅通过完全函数依赖和部分函数依赖的特性来区分函数依赖的特性是,传递函数依赖可能是一种完全函数依赖,也可能是一种部分函数依赖。
可以通过函数依赖传递过程中是否存在部分函数依赖来进行区分。若函数依赖的传递过程均发生在完全函数依赖上,则产生的传递函数依赖是一种完全函数依赖,否则为部分函数依赖。
5、平凡函数依赖
当属性集Y是属性集X的子集时,必然存在函数依赖X-》Y。这种类型的函数依赖称为平凡函数依赖。
例如:(SNo,SN,Age)唯一确定的时候,它的任意子属性集合(SNo)必然唯一确定。
如果Y不是X的子集,则成X-》Y为非平凡的函数依赖。
若不特别声明,考虑的都是非平凡的函数依赖。
定义:设关系模式R(U,F),U是属性的全集,F是由U上的函数依赖所构成的集合,X和Y是U的子集,如果对于R(U)的任意一个可能的关系r,对于X的每一个具体值,Y都有唯一的具体值与之对应,则称X决定Y,或者Y函数依赖于X。
【1】函数依赖是语义范畴的概念
【2】函数依赖不是关系模式R的某个或者某些关系实例的约束条件,而是关系模式R之下一切可能的关系实例都要满足的约束条件。
【3】函数依赖与属性之间的联系类型有关
在一个关系模式当中,如果属性X与Y有1:1联系时,则存在函数依赖X->Y , Y->X
即X<->Y
如果属性X与Y有m : 1的联系时,则只存在函数依赖X->Y
如果属性X与Y有m : n的联系时,则X与Y之间不存在任何的函数依赖
【4】函数依赖与时间无关(因为关系模型是静态的,关系实例是动态的)
6、逻辑蕴含与闭包【期末必考】
- 逻辑蕴含:
设F是关系模式R(U)中的一个函数依赖集合,X, Y是R的属性子集(指的是投影),如果从F中的函数依赖能够推导出X→Y,则称F逻辑蕴涵X→Y, 或称X→Y是F的逻辑蕴涵。
比如:F含有依赖关系A→B,B→C, 则可推出A→C,所以F逻辑蕴含A→C
闭包
被F逻辑蕴涵的所有函数依赖集合称为F的闭包(Closure),记作 F+。
闭包是由关系模式R直观得到的函数依赖F所推出的所有隐含的或未隐含的(直观的)函数依赖的集合。
示例:设属性集U为XYZW,函数依赖集为{X→Y,Y→Z,W→Y,YZ→W},则:
X+=XYZW
Y+=YZW
(XW)+=XYZW
对于计算闭包,先把自己自身写出来,拿上面的X+来举例:
【1】X→X
【2】X→Y
【3】Y→Z
【4】YZ→W
因此X+=XYZW
三、Armstrong公理
Armstrong公理系统设关系模式R<U,F>,其中U为属性集,F是U上的一组函数依赖,那么有如下推理规则:
① A1自反律:若Y⊆X⊆U,则X→Y为F所蕴含;
② A2增广律:若X→Y为F所蕴含,且Z⊆U,则XZ→YZ为F所蕴含;
③ A3传递律:若X→Y,Y→Z为F所蕴含,则X→Z为F所蕴含。
根据上面三条推理规则,又可推出下面三条推理规则:
④ 合并规则:若X→Y,X→Z,则X→YZ为F所蕴含;
⑤ 伪传递规则:若X→Y,WY→Z,则XW→Z为F所蕴含;
⑥ 分解规则:若X→Y,Z⊆Y,则X→Z为F所蕴含。
例题一: 1、关系模式R(A.B.C.D.E)的函数依赖有AB一C和C.D一E.如果AB和D每个最多有三个不同的取值,则E最多有多少个不同的取值?
解:
根据笛卡尔积,AB共有3*3=9,因此C有9种,D最多三种,因此E最多27种。
例题二:
四、码
1、候选码