DataBaseSystem第四章关系型数据库规范设计DataBaseSystem本章主要内容4.1关系模式的设计问题4.2函数依赖4.3关系模式的分解特性4.4关系模式的范式SQL数据库的体系结构SQL用户BaseTableB1ViewV1ViewV2BaseTableB2BaseTableB3BaseTableB4StoredFileS1StoredFileS1StoredFileS1StoredFileS1外模式模式内模式SQL语言支持的关系数据库的三级模式结构S#、SNAME、SDEPT、C#、CNAME、TIME、S#、C#、GRADES(S#、SNAME、SDEPT)C(C#、CNAME、TIME)SC(S#、C#、GRADE)……S#SNAMESDEPTC#CNAMETIMEGRADECNAME_SNAME_GRADE(C#,S#,GRADE)DataBaseSystem4.1关系模式的设计问题对于一个现实问题,它有一个属性集U,其中每个属性Ai对应一个值域DOM(Ai),它由属性集U和U上成立的数据完整性约束集组成。关系r是关系模式R(U)的当前值,是一个元组的集合。这里的关系模式和关系一般称为泛关系模式和泛关系。R(S#、SNAME、SDEPT、C#、CNAME、TIME、S#、C#、GRADE)但是对于许多现实问题,往往R(U)不是恰当的形式,必须用一个关系模式的集合p={R1,R2,……Rk}来代替R(U),这里的p称为数据库模式。对数据库模式的每一个关系模式赋予一个当前值,就得到一个数据库实例(数据库)。S(S#、SNAME、SDEPT)C(C#、CNAME、TIME)SC(S#、C#、GRADE)DataBaseSystem什么是好的数据库设计体现客观世界的信息无过度的冗余无插入异常无更新复杂无删除异常4.1关系模式的设计问题DataBaseSystem4.1关系模式的设计问题TNAMEADDRESSC#CNAMEt1a1c1n1t1a1c2n2t1a1c3n3t2a2c4n4t2a2c5n2t3a3c6n4关系模式R(TNAME,ADDRESS,C#,CNAME)4.1关系模式的设计问题对数据库操作时,会出现以下问题1、数据冗余:(数据重复存储:浪费存储空间,数据库维护困难)如一名教师教多门课程,他的地址要重复多次2、更新异常:如果一个教师教了三门课程,则如果他的地址变了,三个元组的地址信息都要变。若有一个没变,就会造成地址不唯一,产生错误信息。3、插入异常:主键为空的记录不能存在于数据库,导致不能进行插入操作如教师没有分配教学任务,就不能插入数据库。4.删除异常:删除操作后,会引起一些信息的丢失。如一个原有教学任务的教师教师现在没有教学任务,要把这个教师的所有元组都删去。这样就把这个教师的姓名和地址也从数据库中删去了,不合理。TNAMEADDRESSC#CNAMEt1a1c1n1t1a1c2n2t1a1c3n3t2a2c4n4t2a2c5n2t3a3c6n44.1关系模式的设计问题解决之道:分解!分解!!再分解!!!TNAMEADDRESSt1a1t2a2t3a3TNAMEC#CNAMEt1c1n1t1c2n2t1c3n3t2c4n4t2c5n2t3c6n4分解为两个模式:R1(TNAME,ADDRESS)R2(TNAME,C#,CNAME)考虑为学生的选课信息而设计一个关系模式。SnoSnameSagessexsdeptcnocnamecreditgrade95001张三25MCSC01数据库39595001张三25MCSC02网络技术38095001张三25MCSC03英语47695002李四23FMAC01数据库38095002李四23FMAC03英语480过度冗余——数据重复更新异常——更新代价大、可能导致数据不一致删除异常——部分信息的删除可能导致信息的丢失插入异常——必须有完整信息怎么分解最佳?4.1关系模式的设计问题DataBaseSystem4.2函数依赖(FD,FunctionDependence)y=f(x)y=3xDataBaseSystem4.2.1函数依赖定义设有关系模式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的一个函数依赖。如S#Sname,(S#,C#)Grade该定义理解如下:有一张设计好的二维表,X,Y是表的某些列(可以是一列,也可以是多列),若在表中的第t1行,和第t2行上的X值相等,那么必有t1行和t2行上的Y值也相等,这就是说Y函数依赖于X。比如,有如下二维表DataBaseSystem在表中,凡成绩相同的,对应的“成绩等级”也必是相同的,因此,“成绩等级”函数依赖于成绩。但是反过来则不成立。Notice:(1)在这张表中,任何一行的关系均应符合函数依赖的条件,如果有一行不符合函数依赖的条件,则函数依赖对于这个关系就不成立。(2)函数依赖是否成立是不可证明的,只能通过属性的含义来判断.DataBaseSystem表例学号姓名成绩成绩等级00001李里77C00002丁力91A00003李小红85B00004马琳85B00005王佳怡66D00006胡林70C.....................DataBaseSystem举例:职工号(A)基本工资(B)奖金(C)051390500524205005339080ABACBACADataBaseSystem4.2.2函数依赖-几点说明1.函数依赖是语义范畴的概念.它反映了一种语义完整性约束,只能根据语义来确定一个函数依赖.例如,“姓名”-“年龄”这个函数依赖只有在没有同名人的条件下成立,否则,此函数依赖不成立。2.函数依赖是指关系R模式的所有关系元组均应满足的约束条件,而不是关系模式中的某个或某些元组满足的约束条件。DataBaseSystem4.2.2函数依赖-几点说明3.函数依赖与属性间的联系类型有关(1)若属性X和Y之间有“一对一”的联系,则XY,YX,XY.(如不存在同名的学号和姓名)(2)若属性X和Y之间有“多对一”的联系,则XY,但YX.(3)若属性X和Y之间有“多对多”的联系,则X与Y之间不存在任何函数依赖.当确定函数依赖关系时,可从属性间的联系入手DataBaseSystem函数依赖(FD,FunctionDependence)y=f(x)问:X、Y是谁函数依赖谁?是X函数依赖Y?还是Y函数依赖X?答:Y函数依赖X(X函数决定Y)X=1y=3;X=2y=6;y=3x=1;y=6x=2;y=x2X=1y=1;X=-2y=4;y=1x=1orx=-1;y2=x2y=1x=1orx=-1;x=1y=1ory=-1;y=3x问:X、Y是谁函数依赖谁?是X函数依赖Y?还是Y函数依赖X?答:没有任何函数依赖关系DataBaseSystem4.2.2函数依赖-几点说明4.如果X→Y,并且Y不是X的子集,则称X→Y是非平凡的函数依赖;如果Y是X的子集,则称X→Y是平凡的函数依赖;我们讨论的是非平凡的函数依赖.例如:(S#,SN)SN是平凡的函数依赖5.函数依赖的存在,决定了自然连接的特性设关系模式R(X,Y,Z),X,Y,Z为不相交的属性集合,若X→Y,X→Z,则有R(X,Y,Z)=R(X,Y)R(X,Z)即用它们的自然连接可复员原关系模式DataBaseSystem举例:关系模式S(S#,SN,C#,G,CN,TN,TA)主键:(S#,C#)函数依赖:S#SN(每个学生只能有一个姓名)C#CN(每个课程号只能对应一门课程)TNTA(每个教师只能有一个年龄)(S#,C#)G(每个学生学习一门课程只能有一个成绩)DataBaseSystem4.2.2函数依赖ABC142356346738910说明关系是否满足下列函数依赖:ABACABCCAACB不满足AB,因为(3,5,6)和(3,4,6),t1(A)=t2(A)=3,但是t1(B)=5而t2(A)=4ACABCCADataBaseSystem4.2.3键定义–超键:设X为关系R的属性或属性组,U为R的元组若XU,则称X为R的超键。–候选键:设X为R的超键,若X中不含多余属性,则称X为R的候选键。–主键:若关系R有多个候选键,则可以从中选定一个作为R的主键。–主属性:包含在任何一个候选键中的属性,称作主属性,不包含在任何键中的属性称为非主属性。–全键:关系模式的键由整个属性组构成。如(S#,C#,T#)DataBaseSystem4.2.3键候选键的两个性质:1、标识的唯一性:对于R(U)中的每一元组,X的值确定后,该元组就相应确定了.即:X函数决定该关系的所有其他属性(X→R)XA1A2…AnS#SD,SS,SBirthday2、无冗余性:X是属性组的情况下,X的任何真子集都不能唯一标识该元组即:不存在X的真子集Y,使得YA1A2…An(S#,C#)GradeDataBaseSystem4.2.3键举例:设关系模式R(XYZ),已知FD是XY,YZ,那么可以推出XXYZ也在F+中,但X的真子集(此处是空值)不可能函数决定XYZ,所以X是模式R的键。职工关系模式ZG(工号,姓名,年龄,性别,工资)工号(工号,姓名,年龄,性别,工资),工号没有真子集,所以工号是键。(工号,姓名)(工号,姓名,年龄,性别,工资),但不是键。DataBaseSystem4.3关系模式的分解特性我们可以通过把一个关系模式的分解成多个关系模式,以解决它的插入、删除和更新操作所带来的一些问题。为了在分解要保证原来模式所满足的特性,要求分解处理具有无损联接和保持函数依赖。DataBaseSystem4.3.1模式分解中存在的问题设有关系R=A1A2…An,R1,R2…Rn是R的子集,R=R1UR2U…Rk,设有关系模式R1,R2…Rk的集合用p表示,p={R1,R2…Rk}。用p代替R的过程称为关系模式的分解。P称为R的一个分解,也称为数据库模式。R称为泛关系模式,R对应的当前值称为泛关系。数据库对应的当前值σ称为数据库实例,它是由数据库模式中的每一个关系模式的当前值组成,σ={r1,r2…rk}来表示。DataBaseSystem4.3.1模式分解中存在的问题实际上,关系模式的分解,不仅仅是属性集合的分解,它是对关系模式上的函数依赖集,以及关系模式的当前值的分解的具体表现。4.3.1模式分解中存在的问题R(A,B,C)ABC112221AB1122BC1221ABC112221∏AB(R)∏BC(R)∏AB(R)∏BC(R)R(A,B,C)ABC111212AB1121BC1112ABC111112211212∏AB(R)∏BC(R)∏AB(R)∏BC(R)有损分解无损分解DataBaseSystem4.3.1模式分解中存在的问题关系模式的分解有几个衡量标准:分解具有无损连接分解保持函数依赖分解既要保持依赖,又要具有无损联接达到更高级范式DataBaseSystem4.3.2无损联接无损连接分解–定义关系模式R,分解成关系模式p={R1,R2…Rk},F是R上的一个函数依赖集。如果对R中满足F的每一个关系r都有:r=∏R1(r)∏R2(r)∏Rk(r)则称此分解p是相对于F是“无损连接分解”。即r为它在Ri上的投影的自然联接。∏Ri(r)表示关系r在模式Ri的属性上的投影。4.3.2无损联接的测试将R(A,B,C)分解为两个模式R1(A,B)和R2(B,C)ABCa1b1c1a2b1c2a7b3c3a8b4c4a9b5c5ABa1b1a2b1a7b3a8b4a9b5BCb1c1b1c2b3c3b4c4b5c5R(A,B,C)关系r1关系r2关系4.3.2无损联