为了维护数据库中数据与现实世界中相应数据的一致性,防止录入错误数据,关系模型提供了三类完整性约束规则。关系模型的完整性规则是对关系的某种约束条件。关系模型完整性规则的制定,有助于保证关系中数据的正确性、有效性和相容性。
数据的正确性指的是关系中的数据与事实相符。例如,“学生”关系中存在一个元组,姓名为“李楠”,性别为“男”。若事实上李楠是女生,则该数据是不正确的。
数据的有效性指的是关系中的数据在其值域内,是可理解的。例如,“学生”关系中“性别”属性的取值范围为{'男','女'},若存在一个元组的性别属性值是“*”,则该数据是无效的,根据这一数据无法理解该学生的性别。
数据的相容性指的是若对应同一个事实的数据在多个关系中出现,则这些数据应该是一致的。例如,在前述的教务管理系统中,有以下三个关系:
学生( 学号 ,身份证号,姓名,性别,班级,生日)
课程( 课程号 ,课程名,学时,学分)
选修( 学号 , 课程号 ,成绩)
如果数据操作人员在“选修”关系中录入学生选修记录时操作不当,误将学号为“202110225221”的学生学号录入为“202010225221”,这将会引起数据的不相容,从而导致“选修”关系的这一个元组无法与“学生”关系中学号为“202110225221”的元组产生关联。
在关系数据库运行时,不符合关系模型完整性规则的数据会被DBMS拒之门外,只有通过约束条件检验的数据才可以被录入。
一个关系通常对应现实世界的一个实体集。例如,“学生”关系对应于学生的集合。现实世界中的实体都是可区分的,都具有某种唯一性标识。因此,关系中主键作为唯一性标识,其包含的所有属性不能取空值,否则就意味着主键丧失了唯一性标识的作用,导致某个实体不可识别,这与现实世界的情况矛盾。
实体完整性(Entity Integrity)规定:若属性 A 是关系 R 主键中的属性,则属性 A 不能取空值(NULL)。注意,关系中的主键可由一个或多个属性组成。例如,“学生”关系的主键是学号,而“选修”关系的主键是学号与课程号的集合。根据实体完整性规则,“选修”关系中无论是学号还是课程号,都不允许出现空值。
实体完整性规则有助于防止数据库中出现非法的不符合语义的数据。
在现实世界中实体之间往往存在某种联系,在关系模型中实体及实体之间的联系都是用关系来描述的,因此存在关系之间的引用。这种引用通过外键来实现。在前述的选课管理数据库中有以下三个关系:
学生( 学号 ,身份证号,姓名,性别,班级,生日)
课程( 课程号 ,课程名,学时,学分)
选修( 学号 , 课程号 ,成绩)
其中,“选修”关系中课程号是“课程”关系的主键,因此,课程号是“选修”关系的外键。“选修”关系引用了“课程”关系,“选修”关系的课程号属性需要参照“课程”的主键。若在“选修”关系中出现元组('202101231234','0211',85),这意味着学号为“202101231234”的学生选修了课程号为“0211”的课程。那么,课程号为“0211”的课程必须在“课程”关系中出现,否则,这名学生就选修了一门不存在的课程。反之,在“课程”关系中出现的课程,并不一定会出现在“选修”关系中,因为事实上存在开设了课程但没有学生选修的情况。
若关系 A 中的某属性或属性集是关系 B 的主键,则称 A 为 参照关系 (Referencing Relation),称 B 为 被参照关系 (Referenced Relation)。因此,在前述的例子中,“选修”关系是参照关系,“课程”关系是被参照关系。
思考 :在前述的选课管理数据库中,对于“学生”关系和“选修”关系,其参照完整性规则应该怎么约定?哪一个关系是参照关系?哪一个关系是被参照关系?
参照完整性(Referential Integrity)规则规定:参照关系 A 中外键的取值要么为空,要么为被参照关系 B 中某元组的主键值。简单地说,如果关系 A 中外键的取值不为空时,根据该取值去关系 B 中寻找,必须能找到一条相符的元组。
参照完整性规则要求关系之间不能引用不存在的实体,防止数据库在实现实体之间的联系时存在错误引用。在数据库运行时,若相关实体的数据发生更新,DBMS依照已定义的参照关系检测数据更新操作的合法性,从而保证数据的一致性。
实体完整性和参照完整性是关系模型必须满足的基本规则,在设计关系模式时定义并由DBMS自动支持,适用于任何关系数据库系统。除此之外,用户还可根据应用环境的需要,自定义一些数据的约束条件。
用户自定义完整性(User-defined Integrity)就是用户针对某一具体应用环境而添加的约束规则。例如,如果考试采用百分制,用户可以自定义一条规则,规定每门课的成绩必须在0~100,否则不允许录入;针对“学生”关系中的性别属性,用户可以自定义一条规则,规定性别的取值必须是“男”或者“女”。用户自定义的完整性一旦定义,就由系统承担检验与纠错工作。如此一来,用户不必在应用程序中添加额外的代码以检查数据完整性,既大大地减轻了工作量,又可确保数据的正确录入。
实体完整性和参照完整性是关系模型必须满足的完整性约束条件,被称为两个 关系的不变性 ,一般情况下由DBMS自动支持。用户自定义完整性则需要由数据库开发者根据实际情况添加。