1、数据库系统概论,学生: 07春本科计算机专业(班主任:黎志强,班长:高海涛,共7人) 老师: 张秉才联系电话:2701566 授课时间:2008.9.1-2009.1,目录,第一章 数据库系统概述 第二章 数据库建模 第三章 关系模型和关系运算 第四章 数据库语言-SQL 第五章 查询优化与并发控制 第六章 关系数据库设计理论 第七章 数据库设计 第八章 SQL系统环境 第九章 面向对象查询语言 第十章 数据库技术发展动态 总复习,第一章 数据库系统概述,本章要点1、通过理解数据库系统主要特点,初步了解数据库系统全貌。 2、对关系、关系模型、关系数据库系统等基本概念有初步理解。 3、了解数据库
2、管理系统的组成和各部分的基本功能。 4、初步理解本章中提到的有关数据库的专业术语。,一、人工管理阶段特点 数据不进行保存;没有专门的数据管理软件;数据面向应用;基本上没有文件的概念。 二、文件系统阶段特点数据可以长期保存在磁盘上;文件系统提供数据与程;序之间的存取方法;数据冗余量大;文件之间缺乏联系,相互孤立,仍然不能反映现实世界各种事物之间错综复杂的联系。 三、数据库系统阶段特点数据的结构化;数据共享性好;数据独立性好;数据存取粒度小;数据库管理系统(DBMS)对数据进行统;一的管理和控制;为用户提供了友好的接口,1.2 有关数据库的基本术语,一、数据:凡是计算机中用来描述事物的记录,都可以
3、统称为数据。 二、数据模型:数据模型通常由数据结构、数据操作和完整性约束 三要素组成。数据结构描述系统静态特性,是所研究对象的类型的集合。三、数据库:数据库就是由DBMS管理的数据的聚集。四、数据库管理系统:专门用于建立和管理数据库的一套软件,介于应用程序和操作系统之间。DBMS不仅具有最基本的数据管理功能,还能保证数据的完整性、安全性,提供多用户的并发控制,当数据库出现故障时对系统进行恢复。五、数据库系统:包括和数据库有关的整个系统:数据库、DBMS、应用程序以及数据库管理员和用户等等,1.3 关系数据库系统,关系:所谓关系,就是一张表。 如: 表一 表二,1.4 据库系统的体系结构,1 从
4、数据库管理系统的角度看,可分为三层, 从外到内依次为外模式、模式和内模式。 2 数据库管理系统在三层结构之间提供了两层映象:外模式/模式映象和模式/内模式映象返回目录,第二章 数据库建模,本章要点 1、掌握数据库建模的两种基本方法:对象定义语言(ODL)和实体-联系模型(E/R图) 2、会用这两种方法建立简单的数据库模型。 3、掌握用ODL和E/R图表示子类的方法 4、深入理解键码和引用完整性这两个基本概念,数据库建模概述,1、数据库的结构,也称为数据库模式。因此,确定数据库的结构的过程就称为数据库建模。 2、两种主要数据库模式表示法:实体联系模型,也叫做E/R图 ,矩形表示实体, 椭圆形表示
5、属性,菱形和箭头表示联系。 对象定义语言(ODL):是面向对象的数据库设计方法,数据库设计的过程图,2.1 对象定义语言ODL,ODL类的三种特性:1、属性(Attribute) 它们的类型由基本的数据类型构成。2、联系(Relationship) 它们的类型是对某类对象的引用或引用的集合。3、方法(Method) 是能用于该类对象的函数。,类的说明和ODL的描述,interface ; 例:学生选课数据库中,每门课中有三个属性:CourseNo(课程号)、CourseName(课程名)、Teacher(老师),可用ODL表示如下: interface Course attribute int
6、eger CourseNo;attribute string CourseName; attribute string Teacher;,ODL中的联系和反向联系,联系: 描述一个对象与其他对象之间的联系。 例:课程和学生之间存在选课联系,在课程类的说明中增加一个学生集合,作为课程类和学生类之间的联系: relationship Set students; relationship Set courses,反向联系 relationship Set students inverse Student:courses; relationship Set courses inverse Course
7、:students;,一个较完整的课程类定义:,interface Course attribute integer CourseNo; attribute string CourseName; attribute string Teacher; relationship Set students inverse Student:courses; ,2.2 实体联系模型(E/R图),建模方法 联系的三种类型 实际例子,2.4 子类,定义:把类中的某些对象组织成子类, 特性:除了作为整体的类的特性以外,每个子类有它自己的附加属性和/或联系。 定义子类的方法: 在类名A之后加上冒号和另一个类B的名
8、字,就可以定 义类A是类B的子类。 例如:学生类的研究生类表示 interface Postgraduate:Student attribute string Tutor;/导师姓名 ;,上例中,每个研究生对象都有从Student中继承下来的属性StudentNo、StudentName、Age和Dept,并从Student中继承了联系Courses,除此之外,还有它自己的属性Tutor。,Dept,StudentName,2.5 (约束)对约束的建模,1键码(key) 2单值约束:要求某个属性的值是唯一的,键码是单值约束的主要来源。 3引用完整性约束 4域约束:要求某个属性的值必须处于特定的
9、范围内或者取自特性值的集合。 5.一般约束:有些时候,我们希望在数据库中实施一些其他类型的约束。 返回目录,第三章 关系模型和关系运算,学习要点 关系模型的基本概念:关系模型、属性、模式、元组和域。 如何将ODL 、ER图转换为关系模型? 三种抽象的查询语言:关系代数语言、关系演算语言、关系逻辑语言的使用。 原子属性与非原子属性。,. 关系模型的基本概念,1 关系的名称和属性名集称为关系的模式。表示为:,Student(StudentNo,StudentName,Age,Dept),2,3.2 3.3 从ODL/ER图-关系表,ODL-关系表:1 属性对应关系表中的属性名2 实体的名就是关系名
10、 ER图-关系表:1 同上2 关系 相关实体的键码属性名和关系的属性名作为表的名 实例分析,3.4 关系代数,并、交、差 投影 选择 笛卡儿积 自然连接 连接 改名 复合运算,=,1 RUS是R中的元素和R中的元素共同组成的表.,U,=,2. R S是R和S中出现的共同元素组成的表.,=,-,3. R-S就是在R中出现但在S中不出现的元素组成的表.,投影 用于对关系R产生一个新的关系S,S只具有R的某几个属性。,选择关系条件: 用于对关系R产生一个新的关系S,S是R的满足条件的子集。,笛卡儿积 :模式是R和S的并,元组是R和S中元组的所有组合所有,自然连接:模式是R和S的并,元素是RXS元组上
11、在公共属性上值相同的元素组成的表,复合运算:先括号-选择-投影,3.5 关系演算-元组关系演算,元组关系演算表达式的一般形式是t|(t),其中t是元组变量,(t)是以元组变量t为基础的公式。公式是递归定义的:(1) 原子公式是公式;(2) 如果1(t) 2(t)是公式,那么 1,12,12,也都是公式,它们为真的条件是:“1非真”,“1和2皆为真”,“1与2中至少有一个为真”。 (3)如果是公式,那么( t) ()和 ( t) () 也都是公式,它们为真的条件分别是:“至少有一个元组t使得为真”,“所有的元组t都使为真”。其中 为存在量词, 为全称量词。若在变量前面加上量词,则变量为约束变量。
12、我们称( t) ()和 ( t) ()中的t为约束变量。原子公式: (1)R(t),其中R是关系名,t是元组变量,R(t)表示t是关系R的一个元组; (2)tisj,其中t和s是元组变量,是算术比较运算符(如,等),tisj表示元组t的第i个分量与元组s的第j个分量满足 关系。 (3)tiC或Cti,其中C表示一个常量,其含义同上。,3.5 关系演算-域关系演算,见P59,举例,结合学生选课数据库,分别用关系代数、元组关系演算和域关系演算表示如下查询: (1)学号为9900111的学生的系别和年龄; (2)有不及格(成绩60)学生的课程名; (3)计算机系有不及格课程的学生名单; (4)学生张
13、林的“数据库原理”课成绩。假设学生选课数据库关系模式如下:Student (SNo, SName, SAge ,SDept )Course (CNo, CName) SC (SNo,CNo, Score),学号为9900111的学生的系别和年龄,有不及格(成绩60)学生的课程名,计算机系有不及格课程的学生名单,学生张林的“数据库原理”课成绩,小节,注意:在书写元组关系演算和域关系演算时,可以考虑从后向前写。 例如,对于第4小问的元组关系演算,c2是“数据库原理”;s2是“张林”;下面是三个关系之间如何建立联系,c中的c1(Course中的第1项CNo)就是u2(SC中的第2项CNo),u的u1
14、(SC中的第1项SNo)就是s1(Student中的第1项SNo),t1是u3即成绩;在这个元组关系演算中需要涉及Student、Course、SC三个关系,并分别与s2、u3、c2相关。 返回目录,第四章 数据库语言SQL,本章要点: 1、用结构化查询语言SQL对数据库进行查询 2、连接查询。 3、嵌套查询。相关子查询。 4、对数据库进行更新。 5、定义关系模式。 6、定义和查询视图。,4.2 简单查询,SQL中最简单的查询就是从某个关系中查找满足某种条件的元组,这类似于关系代数中的选择运算。 这种查询的一般格式如下:SELECT *FROM 关系名WHERE 选择条件 注意*的意义,相当于
15、关系的所有属性。 例:在关系Student中查询计算机系年龄小于18岁的所有学生: SELECT * FROM Student WHERE Age18 And Dept=“计算机系”,用Select实现投影运算,要实现关系代数中的投影运算,只需要在Select子句中用所要投影的属性名代替*即可。 例如,查询计算机系年龄大于18岁的学生的学号,用SQL语句表示如下SELECT StudentNoFROM StudentWHERE Age18 And Dept=“计算机系”,where子句,如果只想简单地列出一个关系中的所有元组,不加任何选择条件,那么Where子句可以省略。 例:列出所有学生的学
16、号和姓名:SELECT StudentNo,StudentNameFrom Student,给结果关系属性取别名,有时为了阅读起来更加方便,可以给Select子句中的结果关系属性取别名,可以用“AS”关键字实现。 语法格式为:SELECT 属性的原名 AS 别名 例:SELECT StudentNo AS No,StudentName AS NameFROM Student;,AS作为某些特殊用途,利用属性表达式作为结果输出,使用AS关键字, 例如,要求查询学生的姓名和出生年份:SELECT StudentName AS Name, 2000-Age AS BirthYearFROM Stud
17、ent ; 作为汉化的作用(字段名为拼音缩写或英文字,用AS翻译为汉字输出显示)。,选择条件的构成,SQL语句的WHERE子句包括一个关键字WHERE和跟在其后的一个表达式。表达式中可以是算术运算符,比较运算符,逻辑运算符。l 选择条件的构成 可以将对某两个值的比较看作一个子条件,多个子条件之间可以用逻辑运算符连接,最终构成更为复杂的选择条件。 涉及空值的查询空值用NULL来表示。 我们说一个值是空值或者不是空值,不能表示为:“=NULL”或“NULL”,而要表示为:“IS NULL”或“IS NOT NULL” 如:查询缺少年龄信息的学生名单:SELECT StudentNameFROM S
18、tudentWHERE Age IS NULL;,字符串的比较,字符串之间按字典顺序比较大小; s LIKE p和s NOT LIKE p是一种特殊形式的比较表达式,我们可以通过它获得基于简单模式匹配的字符串比较功能。其中s是普通字符串,p是模式,表示包含%和_两种任选的具有特殊含义的字符的字符串。%:和任意字符组成的任意长度的字符序列匹配;_:和任意一个字符匹配。字符串匹配查询(模糊查询)实例1 SELECT * FROM Student WHERE StudentName LIKE 李;SELECT * FROM Student WHERE StudentName LIKE 平;字符串匹配
19、查询(模糊查询)实例2 SELECT * FROM Student WHERE StudentName LIKE 高_;SELECT * FROM Student WHERE StudentName NOT LIKE %平%;,输出的排序,在WHERE子句的选择条件后面加上如下子句:ORDER BY 我们也可以在属性的后面加上关键字DESC来实现降序输出加ASC是升序. 例:查询所有计算机系的学生,结果先按年龄从大到小排序,在年龄相同的情况下按学号从小到大排序:SELECT *FROM StudentWHERE Dept=计算机系ORDER BY Age DESC, StudentNo;,聚合
20、运算符,SQL提供了5种适用于关系中列的运算符:1 SUM,求某列中所有值的和;2 AVG,求某列中所有值的平均值;3 MIN,求某列中的最小值;4 MAX,求某列中的最大值;5 COUNT,求某列中值的个数。 查询所有学生的平均年龄:SELECT AVG(Age)FROM Student; 查询学生的最大年龄:SELECT MAX(Age)FROM Student; 查询计算机系学生的人数:SELECT COUNT(*)FROM StudentWHERE Dept=计算机系;,分组,有时我们需要的并不是某一列值的某种聚合,而是将这一列值根据其他某列(或某几列)划分成组,再求每一组值的某种聚合
21、。这时我们需要在WHERE子句的后面加上一个GROUP BY子句,关键字GROUP BY的后面给出分组属性列表。 想知道每个系的学生人数,显然用来分组的属性是系别Dept,查询语句如下:SELECT Dept, COUNT(*)FROM StudentGROUP BY Dept;,分组再限制条件的查询,如果只希望查询满足一定条件的分组情况,可以使用关键字HAVING来选择具有给定条件的分组。 例如:查询学生人数多于50人的系的具体学生人数:SELECT Dept, COUNT(*)FROM StudentGROUP BY DeptHAVING COUNT(*)50;,4.3 连接查询,要完成复
22、杂的查询,必须将两个或两个以上的关系连接起来。 并、交、差在SQL中各自有相应的关键字来表示; 连接和笛卡尔积,不需要有额外的关键字,仅仅使用普通的SELECT-FROM-WHERE语句,就可以方便的表示。 三个或三个以上关系的连接查询,查询的并、交、差,SQL使用关键字UNION、INTERSECT和EXCEPT分别代表并、交和差。 这类关键字用在两个查询之间,查询必须用圆括号括起来。 例: 列出计算机系年龄大于18岁并且选修了1234号课程的学生学号,查询的SQL语句应该是:(SELECT StudentNoFROM StudentCourseWHERE courseNo=1234;)IN
23、TERSECT( SELECT StudentNoFROM StudentWHERE Age18 AND Dept=计算机系;),连接与笛卡儿积,SQL中不用另外设置关键字,只要用一个简单的方法就可以把几个关系连接到一个查询中:在FROM子句中列出涉及到的每个关系,这样SELECT和WHERE子句就可以引用FROM子句中列出的任何属性了。连接的条件写在WHERE子句中;例:列出计算机系年龄大于18岁并且选修了1234号课程的学生学号:SELECT StudentNoFROM Student,StudentCourseWHERE Student.StudentNo=StudentCourse.S
24、tudentNo AND CourseNo=1234;这相当于关系代数中的自然连接;,三个或三个以上关系的连接查询,查询“C+程序设计”课成绩高于80分的学生姓名。这个查询涉及到三个关系:Student、StudentCourse和CourseSELECT StudentNameFROM Student,StudentCourse,CourseWHERE Student.SNo=StudentCourse.Sno AND Course.Cno=StudentCourse.Cno AND CourseName=“C+程序设计” AND Score80;,嵌套查询,嵌套查询就是把一个SELECT-
25、FROM-WHERE查询语句嵌套在另一个SELECT-FROM-WHERE查询语句中,前者可以称为子查询,也叫内查询,后者相应地称为外查询。 查询所有跟学号为9900011的学生同名的其他学生的学号。SELECT StudentNoFROM StudentWHERE StudentNo9900011 AND StudentName =( SELECT StudentNameFROM StudentWHERE StudentNo=9900011);,4.4 涉及到关系的选择条件,SQL中有些特定的运算符能作用于关系R而生成布尔值的结果。这些运算符包括:1EXISTS: 当且仅当R非空(至少有一个
26、元组)时,条件EXISTS R为真。2IN:当且仅当s 和R中的某个值相等时,s IN R为真。当且仅当s和R中的任何一个值都不相等时,s NOT IN R为真。3ALL,当且仅当s与一元关系R中的每个值都满足关系时,sALL R为真;是6个比较运算符(=、=)中的任意一个。 4ANY,当且仅当s与一元关系R中的至少一个值满足关 系时,sANY R为真。 EXISTS、ALL和ANY运算符都可以通过在整个表达式前面加上NOT来求反,就像其他布尔值的表达式一样。于是,当且仅当R为空时,NOT EXISTS R为真;其他可以依此类推。注意:sANY R含义相同。 在学生选课关系中找出平均成绩最好的
27、学生的学号。SELECT StudentNoFROM StudentCourseGROUP BY StudentNoHAVING AVG(Score)=ALL(SELECT AVG(Score)FROM StudentCourseGROUP BY StudentNo);,涉及到元组的选择条件,如果元组 t和关系R具有相同数量的分量,那么4.4.2节中列出的运算符作用于t和R就有意义,例如t IN R或者t=ANY R。当然,将元组t和关系R中的元组进行比较时,我们的前提是有一个“标准”的属性顺序。 查询选修了“程序设计”课的学生名单:SELECT StudentNameFROM Student
28、WHERE StudentNo IN( SELECT StudentNoFROM StudentCourseWHERE CourseNo IN( SELECT CourseNo FROM CourseWHERE CourseName=程序设计);,4.5 数据库更新,插入语句往关系中插入元组 删除语句从关系中删除某些元组 修改语句修改关系中已经存在的 元组中某些分量的值 返回目录,第五章 查询优化与并发控制,本章要点 1在学会用SQL语言对数据库进行查询的基础上,了解数据库系统是如何对查询进行优化的。 2深入理解查询优化策略;掌握用关系代数等价变换规则对关系代数查询表达式进行优化的方法;学会按
29、查询优化的步骤对查询进行优化。 3了解并发操作可能带来的数据不一致现象,深入理解保证数据一致性的三级封锁协议和保证并行调度可串行性的两段锁协议。,5.1 一般采用以下策略,1选择运算尽早进行。2投影运算与选择运算同时进行。3将笛卡尔积与随后的选择运算合并为连接运算。4投影运算与其他运算同时进行。5寻找公共子表达式并将结果存储。6对文件进行预处理。,5.2关系代数的等价变换,1. 关系代数表达式的优化是查询优化的重要基础。2. 所谓关系代数表达式的优化,就是要按照一定的等价变换规则将其转换为查询效率更高的表达式,5.3 查询优化步骤,1把查询转换成一种内部表示 2利用关系代数等价变换规则以及查询
30、优化的一般策略,将语法树进行优化,选择运算应该尽量先做。 3选择适当的低层存取路径 .4生成一组查询计划,从中选择一个代价最小的。,5.4 并发调度,数据库通常会供多个用户同时使用,例如学生选课的情形:多名学生同时利用多台选课终端对学生选课数据库进行操作,也就是并发操作。由于操作时间上的重叠,很可能有两个操作同时作用于同一个选课名额,可能会导致错误的结果。,事务,事务是在数据库上的一个或多个操作的序列,它必须以原子的方式执行,也就是说,所有的操作要么都做,要么都不做。 当对数据库进行查询或更新的任何SQL语句开始时,事务也就开始了。 在SQL中不必给出任何专门的事务开始语句,但是必须明确地结束
31、一个事务,通常有两种方式来结束事务:1SQL语句COMMIT(提交)使事务成功的结束。2SQL语句ROLLBACK(退回)使事务不成功的终止。 学生选课事务可以是如下操作的序列:(1)读出某课程的余额A;(2)若余额A0,则产生一个选课记录,修改课程余额A=A-1,将A写回数据库;若A=0,则报告“选课名额已满”;(3)COMMIT。 也可以换一种方式:(1)读出某课程的余额A,修改A=A-1,将A写回数据库;(2)若A=0,则产生一个选课记录;若A0,则转 (4);(3) COMMIT;(4) ROLLBACK;,5.5封锁管理,封锁机制中的主要概念,封锁机制中的主要概念,封锁:指的是某事务
32、在对某数据对象(如关系)进行操作以前,先请求系统对其加锁;成功加锁之后该事务就对该数据对象有了控制权,只有该事务对其进行解锁之后,其他事务才能更新它。 数据库管理系统提供的封锁类型有两种:排它锁(Exclusive Lock,简记为X锁)共享锁(Share Lock,简记为S锁)。 若事务T对数据对象A加了X锁,则T就可以对A进行读取以及更新(X锁因此又称为写锁);在T释放A上的X锁以前,任何其他事务都不能再对A加任何类型的锁,从而也不能读取和更新A。 若事务T对数据对象A加了S锁,则T就可以对A进行读取,但不能进行更新(S锁因此又称为读锁),在T释放A上的S锁以前,其他事务可以再对A加S锁,
33、但不能加X锁,从而可以读取A,但不能更新A。 加锁的数据对象可以大到整个关系、整个数据库,也可以小到一个元组、一个元组的某个分量。 封锁对象的大小称为封锁的粒度。 封锁粒度与系统的并发程度以及并发控制的开销息息相关。 封锁粒度越大,系统中能封锁的数据对象就越少,可以同时进行的并发操作也越少,于是系统的并发程度越低;反之,封锁粒度越小,则系统的并发程度越高。,封锁协议,为了保证正确的并发控制,在运用封锁机制时必须遵从一定的规则。 不同的封锁协议(Locking Protocol)约定了不同的规则,为并发控制提供不同正确度的保证。,三级封锁协议,1. 级封锁协议约定:事务T在修改数据A之前必须先对
34、其加X锁,直到事务结束(提交或退回)才释放该锁。2. 级封锁协约定:事务T在读取数据A之前必须对其加S锁,读入该数据后即可立即释放S锁。3. 级封锁协议约定:事务T在读取数据A之前必须对其加S锁,直到事务结束(提交或退回)才能释放S锁。 l,两段锁协议,两段锁协议约定:事务T在对数据A进行读或写操作以前,必须先获得对A的封锁,并且在释放一个封锁之后,T不能再获得任何其他封锁。 “两段”锁的含义事务分成获得封锁和释放封锁即加锁和解锁两个阶段。 返回目录,第6章 关系数据库设计理论,本章要点 1深入理解函数依赖和键码的概念。学会计算属性的封闭集。 2模式设计是本章的重点。了解数据冗余和更新异常产生
35、的根源;理解关系模式规范化的途径;准确理解第一范式、第二范式、第三范式和BC范式的含义、联系与区别; 3.深入理解模式分解的原则;熟练掌握模式分解的方法,能正确而熟练的将一个关系模式分解成属于第三范式或BC范式的模式。,6.1 函数依赖,6.1.1定义 如果关系R的两个元组在属性A1,A2, An上一致(也就是,两个元组在这些属性所对应的各个分量具有相同的值),则它们在另一个属性B上也一致。那么,我们就说在关系R中属性B函数依赖于属性A1A2An。 A1A2An B, “A1,A2,An函数决定B”。A1A2An称为决定因素。,6.1.2 关系的键码,如一个或多个属性的集合A1,An满足如下条
36、件,称该集合为关系R的键码:1这些属性函数决定该关系的所有其它属性。2. A1,An的任何真子集都不能函数决定R的所有其它属性,键码必须是最小的。,6.1.3 超键码,包含键码的属性集称为“超键码” 。因此,每个键码都是超键码。某些超键码不是(最小的)键码。每个超键码都满足键码的第一个条件:函数决定它所在的关系的所有其它属性。超键码不必满足键码的第二个条件:最小化条件。,6.1.4 函数依赖规则 1、分解/合并规则可以把每个函数依赖右边的属性分解,从而使其右边只出现一个属性。同样,我们也可以把左边相同的依赖的聚集用一个依赖来表示,该依赖的左边没变,而右边则为所有属性组成的一个属性集。两种情况下
37、,新的依赖集都等价于旧的依赖集。 2、平凡依赖规则对于函数依赖A1A2An B来说,如果B是A中的某一个,我们就称之为“平凡的”。对于函数依赖A1A2An B1B2Bm,如果B是A的子集,则称该依赖为平凡的。 如果B中至少有一个属性不在A中,则称该依赖为非平凡的。如果B中没有一个属性在A中,则称该依赖为完全非平凡的。函数依赖A1A2An B1B2Bm等价于A1A2An C1C2Ck,其中 C是B的子集,但不在A中出现。我们称这个规则为“平凡依赖规则” 。 3、传递规则传递规则使我们能把两个函数依赖级联成一个新的函数依赖。如果A1A2An B1B2Bm和B1B2Bm C1C2Ck,在关系R中成立
38、,则A1A2An C1C2Ck在R中也成立。这个规则就称为传递规则。,6.1.5 计算属性的封闭集,假设A1,A2,An是属性集,记为A,S是函数依赖集。属性集A在依赖集S下的封闭集是这样的属性集X,它使得满足依赖集S中的所有依赖的每个关系也都满足A X。也就是说,A1A2An X是蕴含于S中的函数依赖。用A1,An+表示属性集A1An的封闭集。允许出现平凡依赖,所以A1,An在A1,An+中。 对于给定的函数依赖集S,属性集A函数决定的属性的集合就是属性集A在依赖集S下的封闭集。 学会计算某属性集的封闭集,还可以根据给定的函数依赖集推导蕴含于该依赖集的其他函数依赖。,已知:关系模式R(A,B
39、,C,D)函数依赖AB C,C D,D A求:蕴含于给定函数依赖的所有非平凡函数依赖。 首先考虑各种属性组合的封闭集。然后,依次分析各属性集的封闭集,从中找出该属性集所具有的新的函数依赖。单属性:A+=A,B+=B,C+=ACD,D+=AD新依赖:C A (1)双属性:AB+=ABCD,AC+=ACD, AD+=AD, BC+=ABCD,BD+=ABCD,CD+=ACD 新依赖:AB D AC D BC A BD A CD A BC D BD C (7)三属性:A B C+=ABCD,A B D+=ABCD,ACD+=ACD,B C D+=ABCD新依赖:ABC D ABD C BCD A (
40、3)四属性:A B C D+=ABCD 无新依赖,l 模式设计 设计关系数据库模式时,特别是从面向对象的ODL设计或从E/R设计直接向关系数据库模式转换时,很容易出现的问题是冗余性,即一个事实在多个元组中重复。 造成这种冗余的最常见的原因是,企图把一个对象的单值和多值特性包含在一个关系中。 当我们企图把太多的信息存放在一个关系时,就会出现数据冗余和更新异常等问题。主要表现如下:1 数据冗余。2 修改异常。3 删除异常。4 插入异常。 关系的键码函数决定该关系的所有其它属性。由于键码能唯一确定一个元组,所以,也可以说关系的键码函数决定该关系的所有属性。一个关系中的所有属性都函数依赖于该关系的键码
41、。不同的属性在关系模式中所处的地位和扮演的角色是不同的。把键码所在的属性称为主属性,而把键码属性以外的属性称为非主属性。 不同的属性对键码函数依赖的性质和程度是有差别的。有的属于直接依赖,有的属于间接依赖(通常称为传递依赖)。 当键码由多个属性组成时,有的属性函数依赖于整个键码属性集,而有的属性只函数依赖于键码属性集中的一部分属性。,完全依赖与部分依赖,对于函数依赖W A,如果存在V W(V是W的真子集)而函数依赖V A成立,则称A部分依赖于W;若不存在这 种V,则称A完全依赖于W。当存在非主属性对键码部分依赖时,就会产生数据冗余和更新异常。若非主属性对键码完全函数依赖,则不会出现类似问题,传
42、递依赖,对于函数依赖X Y,如果Y X(X不函数依赖于Y)而函数依赖Y Z成立,则称Z对X传递依赖。如果X Y,且Y X,则X,Y相互依赖,这时Z与X之间就不是传递依赖,而是直接依赖了。我们以前所讨论的函数依赖大多数是直接依赖。,部分依赖和传递依赖共同点和范式的提出,部分依赖和传递依赖有一个共同之处,这就是,二者都不是基本的函数依赖,而都是导出的函数依赖: 部分依赖是以对键码的某个真子集的依赖为基础 传递依赖的基础则是通过中间属性联系在一起的两个函数依赖。 导出的函数依赖在描述属性之间的联系方面并没有比基本的函数依赖提供更多的信息。在一个函数依赖集中,导出的依赖相对于基本的依赖而言,虽然从形式
43、上看多一种描述方式,但从本质上看,则完全是冗余的。 正是由于关系模式中存在对键码的这种冗余的依赖导致数据库中的数据冗余和更新异常。 解决的途径消除关系模式中各属性对键码的冗余的依赖。 由于冗余的依赖有部分依赖与传递依赖之分,而属性又有主属性与非主属性之别,把解决的途径分为几个不同的级别,以属于第几范式来区别。,6.2 范式定义和分类,范式就是符合某一种级别的关系模式的集合。目前主要有六种范式:第一范式、第二范式、第三范式、BC范式、第四范式和第五范式。第一范式需满足的要求最低,在第一范式基础上满足进一步要求的为第二范式:通过分解把属于低级范式的关系模式转换为几个属于高级范式的关系模式的集合,这
44、一过程称为规范化。,第一范式,如果一个关系模式R的所有属性都是不可分的基本数据项,则这个关系属于第一范式。在任何一个关系数据库系统中,第一范式是对关系模式的一个最起码的要求。不满足第一范式的数据库模式不能称为关系数据库。,l 关系分解的含义 关系R的分解包括两个方面,一方面是把R的属性分开,以构成两个新的关系模式:另一方面是通过对R的元组进行投影而产生两个新的关系。 给定一个模式为A1,A2,An的关系R,我们可以把R分解为两个关系S和T,模式分别为B1,B2,Bm和C1,C2,Ck,使得:1A1,An=B1,BmC1,Ck 2关系S中的元组是R的所有元组在B1,Bm上的投影。对于R的当前实例
45、的每个元组t,取t在属性B1,B2,Bm上的分量。这些分量构成一个元组,它属于S的当前实例。3类似地,关系T中的元组是R的当前实例中的元组在属性集C1,C2,Ck上的投影。,第二范式,若关系模式R属于第一范式,且每个非主属性都完全函数依赖于键码,则R属于第二范式。第二范式就是不允许关系模式中的非主属性部分函数依赖于键码。 学生关系模式Student(Sno,Sname,Sdept,Mname,Cname,Grade)。该关系模式存在如下部分依赖:Sno,Cname Sname,Sdept,Mname显然不满足“每个非主属性都完全函数依赖于键码”的条件。所以学生关系模式不属于第二范式。,第三范式
46、,若关系模式R属于第一范式,且每个非主属性都不传递依赖于键码,则R属于第三范式。这里应说明一点:属于第三范式的关系模式必然属于第二范式。因为可以证明部分依赖蕴含着传递依赖。 关系模式 S1(Sno,Sname,Sdept,Mname)由于存在传递依赖而不属第三范式 . S1分解成两个关系模式 S11(Sno,Sname,Sdept) S12(Sdept,Mname),BC范式(BCNF),若关系模式R属于第一范式,且每个属性都不传递依赖于键码,则R属于BC范式。通常BC范式的条件有多种等价的表述:每个非平凡依赖的左边必须包含键码;每个决定因素必须包含键码。BC范式既检查非主属性,又检查主属性。
47、当只检查非主属性时,就成了第三范式。满足BC范式的关系都必然满足第三范式。 关系模式STC(SN,TN,CN,G)SN,CN TN,GSN,TN CN,GTN CN键码为:SN,CN和SN,TN。 关系模式STC分解成SC(SN,CN,G)ST(SN,TN),l 模式分解的三种方法 1、部分依赖归子集;完全依赖随键码。要使不属于第二范式的关系模式“升级”,就要消除非主属性对键码的部分依赖。解决的办法就是对原有模式进行分解。分解的关键在于:找出对键码部分依赖的非主属性所依赖的键码的真子集,把这个真子集与所有相应的非主属性组合成一个新的模式;对键码完全依赖的所有非主属性则与键码组合成另一个新模式。
48、 2、基本依赖为基础,中间属性作桥梁要使不属于第三范式的关系模式“升级”,就要消除非主属性对键码的传递依赖。解决的办法非常简单:以构成传递链的两个基本依赖为基础形成两个新的模式,这样既切断了传递链,又保持了两个基本依赖,同时又有中间属性作为桥梁,跨接两个新的模式,从而实现无损的自然连接。 找违例自成一体,舍其右全集归一3、若发现仍有违例,再回首如法炮制要使关系模式属于BC范式,既要消除非主属性对键码的部分依赖和传递依赖,又要消除主属性对键码的部分依赖和传递依赖。 如果一个关系数据库中的所有关系模式都满足于BC范式,那么在函数依赖范畴内,它已实现了模式的彻底分解,达到了最高的规范化程度,消除了更新异常和信息冗余。,第一范式是关系模式的基础,因此,即使未明确指出某关系模式属于第一范式,也应认为尽在不言中。对键码和函数依赖的分析是判别第二、第三和BC范式的基础。在分析函数依赖的基础上找出关系的键码,从而把属性分为主属性和非主属性。第二、第三范式只检查非主属性与键码之间的函数依赖关系。BC范式检查每个函数依赖,而不分主属性和非主属性。 返回目录,