关系模型的完整性规则是对关系的某种约束条件。
关系模型允许定义三类完整性约束:实体完整性、参照完整性和用户自定义的完整性。
其中实体完整性和参照完整性是关系模型必须满足的完整性约束条件,称为两个不变性,应该由关系系统自动支持;用户自定义的完整性是应用领域需要遵循的约束条件,体现了具体领域中的语义约束。
1.实体完整性(Entity Integrity)
实体完整性规则:若属性A是基本关系R的主属性,则属性A不能取空值。
例如,学生关系“学生(学号,姓名,性别,专业号,年龄)”中,“学号”为主码,则“学号”不能取空值。
实体完整性规则规定基本关系的主码不能取空值,若主码由多个属性组成,则所有这些属性都不可以取空值。
例如,学生选课关系“选修(学号,课程号,成绩)”中,“学号、课程号”为主码,则“学号”和“课程号”两个属性都不能取空值。
对于实体完整性规则说明如下:
1)实体完整性规则是针对基本关系而言的。一个基本表通常对应信息世界的一个实体集,例如,学生关系对应于学生的集合。
2)信息世界中的实体是可区分的,即它们具有某种唯一性标识。
3)关系模型中以主码作为唯一性标识。
4)主码中的属性即主属性不能取空值。所谓空值,就是“不知道”或“不确定”的值,如果主属性取空值,就说明存在某个不可标识的实体,即存在不可区分的实体,这与第2)点相矛盾,因此,这个规则称为实体完整性规则。
2.参照完整性(Referential Integrity)
在实际中,实体之间往往存在某种联系,在关系模型中实体及实体间的联系都是用关系来描述的,这样就自然存在关系与关系间的引用。先来看下面三个例子。
【例3-1】 学生关系和专业关系表示如下(其中主码用下画线标识):
学生( 学号 ,姓名,性别,专业号,年龄)
专业( 专业号 ,专业名)
这两个关系之间存在着属性的引用,即学生关系引用了专业关系的主码“专业号”。
显然,学生关系中的“专业号”值必须是确实存在的专业的专业号,即专业关系中有该专业的记录,也就是说,学生关系中的某个属性的取值需要参照专业关系的属性来取值。
【例3-2】 学生、课程、学生与课程之间的多对多联系选修可以用如下3个关系表示:
学生( 学号 ,姓名,性别,专业号,年龄)
课程( 课程号 ,课程名,学分)
选修( 学号 , 课程号 ,成绩)
这三个关系之间也存在属性的引用,即选修关系引用了学生关系的主码“学号”和课程关系的主码“课程号”。同样,选修关系中的“学号”值必须是确实存在的学生的学号,即学生关系中有该学生的记录;选修关系中的“课程号”值也必须是确实存在的课程的课程号,即课程关系中有该课程的记录。也就是说,选修关系中某些属性的取值需要参照其他关系的属性来取值。不仅两个或两个以上的关系间可以存在引用关系,同一关系内部属性间也可能存在引用关系。
【例3-3】 在关系“学生(学号,姓名,性别,专业号,年龄,班长)”中,“学号”属性是主码,“班长”属性表示该学生所在班级的班长的学号,它引用了本关系“学号”属性,即“班长”必须是确实存在的学生的学号。
设F是基本关系R的一个或一组属性,但不是关系R的主码。如果F与基本关系S的主码Ks相对应,则称F是基本关系R的外码(Foreign Key),并称基本关系R为参照关系(Referencing Relation),基本关系S为被参照关系(Referenced Relation)或目标关系(Tar-get Relation)。关系R和关系S有可能是同一关系。
注: 主码(主键)与外码(外键)的列名不一定相同,唯一的要求是它们的值的域必须相同。
显然,被参照关系S的主码Ks和参照关系R的外码F必须定义在同一个(或一组)域上。
在例3-1中,学生关系的“专业号”属性与专业关系的主码“专业号”相对应,因此,“专业号”属性是学生关系的外码。这里专业关系是被参照关系,学生关系为参照关系。
在例3-2中,选修关系的“学号”属性与学生关系的主码“学号”相对应,“课程号”属性与课程关系的主码“课程号”相对应,因此,“学号”和“课程号”属性是选修关系的外码。这里学生关系和课程关系均为被参照关系,选修关系为参照关系。
在例3-3中,“班长”属性与本身的主码“学号”属性相对应,因此,“班长”是外码。学生关系既是参照关系也是被参照关系。需要指出的是,外码并不一定要与相应的主码同名。但在实际应用中,为了便于识别,当外码与相应的主码属于不同关系时,则给它们取相同的名字。参照完整性规则就是定义外码与主码之间的引用规则。
参照完整性规则:若属性(或属性组)F是基本关系R的外码,它与基本关系S的主码Ks相对应(基本关系R和S有可能是同一关系),则对于R中每个元组在F上的值必须为以下值之一。
1)取空值(F的每个属性值均为空值)。
2)等于S中某个元组的主码值。
在例3-1中学生关系中每个元组的“专业号”属性只能取下面两类值:
1)空值,表示尚未给该学生分配专业。
2)非空值,这时该值必须是专业关系中某个元组的“专业号”值,表示该学生不可能分配到一个不存在的专业中,即被参照关系“专业”中一定存在一个元组,它的主码值等于该参照关系“学生”中的外码值。
在例3-2中按照参照完整性规则,“学号”和“课程号”属性也可以取两类值:空值或被参照关系中已经存在的值。但由于“学号”和“课程号”是选修关系中的主属性,按照实体完整性规则,它们均不能取空值,所以,选修关系中的“学号”和“课程号”属性实际上只能取相应被参照关系中已经存在的主码值。
在参照完整性规则中,关系R与关系S可以是同一个关系。在例3-3中,按照参照完整性规则,“班长”属性可以取如下两类值:
1)空值,表示该学生所在班级尚未选出班长。
2)非空值,该值必须是本关系中某个元组的学号值。
3.用户定义的完整性(User-defined Integrity)
任何关系数据库系统都应该支持实体完整性和参照完整性。除此之外,不同的关系数据库系统根据其应用环境的不同,还需要支持一些特殊的约束条件,用户定义的完整性就是针对某一具体关系数据库的约束条件的,它反映某一具体应用所涉及的数据必须满足的语义要求。例如,某个属性必须取唯一值、属性值之间应满足一定的关系、某属性的取值范围在一定区间内等。关系模型应提供定义和检验这类完整性的机制,以便用统一的系统方法处理它们,而不要由应用程序承担这一功能。