Alex_McAvoy

想要成为渔夫的猎手

关系的完整性约束

【概述】

关系模型的完整性规则是对关系的某种约束条件,关系的值随着时间变化应满足一定的约束,这些约束条件实际上是对现实世界的要求

数据库关系模型 中,简单介绍了关系模型的完整性约束条件:

  • 实体完整性:关系中的主属性不能取空值
  • 参照完整性:关系中不允许引用不存在的实体
  • 用户定义的完整性:用户自定义的针对具体关系数据库的约束条件

其中,实体完整性、参照完整性是关系模型必须满足的完整性约束条件,被称为关系的两个不变性,由关系系统自动实现,用户定义的完整性是应用领域要遵循的约束条件,体现了具体领域中的语义约束

【实体完整性】

实体完整性是指:若属性 $A$ 是基本关系 $R$ 的主属性,则属性 $A$ 不能取空值 $NULL$

其说明如下:

  1. 实体完整性规则是针对基本关系而言的,一个基本表通常对应现实世界的一个实体集
  2. 现实世界中,实体是可区分的,即他们具有某种唯一性的标识
  3. 关系模型中,以主码作为唯一性标识
  4. 主码中的属性即主属性不能取空值,若主属性取空值,就说明存在某个不可标识的实体,即存在不可区分的实体,这与 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}
感谢您对我的支持,让我继续努力分享有用的技术与知识点!