
1.2.3 关系的完整性
关系模型的完整性规则是用来约束关系的,以保证数据库中数据的正确性和一致性。关系模型的完整性共有3类:实体完整性、参照完整性和用户定义的完整性。实体完整性和参照完整性是关系模型必须满足的完整性约束条件,由关系数据库管理系统自动支持。
1.实体完整性
一个关系通常对应现实世界的一个实体集,如学生关系对应于学生的集合。现实世界中的实体是可区分的,即它们具有某种唯一性标志。相应地,关系模型中以主码作为唯一性标志。主码中的属性即主属性不能取空值。所谓空值就是“不知道”或“无意义”的值。如果主属性取空值,就说明存在某个不可标识的实体,即存在不可区分的实体,这与现实世界的应用环境相矛盾,因此这个实体一定不是一个完整的实体。
实体完整性的规则为:若属性A是关系R的主属性,则属性A不能取空值。
2.参照完整性
现实世界中的实体之间往往存在一定的联系,在关系模型中实体与实体的联系是用关系来描述的。参照完整性就是指关系之间能否正确进行联系的规则。两个表能否正确进行联系,外码是关键。
【例1-7】两个实体学生和院系由以下两个关系表示,主码用下画线标识。
学生(学号,姓名,院系号)
院系(院系号,院系名)
“院系号”是学生表的一个属性,但不是学生表的主码,“院系号”与院系表的主码相对应,则“院系号”是学生表的外码。学生表中某个属性的取值要参照院系表属性的取值。我们可以清楚地看到外码“院系号”是联系学生表和院系表的桥梁,两个关系进行联系就是通过外码实现的。
参照完整性规则为:若属性(或属性组)F是基本关系R的外码,它与关系S的主码Ks相对应(关系R和S不一定是不同的关系),则对于R中每一个元组在F上的值必须为取空值(F的每个属性值均为空值),或者等于S某个元组的主码值。
在例1-7中,关系“学生R(学号、姓名、院系号F)”和关系“院系S(院系号Ks、院系名)”中,学生关系的“院系号F”可以为空值,表示尚未给该学生分配院系;或者非空值,但必须是院系关系中某个元组的“院系号Ks”属性的值,表示不能把学生分到一个根本不存在的院系,即被参照关系“院系”中一定存在一个元组,它的主码值等于参照关系“学生”中的外码值。
3.用户定义的完整性
用户定义的完整性针对某一具体数据库的约束条件,由应用环境决定,它反映了某一具体应用所涉及的数据必须满足的语义要求。例如,成绩的取值,用户一般会定义为0~100。关系模型应提供定义和检验这类完整性机制,以便用统一的方法处理它们,而不需要由应用程序承担这一功能。
在实际系统中,这类完整性规则一般在建立库表的同时进行定义,应用编程人员不需再做考虑。如果某些约束条件没有建立在库表一级,则应用编程人员应在各模块的具体编程中通过程序进行检验和控制。