现在的位置: 首页 > 综合 > 正文

数据库设计理论及应用(1)——完整性约束

2013年10月06日 ⁄ 综合 ⁄ 共 3374字 ⁄ 字号 评论关闭

数据库设计理论及应用(1)——完整性约束

作者:最后一只恐龙 发表时间:2007-6-17

 

该系列计划包括5部分:完整性约束理论及应用、范式理论及应用、需求分析、概念结构设计、逻辑结构设计。本文是第一部分,介绍数据库理论的几个概念,以及数据库完整性约束的相关概念和应用。

1.数据库的几个概念

(1) 实体(Entity):指客观存在并可相互区别的事物,一个实体在数据库中表现为表中的一条记录。

(2) 属性(Attribute):指实体所具有的某一特性,实体的属性在数据库中表现为表的字段。

(3) (Key):唯一标识实体的属性集。我们认为实体都是可区别的,即通过码来区分,码包含一个或多个属性。

(4) (Domain):指属性的取值范围,如姓名域可以是长度小于20的字符串,性别域为{男,女}

(5) 实体型(Entity Type):用实体名及其属性名集来抽象和刻画同类实体,称为实体型。如:学生(学号,姓名,性别,入学时间),下划线表示该属性为码。

(6) 实体集(Entity Set):同型实体的集合,因为一条记录对应一个实体,那么实体集就是记录的集合,也就是表。

(7) 联系(Relationship):实体内部或实体之间的联系。(这个概念实在不好定义,只好用“联系就是联系”这样的废话来说明了)。

2.关系数据库的定义

定义1 关系(Relation)D1×D2××Dn的子集叫做在域D1, D2, …, Dn上的关系,表示为R(D1, D2, , Dn)。其中D1×D2××Dn是笛卡尔积。

用白话说,实体集在关系数据库中就称为关系,注意关系与联系两个概念的区别。实体在关系数据库中成为元组

关于关系的几点说明:

(1) 若关系中某一属性组的值能唯一的标识一个元组,则称该属性组为候选码。如学生关系中,学号和身份证号都可以作为候选码。而选课(学号,课程号,成绩)这个关系中,学号和课程号合起来作为候选码。

(2) 若一个关系有多个候选码,则选定其中一个为主码(Primary Key)

(3) 候选码的所有属性均称为主属性,也有的教材中将主码的所有属性称为主属性。从理论上讲,前者是正确的;但从实用情况将,我们更关心主码的属性,因此我倾向于后一个定义。

3.实体完整性约束

3.1 实体完整性理论

定义2 实体完整性:若属性A是基本关系R的主属性,则属性A不能取空值。

1:学生 (学号, 姓名, 年龄)中,学号不能取空值;

2:选修 (学号, 课程号, 成绩)中,学号和课程号都不能取空值。

关于实体完整性的说明:

现实世界中的实体是可区分的,即它们具有某种唯一性标识;相应的,关系模型中以主码作为唯一性标识。如果主属性取空值,则说明存在某个不可标识的实体,即存在不可区分的实体,这与b相矛盾,因此这个规则称为实体完整性。

3.2 违约处理

所谓违约处理,是指更新数据库时,写入的数据违反了数据库完整性,DBMS采取的措施。

如果写入数据库时,违反了实体完整性,DBMS将拒绝执行,写入失败。这里的违反是指主码中的任何一个属性为空值。

3.3 SQL Server中的实体完整性

SQL Server中的主属性对应的是主键,某个字段上定义了主键后,就用这个主键来标识一条记录,该字段不能取空值。

4.参照完整性

4.1 参照完整性理论

先来看个例子。

3:学生(学号,姓名,性别,专业号,年龄),专业(专业号,专业名)

在这个例子中,我们看一下学生实体中的专业号取值的限制。如果一个学生还没有分配专业,取值为空值。如果分配了专业,那么必须是专业实体中的某个专业,也就是其取值必须是专业表中存在的某个专业号,这就是参照完整性。因为“学生.专业号”必须参照“专业.专业号”取值。

定义3F是基本关系R的一个或一组属性,但不是关系R的码。如果F与基本关系S的主码Ks相对应,则称FR的外码,并称R为参照关系,S为被参照关系或目标关系。

根据定义,在例3中,“学生.专业号”不是主码,“专业.专业号”是主码,而前者又参照后者取值,这样才构成参照完整性。前者是外码,后者是主码。学生是参照关系,专业是被参照关系。

取值规则:若属性或属性组F是基本关系R的外码,它与基本关系S的主码Ks相对应,则对于R中的每个元组在F上的取值必须为:

          或者取空值(F的每个属性均为空值)

          或者等于S中某个元组的主码值。

4:学生(学号,姓名,性别,专业号,年龄),课程(课程号,课程名),选修(学号课程号,成绩)

“选修.学号”是一个外码,根据参照完整性,其取值必须是空值或学生关系中的学号值。但学号在选修关系中同时又是主属性,因此还要满足实体完整性,它不能取空值,这样“选修.学号”的取值只能取“学生.学号”的值。“选修.课程号”的取值类似,只能取“课程.课程号”的值。

看到这里你可能有疑问,就是根据定义3,外码(选修中的学号和课程号)在参照关系中不能是主码,那为什么这里学号和课程号却是外码?我们回去看一下主码的定义。主码是我们选定的某个候选码,而候选码是一个或一组属性。因此,此例中学号和课程号组合在一起才构成选修关系的主码,但单独的学号或课程号都不是主码,因此他们单独一个可以作为外码。

5:学生(学号,姓名,性别,专业号,年龄,班长学号)

这里班长学号可以为空值,表示该班还没有选出班长;也可以是学生实体中的某个学号的值。从这个例子看,外码也可以参照自身实体的属性,且外码和主码可以不同名。

6 学校(编号, 校名),如(1, 济南一中)

班级(学校号, 班级号, 班级名),如(1, 102, 高一二班)

学生(学校号, 班级号, 学生序号, 姓名),如(1, 102, 1, 张明)

这个例子比较特别。首先学生中的学校号可以参照学校的编号;另外学生中的学校号和班级号可以合起来参照班级中的学校号和班级号。因为班级中的学校号已经作为外键参照了学校的编号,因此我们没有必要再让学生.学校号参照学校.编号了。这样学生的学校号和班级号合起来作为一个外码,而例4中,选修的学号和课程号则是两个外码。

4.2 违约处理

参照完整性的违约处理不像实体完整性那么简单,具体规则如下。

1)参照表中增加元组,在被参照表中找不到对应的值:拒绝执行。

如例3中,在学生表中增加一个元组(元组就是记录),其专业号值在专业表中不存在,且不是空值,则拒绝插入。

2)修改参照表中元组,修改后被参照表中没有对应的值:拒绝执行。

3中,将学生表的某个专业号修改为专业表中不存在的某个非空值,则拒绝修改。

3)被参照表中删除一个元组,参照表中的值没有了对应的值:拒绝执行、或级联删除、或置为空值。

3中,删除了专业表中的某个专业,使得学生表中某些记录的专业号在专业表中不存在了,可以有3种处理方式:(1)拒绝删除;(2)将学生表中相应的数据一起删除,即级联删除;(3)将学生表的相应专业号值修改为空值,即置空操作。不管采用这三种操作的哪一种,都可以保证数据库的参照完整性。当然最后只能采用一种,具体采取哪种操作,根据数据库中的设置决定,参考4.3部分。

4)被参照表中修改一个元组,参照表中的值没有了对应的值:拒绝执行、或级联修改、或置为空值。

3中,将某个专业的专业号从一个值改成了另外一个值,使得学生表中的专业号值在专业表中不存在了,也有3种处理方式:(1)拒绝修改;(2)将学生表中的专业号值与专业表中的专业号值一起修改,即级联修改;(3)将学生表中的专业号值改为空值。

4.3 SQL Server中的参照完整性


外码在SQL Server中对应外键。在数据库表的设计界面,选择工具条上的“管理关系”,然后选择“关系”选项卡。新建一个外键,选择“新建”按钮,上面的下拉框中会自动创建一个名字。建立主键表和外键表的对应关系,下面的级联更新和级联删除默认不打勾,即违反后采用拒绝执行方式处理;打上勾则系统自动级联操作,不必手工对外键表进行删除或更新操作。

注意,前面违约处理中说的三种处理方式是理论上的,实际在SQL Server中只有两种处理方式,即拒绝执行(No Action)和级联操作(Cascade)。

5.用户定义的完整性

如定义工龄小于60,职称为“教授”的工资不低于3000等,都属于用户定义的完整性。违反用户定义完整性时,采取的措施只有一个,就是拒绝执行,这点和实体完整性类似。

 

抱歉!评论已关闭.