暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

第二章 关系数据库(3)——关系的完整性

凯哥的故事 2020-04-16
3030


关系的完整性



关系模型的完整性规则是对关系的某种约束条件。也就是说关系的值随着时间变化时应该满足一些约束条件。这些约束条件实际上是现实世界的要求。任何关系在任何时刻都要满足这些语义约束。

关系模型中有三类完整性约束:实体完整性(entity integrity)、参照完整性(referential integrity)和用户定义的完整性(user-defined integrity)。其中实体完整性和参照完整性是关系模型必须满足的完整性约束条件,被称作是关系的两个不变性,应该由关系系统自动支持。用户定义的完整性是应用领域需要遵循的约束条件,体现了具体领域中的语义约束。

实体完整性

关系数据库中每个元组应该是可区分的,是唯一的。这样的约束条件用实体完整性来保证。

实体完整性规则 若属性(指一个或一组属性)A是基本关系R的主属性,则A不能取空值(null value)。所谓空值就是“不知道”或“不存在”或“无意义”的值。有关空值的处理将在第三章“空值的处理”中详细讲解。

例如,学生(学号,姓名,性别,专业号,年龄)关系中学号为主码,则学号不能取空值。

按照实体完整性规则的规定,如果主码由若干属性组成,则所有这些主属性都不能取空值。

例如选修(学号,课程号,成绩)关系中,“学号、课程号”为主码,则“学号”和“课程号”两个属性都不能取空值。

对于实体完整性规则说明如下:

  1. 实体完整性规则是针对基本关系而言的。一个基本表通常对应现实世界的一个实体集。例如学生关系对应于学生的集合。

  2. 现实世界中的实体是可区分的,即它们具有某种唯一性标识。例如每个学生都是独立的个体,是不一样的。

  3. 相应地,关系模型中以主码作为唯一性标识。

  4. 主码中的属性即主属性不能取空值。如果主属性取空值,就说明存在某个不可标识的实体,即存在不可区分的实体,这与第2点相矛盾,因此这个规则称为实体完整性。

参照完整性

现实世界中的实体之间往往存在某种联系,在关系模型中实体及实体间的联系都是用关系来描述的,这样就自然存在着关系与关系间的引用。先来看三个例子。

例1】学生实体和专业实体可以用下面的关系来表示,其中主码用下划线标识。
学生(学号,姓名,性别,专业号,年龄)
专业(专业号、专业名)

这两个关系之间存在着属性的引用,即学生关系引用了专业关系的主码“专业号”。显然,学生关系中的“专业号”值必须是确实存在的专业的专业号,即专业关系中有该专业的记录。也就是说,学生关系中的某个属性的取值需要参照专业关系的属性取值。

例2】学生、课程、学生与课程之间的多对多联系可以如下三个关系表示:
学生(学号,姓名,性别,专业号,年龄)
课程(课程号,课程名,学分)
选修(学号,课程号,成绩)

这三个关系之间也存在着属性的引用,即选修关系引用了学生关系的主码“学号”和课程关系的主码“课程号”。同样,选修关系中的“学号”值必须是确实存在的学生的学号,即学生关系中有该学生的记录;选修关系中的“课程号”值也必须是确实存在的课程的课程号,即课程关系中有该课程的记录。换句话说,选修关系中某些属性的取值需要参照其他关系的属性取值。

不仅两个或两个以上的关系间可以存在引用关系,同一关系内部属性间也可能存在引用关系。

例3】在学生(学号,姓名,性别,专业号,年龄,班长)关系中,“学号”属性是主码,“班长”属性表示该学生所在班级的班长的学号,它引用了本关系“学号”属性,即“班长”必须是确实存在的学生的学号。

这三个例子说明关系与关系之间存在着相互引用、相互约束的情况。下面先引入外码的概念,然后给出表达关系之间相互引用约束的参照完整性的定义。

设F是基本关系R的一个或一组属性,但不是关系R的码,Ks是基本关系S的主码。如果F与Ks相对应,则称F是R的外码(foreign key),并称基本关系R为参照关系(referencing relation),基本关系S为被参照关系(referenced relation)或目标关系(target relation)。关系R和S不一定是不同的关系。

显然,目标关系S的主码Ks和参照关系R的外码F必须定义在同一个(或同一组)域上。

在例1中,学生关系的“专业号”属性与专业关系的主码“专业号”相对应,因此“专业号”属性是学生关系的外码。这里专业关系是被参照关系,学生关系为参照关系。如下图(a)所示。

在例2中,选修关系的“学号”属性与学生关系的主码“学号”相对应;选修关系的“课程号”属性与课程关系的主码“课程号”相对应,因此“学号”和“课程号”属性是选修关系的外码。这里学生关系和课程关系均为被参照关系,选修关系为参照关系。如下图(b)所示。

在例3中,“班长”属性与本身的主码“学号”属性相对应,因此“班长”是外码。这里,学生关系既是参照关系也是被参照关系。如图(c)所示。

需要指出的是,外码并不一定要与相应的主码同名,如例3中学生关系的主码为学号,外码为班长。不过,在实际应用中为了便于识别,当外码与相应的主码属于不同关系时,往往给它们取相同的名字。

参照完整性规则就是定义外码与主码之间的引用规则

参照完整性规则 若属性(或属性组)F是基本关系R的外码,它与基本关系S的主码Ks相对应(基本关系R和S不一定是不同的关系),则对于R中每个元组在F上的值必须:

  • 或者取空值(F的每个属性值均为空值);

  • 或者等于S中某个元组的主码值。

例如,对于例1,学生关系中每个元组的“专业号”属性只能取下面两类值:

1.空值,表示尚未给该学生分配专业;

2.非空值,这时该值必须是专业关系中某个元组的“专业号”值,表示该学生不可能分配到一个不存在的专业中。即被参照关系“专业”中一定存在一个元组,它的主码值等于该参照关系“学生”中的外码值。

对于例2,按照参照完整性规则,“学号”和“课程号”属性也可以取两类值:空值或目标关系中已经存在的值。但由于“学号”和“课程号”是选修关系中的主属性,按照实体完整性规则,它们均不能取空值,所以选修关系中的“学号”和“课程号”属性实际上只能取相应被参照关系中已经存在的主码值。

参照完整性规则中,R与S可以是同一个关系。例如对于例3,按照参照完整性规则,“班长”属性值可以取两类值:

1.空值,表示该学生所在班级尚未选出班长;

2.非空值,这时该值必须是本关系中某个元组的学号值。

用户定义的完整性

任何关系数据库系统都应该支持实体完整性和参照完整性。这是关系模型所要求的。除此之外,不同的关系数据库系统根据其应用环境的不同,往往还需要一些特殊的约束条件。用户定义的完整性就是针对某一具体关系数据库的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求。例如某个属性必须取唯一值、某个非主属性不能取空值等。例如,在例1的学生关系中,若按照应用的要求学生不能没有姓名,则可以定义学生姓名不能取空值:某个属性(如学生的成绩)的取值范围可以定义在0~100之间等。

关系模型应提供定义和检验这类完整性的机制,以便用统一的系统的方法处理它们,而不需由应用程序承担这一功能。

在早期的关系数据库管理系统中没有提供定义和检验这些完整性的机制,因此需要应用开发人员在应用系统的程序中进行检查。例如在例2的选修关系中,每插入一条记录,必须在应用程序中写一段程序来检查其中的学号是否等于学生关系中的某个学号,并检查其中的课程号是否等于课程关系中的某个课程号。如果等于,则插入这一条选修记录,否则就拒绝插入,并给出错误信息。


文章转载自凯哥的故事,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论