购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.3完整性约束

数据完整性是指数据库中存储的数据是有意义的或正确的,也就是和现实世界相符。关系模型中的数据完整性规则是对关系的某种约束条件。数据完整性主要包括三大类:实体完整性、参照完整性和用户定义的完整性。

3.3.1 实体完整性

实体完整性是保证关系中的每个元组都是可识别的和唯一的。

实体完整性是指关系数据库中所有的表都必须有主键,而且表中不允许存在以下记录:

1)无主键值的记录。

2)主键值相同的记录。

若某记录没有主键值,则此记录在表中一定是无意义的。因为关系模型中的每一行记录都对应客观存在的一个实例或一个事实。比如,表3-1中的第1行数据描述的是“李勇”这个学生。如果将表3-1中的数据改为表3-7所示的数据,可以看到,第1行和第4行数据中“学号”没有值,即主键没有值,查看其他列的值发现这两行数据的其他各列的值均相同,于是会产生这样的疑问:到底是存在名字、性别完全相同的两个学生,还是重复存储了学生李勇的信息?这就是缺少主键值时造成的情况。如果为其添加主键值为表3-8所示的数据,则可以判定在计算机学院有两个姓名、性别完全相同的学生。如果为其添加主键值为表3-9所示的数据,则可以判定在这个表中有重复存储的记录,而在数据库中存储重复的数据是没有意义的。

表3-7 缺少主键值的学生表

表3-8 主键值均不同的学生表

(续)

表3-9 主键值有重复的学生表

当为表定义了主键时,数据库管理系统会自动保证数据的实体完整性,即保证不允许存在主键值为空的记录以及主键值重复的记录。

关系数据库中主属性不能取空值。在关系数据库中的空值是特殊的标量常数,它代表未定义的或者有意义但目前还处于未知状态的值。比如当向表3-2所示的“借阅”关系中插入一行记录时,在学生还没有还书之前,其还书时间是不确定的,因此,此列的值就为空。空值用“NULL”表示。

3.3.2 参照完整性

参照完整性也称为引用完整性。现实世界中的实体之间往往存在着某种联系,在关系模型中,实体以及实体之间的联系都是用关系来表示的,这样就自然存在着关系与关系之间的引用。参照完整性就是描述实体之间的联系的,这里的实体之间可以是不同的实体,也可以是同一个实体。

例3-1 “学生”实体和“学院”实体可以用下面的关系模式表示,其中主键用下划线标识:

学生( 学号,姓名,性别,所在学院

学院( 学院名,办公地点,办公电话

这两个关系模式之间存在着属性的引用关系:“学生”关系中的“所在学院”引用或者是参照了“学院”关系的主键“学院名”。即“学生”关系中的“所在学院”的值必须是“学院”关系中确实存在的学院名。这种限制一个关系中某列的取值受另一个关系中某列的取值范围约束的特点就称为参照完整性。

例3-2 学生、课程以及学生与课程之间的选课关系可以用以下三个关系模式表示,其中主键用下划线标识:

学生( 学号,姓名,性别,所在学院

课程( 课程号,课程名,学分,开课学期

选课( 学号,课程号,成绩

这三个关系模式间也存在着属性的引用。“选课”关系中的“学号”引用了“学生”关系中的主键“学号”,即,“选课”关系中“学号”的值必须是“学生”关系中存在的学生(即有该学号值)。同样,“选课”关系中的“课程号”引用了“课程”关系中的主键“课程号”,即“选课”关系中的“课程号”也必须是“课程”关系中存在的课程号。

与实体间的联系类似,不仅两个或两个以上的关系间可以存在引用关系,同一个关系的内部属性之间也可以存在引用关系。

例3-3 有关系模式:职工( 职工号,姓名,性别,直接领导职工号

在这个关系模式中,“职工号”是主键,“直接领导职工号”属性表示该职工的直接领导的职工号,这个属性的取值就参照了该关系中“职工号”属性的取值,即“直接领导职工号”必须是确实存在的一个职工。

进一步定义外键:设 F 是关系 R 的一个或一组属性,如果 F 与关系 S 的主键相对应,则称 F 是关系 R 外键 (foreign key),并称关系 R 为参照关系(referencing relation),关系 S 为被参照关系(referenced relation)。关系 R 和关系 S 不一定是不同的关系。

显然,被参照关系 S 的主键 K s 和参照关系 R 的外键 F 必须定义在相同的域上。

在例3-1中,“学生”关系中的“所在学院”属性与“学院”关系中的主键“学院名”对应,因此,“学生”关系中的“所在学院”是外键,引用了“学院”关系中的“学院名”(主键)。这里,“学院”关系是被参照关系,“学生”关系是参照关系。

可以用图3-3所示的图形化的方法形象地表达参照关系和被参照关系。“学生”和“学院”的参照关系与被参照关系的图形化表示如图3-4a所示。

图3-3 关系的参照表示

在例3-2中,“选课”关系中的“学号”属性与“学生”关系中的主键“学号”对应,“课程号”属性与“课程”关系的主键“课程号”对应,因此,“选课”关系中的“学号”属性和“课程号”属性均是外键。这里“学生”关系和“课程”关系均为被参照关系,“选课”关系为参照关系,其参照关系与被参照关系的图形化表示如图3-4b所示。

在例3-3中,“职工”关系中的“直接领导职工号”属性与本身所在关系的主键“职工号”属性对应,因此,“直接领导职工号”是外键。这里,“职工”关系既是参照关系也是被参照关系,其参照关系与被参照关系的图形化表示如图3-4c所示。

图3-4 参照关系与被参照关系的图形化表示

需要说明的是,外键并不要求一定要与引用的主键同名(如例3-1)。但在实际应用中,为了便于识别,当外键与引用的主键属于不同的关系时,通常都给它们取相同的名字。

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

对于外键,一般应符合以下两个要求中的其中一个:

1)外键的值为空。

2)外键的值等于其所参照的关系中的某个元组的主键值。

例如,对于职工与其所在的部门可以用如下两个关系模式表示:

职工( 职工号,职工名,部门号,工资级别

部门( 部门号,部门名

其中,“职工”关系的“部门号”是外键,它参照了“部门”关系的“部门号”。如果某新来职工还没有被分配到具体的部门,则其“部门号”就为空值;如果职工已经被分配到了某个部门,则其“部门号”就有了确定的值(非空值)。

主键要求必须是非空且不重的,但外键无此要求。外键可以有重复值,这点我们从表3-2可以看出。

3.3.3 用户定义的完整性

用户定义的完整性也称为域完整性或语义完整性。任何关系数据库管理系统都应该支持实体完整性和参照完整性,除此之外,不同的数据库应用系统根据其应用环境的不同,往往还需要一些特殊的约束条件,用户定义的完整性就是针对某一具体应用领域定义的数据约束条件。它反映某一具体应用所涉及的数据必须满足应用语义的要求。

用户定义的完整性实际上就是指明关系中属性的取值范围,也就是属性的域,这样可以限制关系中属性的取值类型及取值范围,防止属性的值与应用语义矛盾。例如,学生的考试成绩的取值范围为0~100,或取{优,良,中,及格,不及格}。 alWp9FS45NDb456N1i+kOM5C8SWztpoz7HuuosNGAUWG5DJvS8vrw0BM3vmRimeS

点击中间区域
呼出菜单
上一章
目录
下一章
×