数据库原理及应用:SQL Server 2016
上QQ阅读APP看书,第一时间看更新

2.2 关系模型的完整性

关系模型的完整性规则是指对关系的某种约束条件,即关系的值随时间的变化时应该满足的一些条件,也可以理解为关系操作在不断地更新数据时应该遵守的规则。这些约束条件是现实世界的要求,用于保证数据库中数据的正确性,如果不遵循或没有约束条件,数据库中会存在大量无意义、无价值的垃圾数据。

在关系模型中存在3类完整性约束,即实体完整性、参照完整性和用户定义的完整性,其中前两个约束条件称为关系的两个不变性,是关系模型必须满足的完整性约束条件,应该由关系系统自动支持。用户定义的完整性是应用领域需要遵循的规则,与具体的应用领域和场景密切相关。

2.2.1 实体完整性

实体完整性(Entity Integrity)规则。如果属性A(单一属性或属性组)是基本关系R的主属性,则属性A不能取空值。

其中空值表示不存在或不知道的值。由于主键是元组的唯一标识,如果主属性为空则会导致元组的不可区分,这与实体的定义矛盾。例如,学生信息表的学号不能为空,如果为空则表明学生不存在,后续的学生选课和学生选课成绩就无从谈起。

实体完整性保证操作的数据非空、唯一且不重复的要求,即实体完整性要求每个关系(二维表)有且仅有一个主键,每一个主键的值必须唯一,不能有空值或重复。

2.2.2 参照完整性

一般来说,现实世界中的实体之间是存在一定联系的,在关系模型中实体及实体间的联系是用关系来描述的,因此,操作时就有可能存在关系之间的关联和引用(如多表间的数据调用)。

在关系数据库中,关系之间的联系是通过公共属性实现的。此公共属性通常是将一个表中的主键作为另一个表中的外键,例如,学生选课中的学号就是外键,而它在学生信息表为主键。

参照完整性(Referencial Integrity)体现在两方面:实现了表与表之间的联系;外键的取值必须是另一个表的主键的有效值,或是空值。

参照完整性形式化的定义:如果F是基本关系R的一个或一组属性,但不是R的码,K是基本关系S的主码。若F与K相对应,则称F是关系R的外键(Foreign Key)。并称基本关系R为参照关系(Referencing Relation),基本关系S为被参照关系(Referenced Relation)或目标关系(Target Relation)。

注意:

1)参照关系R和被参照关系不一定是不同关系,见【案例2-8】。

2)外键名不一定要和被参照关系中相对应的主键同名,如【案例2-9】中的外键主管与主键职员编号就不同名。

3)外键值是否允许为空,应视具体问题而定。【案例2-8】中学生选课关系中学号和课程代码不允许为空,如果为空则没有实际意义,数据为无用数据。

参照完整性规则:如果属性(或属性组)F是关系模式R的外键,它与基本关系S的主键K要对应,则关系R中每个元组在F上的值必须满足下列要求。

① 或者取空值。

② 或者为关系S主键集合中的元素。

【案例2-8】学生实体和专业实体之间的关系。学生(学号,身份证号,姓名,性别,专业编号,出生日期,家庭地址),其中学号为主键(PK)。专业(专业编号,专业名称)。

学生和专业这两个关系存在着属性的引用,即学生关系引用了专业关系的主码“专业编号”,此处学生关系中的专业编号的取值要参照专业关系中的专业编号,也就是对学生关系中专业编号的取值要么为空值(表明学生还没分配专业),要么是专业关系中属性专业编号集合中的某一个具体的值,而不能随意设值。例如,在插入数据时,关系数据库中DBMS负责验证外键是否合法,以决定是否插入该记录。

【案例2-9】职员信息表。职员(职员编号,姓名,性别,民族,出生年月,所在部门,籍贯,政治面貌,家庭地址,联系电话,主管)。职员关系中,“职员编号”为主键,“主管”属性表示该员工主管的编号,它引用了本关系中的“职员编号”,因为主管也是职员中的一员,只是职位不同。所以职员关系中主管必须是职员编号集合的元素,或者为空值(表示该职员尚未分配主管)。

2.2.3 用户定义的完整性

关系数据库系统除了必须满足实体完整性和参照完整性外,还需要遵循特定应用领域的约束条件,保证数据在规定的范围内取值。用户定义的完整性(User-defined Integrity)是指针对某一具体关系数据库的约束条件,它反映了某一具体应用所涉及的数据必须满足的语义要求。例如,关系的某个属性不能为空(如学生关系中,学生姓名通常不允许为空)、某个属性(非主属)必须取唯一值,以及某个属性的取值限定在一定范围内(学生成绩在百分制中取值范围为0~100)。

具体来说,用户定义的完整性可以理解为是对数据表中字段属性的约束,包括属性的值域、类型、宽度和有效规则等约束,是由确定关系结构时所定义字段的属性决定的。

对于不同的关系数据库系统,当具体的应用场景不同时,通常对各个字段值要求有特殊的约束条件。例如,在客户申请银行卡时,银行会对用户身份证进行合法验证,要求身份证字段长度为18位,并且第7~14为出生日期。

关系模型应提供定义和检验用户定义完整性的机制,由DBMS统一系统地处理,而不应由应用程序承担这一功能。值得指出的是,早期的DBMS并没有提供定义和检验此类完整性的机制,而需要应用开发人员在应用系统的程序中进行验证。

讨论思考:

1)关系模型中有哪3类完整性约束?

2)关系模型中为什么必须满足实体完整性和参照完整性?

3)试举例说明用户定义的完整性。