|
3.3 关系模型的完整性
关系模型的完整性规则是对关系的某种约束条件。关系模型中可以有四类完整性约束:实体完整性,域完整性,引用完整性和用户自定义完整性。
3.3.1 实体完整性
实体完整性指表中行的完整性。要求表中的所有行都有唯一的标识符,称为主关键字。主关键字是否可以修改,或整个列是否可以被删除,取决于主关键字与其他表之间要求的完整性。
实体完整性规则规定基本关系的所有主关键字对应的主属性都不能取空值,例如,学生选课的关系选课(学号,课程号,成绩)中,学号和课程号共同组成为主关键字,则学号和课程号两个属性都不能为空。因为没有学号的成绩或没有课程号的成绩都是不存在的。
对于实体完整性,有如下规则:
· 实体完整性规则针对基本关系。一个基本关系表通常对应一个实体集,例如,学生关系对应学生集合。
· 现实世界中的实体是可以区分的,它们具有一种唯一性质的标识。例如,学生的学号,教师的职工号等。
在关系模型中,主关键字作为唯一的标识,且不能为空。
3.3.2 域完整性
域完整性指列的值域的完整性。如数据类型、格式、值域范围、是否允许空值等。
域完整性限制了某些属性中出现的值,把属性限制在一个有限的集合中。例如,如果属性类型是整数,那么它就不能是101.5或任何非整数。
3.3.3 引用完整性
引用完整性指被引用表中的主关键字和引用表中的外部主关键字之间的关系。如被引用行是否可以被删除等。
在现实生活中的实体之间总是存在着某种联系,在关系模型中实体与实体之间的联系都是用关系来描述的,这样就存在关系与关系之间的引用。例如,有学生实体和班级两个实体集合:
学生(学号,姓名,性别,年龄,班级编号)其中学号为主码。
班级(班级编号,学生数量,班主任姓名),其中班级编号为主码。
这两个关系之间存在着属性的引用,即学生关系引用了班级关系的主关键字"班级编号",显然,学生关系中的"班级编号"值必须是在班级表中确实存在的班级的班级编号,即班级关系中有该班级的记录。这说明学生关系中某个属性的取值要参照班级关系的属性取值。
在这种情况下,"班级编号"不是学生关系的主关键字,但是却是班级关系的主码,则称"班级编号"是学生关系的外关键字。
外关键字的定义:
设FK是基本关系R的一个或一组属性,但不一定是关系R的主关键字。如果FK与基本关系S的主关键字相对应,则称FK是基本关系R的外关键字,并称基本关系R为引用关系,基本关系S为被引用关系。
在上例中,"班级编号"是学生关系的外关键字,学生关系是引用关系,班级关系是被引用关系。
引用完整性就是定义外关键字与主关键字之间的引用规则。如果要删除被引用的对象,那么也要删除引用它的所有对象,或者把引用值设置为空(如果允许的话)。例如,前面的学生和班级关系中,删除某个班级元组之前,必须先删除相应的引用该班级的学生元组。这就是引用完整性。
图3-1,综合了三种关系数据的完整性。由图中可以看到,实体完整性是对应元组或行而言域完整性是对应属性或列而言,引用完整性是对不同表之间的属性或列的引用关系而言。
图3-1 关系数据的完整性
3.3.4 用户定义完整性
关系数据库系统根据应用环境不同,往往需要一些特殊约束条件,用户定义的完整性是针对某一具体应用领域,对关系数据库提出的约束条件。反应了某一具体应用涉及的数据必须满足的语义要求。
例如,集成电路芯片的生产工艺必须取值为:CMS、NMS和ECL三种值之一。又如,学生的年龄限制为14---35之间等等。关系模型提供了定义和检验这些完整性约束的机制,以便用统一的系统的方法处理它们,而不用应用程序处理。
3.3.5 实现数据完整性的方法:
实现数据完整性的方法有如下几种:
· 在关系模式定义描述中定义数据完整性检查条件;
· 使用触发器、存储过程实现数据完整性检查;
· 用其它编程工具编写程序实现数据完整性检查。
3.4 关系数据库数据模型实例----教学管理系统
下面以一个简单的高校教学管理系统作为实例,贯穿于我们本章的描述过程中。学校有若干系组成;每个系有若干研究所和若干学生班级组成;并开设多门课程;每个研究所有多名教师组成;每个教师有自己的研究方向和所教授的课程;每个班级有若干学生组成。
每个学生必须修学多门学位课程,每个教师可以教授多门课程,一门课程只能有一个教师讲解,所以学生可以修学数个教师的讲课,每个教师开设的课程必须同时有多个学生选课。
在这个例子中,我们看到,现实世界中存在许多事物。例如,学生、教师、研究所、系、班级、课程等,这些都是客观存在的实体。这些实体并不是孤立存在的,不同的实体之间是有联系的,这种联系也是客观存在的。比如,教师属于某个系的某个研究所,而且只能隶属于一个研究所,学生和教师通过选修课程建立联系。图3-2 是该教学管理系统的E-R模型图。
图3-2 教学管理系统的E-R模型图
该教学管理系统中的关系数据模型的实体类型:
系(系号,系名,电话,地址)
研究所(所号,所名,人数, 电话,地址,系号)
课程(课程号,课程名, 学分,开课系号,授课教师号)
班级(名称,人数, 电话,系号)
学生(学号,姓名,性别,年龄, 斑号)
教师(编号,姓名, 性别, 所号,电话,地址)
选课(课程号,学号,成绩)
关系数据模型中的关系模式如下:
(1) 系dept
(系编号 CHAR(10),系名称 CHAR(20),
系电话 CHAR(12),系地址 CHAR(40))
key 系编号
(2) 研究所institute
(研究所编号 CHAR(10), 研究所名称 CHAR(30), 研究所人数 INT,
研究所电话 CHAR(12), 研究所地址 CHAR(40),系编号 CHAR(10))
key 研究所编号
(3) 课程couse
(课程编号 CHAR(10), 课程名称 CHAR(20),
学分 INT,系编号 CHAR(10),教师编号: CHAR(10))
key 课程编号
(4) 班级class
(班级编号 CHAR(20), 班级人数 INT,
班级电话 CHAR(12), ,系编号 CHAR(10))
key 班级编号
(5) 学生student
(学号 CHAR(10),姓名 CHAR(20),
性别 CHAR(1),年龄 INT,班级编号 CHAR(20))
key 学号
(6) 教师teacher
(教师编号 CHAR(10),教师名称 CHAR(20),研究所编号 CHAR(10),
教师电话 CHAR(12),教师地址 CHAR(40) ,系编号 CHAR(10))
key 教室编号
(7) 选课sc
(课程号 CHAR(10),学号 CHAR(10),成绩 INT)
key (课程号, 学号)
[ 本帖最后由 cayean 于 2007-1-22 16:59 编辑 ] |
|