【概述】
关系模型的完整性规则是对关系的某种约束条件,关系的值随着时间变化应满足一定的约束,这些约束条件实际上是对现实世界的要求
在 数据库关系模型 中,简单介绍了关系模型的完整性约束条件:
- 实体完整性:关系中的主属性不能取空值
- 参照完整性:关系中不允许引用不存在的实体
- 用户定义的完整性:用户自定义的针对具体关系数据库的约束条件
其中,实体完整性、参照完整性是关系模型必须满足的完整性约束条件,被称为关系的两个不变性,由关系系统自动实现,用户定义的完整性是应用领域要遵循的约束条件,体现了具体领域中的语义约束
【实体完整性】
实体完整性是指:若属性 $A$ 是基本关系 $R$ 的主属性,则属性 $A$ 不能取空值 $NULL$
其说明如下:
- 实体完整性规则是针对基本关系而言的,一个基本表通常对应现实世界的一个实体集
- 现实世界中,实体是可区分的,即他们具有某种唯一性的标识
- 关系模型中,以主码作为唯一性标识
- 主码中的属性即主属性不能取空值,若主属性取空值,就说明存在某个不可标识的实体,即存在不可区分的实体,这与 2. 矛盾
例如:在选修关系 选修(学号, 课程号, 成绩)
中,若 学号
、课程号
为主码,则这两个属性都不能取空值
【参照完整性】
关系间的引用
现实世界中,实体间存在某种联系,在关系模型中,实体及实体间的联系是用关系描述的,这样自然就存在关系与关系间的引用
例如,学生实体和专业实体可以用下面的关系来表示
学生(学号, 姓名, 性别, 专业号, 年龄)
,其中学号
为主码专业(专业号, 专业名)
,其中专业号
为主码
学生关系引用了专业关系的主码 专业号
,这就要求学生关系中 专业号
的值必须是确实存在的专业的专业号,也就是说,学生关系中的某个属性的取值需要参照专业关系的属性取值
此外,同一关系内部属性间也可存在引用关系
如下图,学号
是主码,班长是 外码
,其引用了本关系的 学号
外码
设 $F$ 是基本关系 $R$ 的一个或一组属性,但不是关系 $R$ 的码,如果 $F$ 与基本关系 $S$ 的主码 $K_s$ 相对应,则称 $F$ 是基本关系 $R$ 的外码,其中基本关系 $R$ 参照关系,基本关系 $S$ 称为被参照关系或目标关系
以主码为 学号
的学生关系 学生(学号, 姓名, 性别, 专业号, 年龄)
和主码为 专业
的专业关系 专业(专业号, 专业名)
为例
学生关系是参照关系,专业关系是被参照关系,专业关系的 专业号
属性是学生关系的外码
需要注意的是,目标关系 $S$ 与主码 $K_s$ 和参照关系的外码 $F$ 必须定义在同一个域上,此外,外码并不一定要与相应的主码同名,当外码与相应的主码属于不同关系时,往往取相同的名字,以便于识别
参照完整性规则
若属性或属性组 $F$ 是基本关系 $R$ 的外码,其与基本关系 $S$ 的主码 $K_s$ 相对应($S$ 与 $R$ 不一定是不同的关系),则对于 $R$ 中每个元组在 $F$ 上的值必须满足:
或为空值
或等于 $S$ 中某个元组的主码值
以主码为 学号
的学生关系 学生(学号, 姓名, 性别, 专业号, 年龄)
为例,每个元组的 专业号
属性只取两类值:
- 空值:表示尚未给该学生分配专业
- 非空值:此时该值必须是专业关系中某个元组的
专业号
值,表示该学生不可能分配一个不存在的专业
【用户定义的完整性】
用户定义的完整性是针对某一具体关系数据库的约束条件,反映了某一具体应用所涉及的数据必须满足的语义要求
关系模型应提供定义和检验这类完整性的机制,以便用统一的系统的方法处理它们,而不要由应用程序承担这一功能
例如,对于课程关系 课程(课程号, 课程名, 学分)
,根据实体完整性,主属性 课程号
必须取唯一值,定义如下完整性规则:
课程名
不能取空值学分
只能取值{1, 2, 3, 4}