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