关系模式的设计问题
关系数据库的设计理论主要包括三个方面的内容:数据依赖、范式、模式设计方法。其中数据依赖起核心作用。
例:R(TNAME,ADDRESS,C#,CNAME)
限定事实:一个教师只有一个地址;
一个教师可教若干门课;
每门课程只有一个教师任教。
所以R的键是(TNAME,C#)。
实际使用中存在的问题:
1.数据重复
2.更新异常
3.插入异常
4.删除异常
采用对属性间的函数依赖来解决,使用分解方法,将R分解成两个模式:
R1(TNAME,ADDRESS)
R2 (TNAME,C#,CNAME)
分解后,四个问题解决基本解决。即每个教师的地址只存放一次,即使一个教师没有教学任务,他的地址也可存放在R1中。
但是这种分解并非最佳。例如要检索教某门课的教师的地址,就需要进行联接操作,但是代价太大。
函数依赖
函数依赖的定义
设有关系模式R(A1,A2,…,An)或简记为R(U),X,Y是U的子集,r是R的任一具体关系,如果对r的任意两个元组t1,t2,由t1[X]=t2[X]导致t1[Y]=t2[Y],则称X函数决定Y,或Y函数依赖于X,记为X→Y。 X→Y为模式R的一个函数依赖。
这里的t1[X]表示元组t1在属性集X上的值,t2[X]表示元组t2在属性集X上的值,函数依赖是对关系R的一切可能的当前值r定义的,不是针对某个特定关系。
函数依赖不是指关系模式R的某个或某些关系满足的约束条件,而是指R的一切关系均要满足的约束条件。不能只看到关系模式R的一个特定关系,就推断那些函数依赖对于R成立。
在关系模式R中,要判断FD是否成立,惟一的办法是仔细考察属性的含义。即函数依赖实际是对现实世界的断言。
例:学习关系R(S#,SN,C#,G,CN,TN,TA)
在R中的关系r中,存在函数依赖:
S#→SN(每个学号只能有一个学生姓名)
C# →CN(每个课程只能对应一门课程名)
TN →TA(每个教师只能有一个年龄)
(S#,C#) →G(每个学生学习一门课只能有一个成绩)
函数依赖的逻辑蕴涵
这里主要研究对于给定的一组函数依赖,如何判断另外一些函数依赖是否存在。
定义:设F是关系模式R的一个函数依赖集,X,Y是R的属性子集,如果从F中的函数依赖能够推出X→Y,则称F逻辑蕴涵X→Y,记为F?=X→Y。
被F逻辑蕴涵的函数依赖的全体构成的集合,称为F的闭包,记为F+。
•键
键是惟一标识实体的属性集。这里把键和函数依赖结合起来,做一个准确的定义。
设有关系模式R(A1,…,An),F是R上的函数依赖集,X是{A1,…,An}的一个子集。如果
1.X→A1A2…An∈ F+,且
2.不存在X的真子集Y,使得Y→A1A2…An成立,则称X是R的一个候选键。
在定义中A1A2…An是A1∪A2∪…∪An的简写。1表示X能惟一决定一个元组;2表示X能满足1而又无多余的属性集。
例:设关系模式R(XYZ),已知FD是X→Y和Y→Z,那么可以推出X→XYZ也在F+中,但X的真子集(此处是空集)不可能函数决定XYZ,因此,X是模式R的键。
例:R(S#,SNAME,SEX,AGE)
在该模式中,S#→ (S#,SNAME,SEX,AGE)
S#不存在任何真子集,所以S#是键。
(S#,SNAME)也可以决定R中的全部属性,但它不是键,因为其中含有真子集S#,可以决定R的所有属性。
函数依赖的推理规则
ARMSTRONG推理规则
设有关系模式R(A1,A2,…,An)和属性集U= A1A2…An,X,Y,Z,W都是U的子集,F是R上只涉及到U中属性的函数依赖集,推理规则如下:
1.自反律
如果YÍXÍU,则X→Y在R上成立。
2.增广律
如果X→Y为F所蕴涵,ZÍU,则XZ→YZ在R上成立。(XZ表示X∪Z)
3.传递律
如果X→Y和Y→Z在R上成立,则X→Z在R上也成立。
4.合并律
如果X→Y和X→Z成立,那么X→YZ成立。
5.伪传递律
如果X→Y和WY→Z成立,那么WX→Z成立。
6.分解律
如果X→Y和ZÍY成立,那么X→Z成立。