摘要:数据完整性由完整性规则来定义,关系模型的完整性规则是对关系的某种约束条件。关系模型中可以有3类完整性约束:实体完整性、参照完整性和用户定义的完整性。
9.1.2关系模型的完整性约束
数据完整性由完整性规则来定义,关系模型的完整性规则是对关系的某种约束条件。关系模型中可以有3类完整性约束:实体完整性、参照完整性和用户定义的完整性。
为了维护数据库中数据的完整性,在对关系数据库执行插入、删除和修改操作时,必须遵循这3类完整性规则。
为了便于理解关系模型的3类完整性规则,考虑一个实例。
[例1〕在学生选课管理数据库中有如下4个关系:
学生(学号,姓名,性别,专业号,年龄),主码为学号
课程(课程号,课程名,学分),主码为课程号
选修(学号,课程号,成绩),主码为学号,课程号
专业(专业号,专业名),主码为专业号
1.实体完整性规则(entity integrity rule)
若属性A是关系R的主属性,则属性A不能取空值。实体完整性规则是对关系中的主键属性值的约束,即:关系中的元组在组成主键的属性上不能有空值。实体完整性规则规定关系的所有主属性都不能取空值,而不仅是主码整体不能取空值。例1中的关系"学生(学号,姓名,性别,专业号,年龄)"中,主码为"学号",则"学号"不能取空值。在关系"选修(学号,课程号,成绩)"中,"学号、课程号"为主码,则"学号"和"课程号"两个属性都不能取空值。
对于实体完整性规则说明如下:
·实体完整性规则是针对关系而言的。一个关系通常对应现实世界的一个实体集。例如学生关系对应于现实世界中学生的集合。
·现实世界中的实体是可区分的,即它们具有某种惟一性标识。
·相应地,关系模型中以主码作为惟一性标识。
·主码中的属性即主属性不能取空值。所谓空值就是"不知道"或"无意义"的值。如果主属性取空值,就说明存在某个不可标识的实体,即存在不可区分的实体,这与第2点相矛盾,因此这个规则称为实体完整性规则。
2.参照完整性规则(reference integrity rule)
若属性(或属性组)F是关系R的外码,它与关系S的主码KS相对应(关系R和S不一定是不同的关系),则对于R中每个元组在F上的值必须为:
·或者取空值(F的每个属性值均为空值)。
·或者等于S中某个元组的主码值。
参照完整性规则就是定义外码与主码之间的参照约束,即外码的值不允许参照不存在的相应表的主码的值,或者外码为空值。
现实世界中的实体之间往往存在某种联系,在关系模型中实体及实体间的联系都是用关系来描述的。这样就自然存在着关系与关系之间的参照(引用)。先来看3个例子。
[例2]学生实体和专业实体可以用例1中的学生关系和专业关系表示,其中主码用下划线标识:
学生(学号,姓名,性别,专业号,年龄)专业(专业号,专业名)
这两个关系之间存在着属性的引用,即学生关系引用了专业关系的主码"专业号".显然,学生关系的"专业号"属性与专业关系的主码"专业号"相对应,因此"专业号"属性是学生关系的外码,它的值必须是确实存在的专业号,即专业关系中有该专业的记录。这里专业关系是被参照关系,学生关系为参照关系,这也就是说,学生关系中的外码属性的取值需要参照专业关系的属性取值。如图9.4(a)所示。
[例3]学生与课程之间存在多对多的联系,因为一个学生可以选修多门课程,一门课程也可以被多个学生选修。对这种情况,可以用例1中的如下3个关系表示,其中主码用下划线标识:
学生(学号,姓名,性别,专业号,年龄)课程(课程号,课程名,学分)
选修(学号,课程号,成绩)
这3个关系之间也存在着属性的引用,即选修关系引用了学生关系的主码"学号"和课程关系的主码"课程号".显然,选修关系的"学号"属性与学生关系的主码"学号"相对应,"课程号"属性与课程关系的主码"课程号"相对应,因此"学号"和"课程号"属性都是选修关系的外码。这里学生和课程关系均为被参照关系,选修关系为参照关系,如图9.4(b)所示。同样,选修关系中的"学号"值必须是确实存在的学生的学号,学生关系中有该学生的记录,选修关系中"课程号"值也必须是确实存在的课程的课程号,即课程关系中有该课程的记录。
不仅不同的关系之间可以存在引用关系,同一关系内部属性间也可能存在引用关系。[例4]如果在例1中,学生关系增加一个属性"班长",原学生关系改为:
学生l(学号,姓名,性别,专业号,年龄,班长)
其中,"学号"属性是主码,"班长"属性表示该学生所在班级的班长的学号,它引用了本关系"学号"属性,即"班长"必须是确实存在的学生的学号。
在例4中,"班长"属性与本关系的主码"学号"属性相对应,因此"班长"是外码。这里学生1关系是参照关系也是被参照关系。
另外,需要指出的是,外码并不一定要与相应的主码同名。不过,在实际应用中,为了便于识别,当外码与相应的主码属于不同关系时,往往给它们以相同的名字。
例如,对于例2,学生关系中每个元组的"专业号"属性只能取下面两类值:·空值,表示尚未给该学生分配专业。
·非空值,这时该值必须是专业关系中某个元组的"专业号"值,表示该学生不可能分配到一个不存在的专业中。即被参照关系"专业"中一定存在一个元组,它的主码值等于该参照关系"学生"中的外码值。
对于例3,按照参照完整性规则,"学号"和"课程号"属性也可以取两类值,空值或目标关系中已经存在的值。但由于"学号"和"课程号"是选修关系中的主属性,按照实体完整性规则,它们均不能取空值,所以选修关系中的"学号',和"课程号"属性实际上只能取相应被参照关系中已经存在的主码值。
参照完整性规则中,R与S可以是同一个关系,例如对于例4,按照参照完整性规则,"班长"属性值可以取两类值:
·空值,表示该学生所在班级尚未选班长。
·非空值,这时该值必须是本关系中某个元组的"学号"值。
3.用户定义的完整性规则
用户定义的完整性规则是用户根据具体应用的语义要求,利用DBMS提供的定义和检验这类完整性规则的机制,由用户自己来定义的完整性规则。
关系数据库系统根据现实世界中其应用环境的不同,往往还需、要一些另外的约束条件,用户定义的完整性就是针对某一具体应用要求来定义的约束条件。它反映某一具体应用所涉及的数据必须满足的语义要求。例如,某个属性必须取惟一值、某些属性值之间应满足一定的函数关系、某个属性的取值范围在0-200之间等。关系模型应提供定义和检验这类完整性的机制,以便系统用统一的方法处理它们,而不要由应用程序承担这一功能。
所以,用户定义的完整性规则通常是定义对关系中除主码与外码属性之外的其他属性取值的约束,即对其他属性的值域的约束。
对属性的值域的约束也称为域完整性规则(domain integrity rule),是指对关系中属性取值的正确性限制,包括数据类型、精度、取值范围、是否允许空值等。取值范围又可分为静态定义和动态定义两种:静态定义取值范围是指属性的值域范围是固定的,可从定义值的集合中提取特定值;动态定义取值范围是指属性的值域范围依赖于另一个或多个其他属性的值。
为了维护数据库中数据的完整性,在对关系数据库执行插入、删除和修改(更新)操作时,就要检查是否满足上述3类完整性规则。
·当执行插入操作时:首先检查实体完整性规则,插入行在主码属性上的值是否已经存在,若不存在,可以执行插入操作;否则不可以执行插入操作。再检查参照完整性规则,如果是向被参照关系插入,不需要考虑参照完整性规则;如果是向参照关系插入,插入行在外码属性上的值是否已经在相应被参照关系的主码属性值中存在,若存在,可以执行插入操作;否则不可以执行插入操作,或将插入行在外码属性上的值改为空值后再执行插入操作(假定该外码允许取空值)。最后检查用户定义完整性规则,检查要被插入的关系中是否定义了用户定义完整性规则,如果定义了,检查插入行在相应属性上的值是否遵守用户定义完整性规则,若遵守,可以执行插入操作;否则不可以执行插入操作。
·当执行删除操作时:一般只需要检查考虑参照完整性规则。如果是删除被参照关系中的行,检查被删除行在主码属性上的值是否正在被相应的被参照关系的外码引用,若不被引用,可以执行删除操作;若正在被引用,有3种可能的做法:不可以执行删除操作(拒绝删除),或将参照关系中相应行在外码属性上的值改为空值后再执行删除操作(空值删除),或将参照关系中相应行一起删除(级联删除)。
·当执行更新操作时:因为更新操作可看成是先执行删除操作,再执行插入操作,因此是上述两种情况的综合。
章节目录:系统分析师考试教材第9章数据库与数据仓库
返回全书目录:系统分析师章节辅导教程
软考备考资料免费领取
去领取