数据库应用基础教程(Visual FoxPro 9.0)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.4 关系数据库

1.关系数据库概述

关系数据库是在层次和网状数据库之后发展起来的。1970年,E.F.Codd提出了关系数据模型的概念,之后相继发表了一系列关系模型的论文,奠定了关系数据库的理论基础。关系数据库是采用关系模型作为数据的组织方式的数据库。关系数据库与非关系数据库的区别在于:关系数据库只有“表”这一种结构,而非关系数据库还有其他数据结构。

① 关系模型(Relational Model):用二维表格结构来表示实体及实体间联系的模型。

② 属性(Attribute)和值域(Domain):在二维表中的列称为属性,列值称为属性值,属性值的取值范围称为值域。

③ 关系模式(Relation Schema):在二维表格中,行定义(记录的型)称为关系模式。

⑤ 元组(Tuple)和关系:在二维表中的行(记录的值)称为元组,元组的集合称为关系,关系模式通常也称为关系。

⑥ 码(Key)或关键字:在关系的属性中,能够用来唯一标志元组的属性(或属性组合)。关系中的元组由码值唯一确定,码不能为空。例如,学生表中的学号就是码。

⑦ 候选码(Candidate Key)或候选关键字:如果一个关系中存在着多个属性(或属性的组合)都能唯一标志该关系的元组,这些属性或属性的组合都称为该关系的候选码或候选关键字。

⑧ 主码(Primary Key)或主关键字:若一个关系中存在若干候选码,则从中指定为关键字的属性(或属性组合)称为该关系的主码或主关键字。

⑨ 非主属性(Non Primary Attribute)或非关键字属性:关系中不能组成码的属性均为非主属性或非关键字属性。

外键(Foreign Key)或外部关键字:当关系中的某个属性或属性组合虽不是该关系的关键字或只是关键字的一部分,却是另一个关系的关键字时,称该属性或属性组合为这个关系的外部关键字或外键。

⑩ 从表与主表:以某属性为主键的表称为主表,以此属性为外键的表称为从表。例如,有两个表

学生(学号,姓名,性别,出生日期,入学时间,系部代码)

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

对于选课表,学号是外键,对于学生表,学号是主键。学生表为主表,选课表为从表。

关系模型由三部分组成:数据结构、关系操作、关系的完整性。

2.表间的关联关系

在一个关系数据库中,若想将依赖于关系模型建立的多个数据表组织在一起,反映客观事物数据间的多种对应关系,通常将这些数据表放入同一个数据库中,并建立表间关联。

在同一个数据库中,相关联的表间关系的类型有一对一、一对多和多对一。在E-R图中,多对多的联系在关系数据库设计阶段要转化成一对多的联系。

(1)一对一关系

一对一关系即在两个数据表中选一个相同属性字段作为码,把其中一个数据表中的码称为主码,该字段值是唯一的,而另一个数据表中的码称为外码,该码值也是唯一的。

例如,通过相同字段“编号”,可将教师基本信息表与教师工资表联系起来,教师基本信息表中的“编号”为主码(该码值是唯一的),而教工工资表中的“编号”为外码(该码值是唯一的),两个表便构成了一对一的关系,如图1-20。

图1-20

(2)一对多关系

一对多关系,即在两个数据表中选一个相同属性字段作为码,其中一个数据表的码称为主码,该字段值是唯一的,而把另一个数据表中的码称为外码,该码值是重复的。

例如,相同字段通过“编号”,可将教工基本信息表与教师授课表联系起来,教师基本信息表中的“编号”为主码(该字段值是唯一的),而教师授课表中的“编号”为外码(该码值是重复的),两个表便构成了一对一的关系,如图1-21所示。从图1-21中可以看出,一个复杂的表可以分成一对多的关系,虽然还存在重复,但仅是外码的重复。这就减少了数据输入及数据存储的复杂性。

图1-21

(3)多对一关系

多对一关系与一对多关系是类似的,唯一的区别是在两个相关联的数据表中,选择哪个数据表中的码作为主码。该码值是重复的,与它相关联的另一个数据表中的码为外码,该码的值是唯一的。

在教师授课表与教师基本信息表中,如果以教师授课表中的“编号”为主码(其值是重复的),而教师基本信息表中的“编号”为外码(该码值是唯一的),两个表便构成了多对一的关系,如图1-22所示。

图1-22

通过上面的介绍可知,为两个数据表建立关联关系,其关系类型取决于主码和外码的取值是否重复。如果主码和外码的值都是唯一的,两表间的关联关系是一对一的关系;如果主码和外码的值中,一个是唯一的,另一个是重复的,则两表间的关联关系是一对一或多对一的关系。在一般情况下,把包含主码的数据表称为父表,把包含外码的数据表称为子表。

根据不同数据处理问题的实际需要设计数据库中数据表的个数以及数据表间的关系,都有不同的要求,而遇到的问题对象都是个案化、个性化的对象,但是只要遵循关系模型理论和关系规范化原则,就能够使所建的数据库达到最佳效果。当然,关系规范化原则并不是僵硬的教条,它只是在建立数据库以及数据表结构时起到一个指导性的作用,以减少对应用程序的灵活性的限制,提高数据的使用率。

3.关系运算

在Visual FoxPro中没有提供传统的集合运算,可以通过其他操作或编写程序来实现。对关系数据库进行查询时,需找到用户感兴趣的数据,这就需要对关系进行一定的关系运算。关系运算包括选择、投影、连接和除法运算。考虑到非计算机专业学生的特点,也考虑到除法运算用得多,这里对除法运算不作介绍。这类运算将“关系”看做是元组的集合,其运算不仅涉及关系的水平方向(表中的行),而且涉及关系的垂直方向(表中的列)。

在Visual FoxPro中,查询是高度非过程化的,用户只需提出“要干什么”,而不需指出“怎么去干”。系统将自动对查询过程进行优化,可以实现对多个相关联的表的高速存取。

(1)选择运算(Selection)

从关系中找出满足给定条件的元组的操作称为选择。选择的条件以逻辑表达式给出,使逻辑表达式的值为真的元组将被选取。选择是从行的角度进行的运算,即从水平方向抽取记录。经过选择运算得到的结果可以构成新的关系,其关系模式不变,但其中的元组是原关系的一个子集。

比如,已知“人才档案”关系模式如下:

人才档案(编号,姓名,性别,出生日期,学历,政治面貌,民族,工资现状,工作简历,照片)

若想由“人才档案”关系组成新关系,选出满足条件的元组(仅要男性信息),其关系模式不变,可通过选择操作来实现。

(2)投影运算(Projection)

从关系模式中指定若干个属性组成新的关系称为投影。投影是从列的角度进行的运算,相当于对关系进行垂直分解。经过投影运算可以得到一个“新关系”,其关系模式所包含的属性个数往往比原关系少,或者属性的排列顺序不同。投影运算提供了垂直调整关系的手段,体现出关系中列的次序无关紧要这一特点。

比如,已知有“人才档案”关系,其关系模式如下:

人才档案(编号,姓名,性别,出生日期,学历,政治面貌,民族,工资现状,工作简历,照片)

若想由“人才档案”关系组成新关系,其关系模式是“新人才档案(编号,姓名,性别,出生日期,学历,政治面貌)”,可通过投影操作来实现。

(3)联接运算(Join)

联接是关系的横向结合。联接运算将两个关系模式拼接成一个更宽的关系模式,生成的新关系中包含满足联接条件的元组。联接过程是通过联接条件来控制的,联接条件中将出现两个表中的公共属性名,或者具有相同语义、可比的属性。联接结果是满足条件的所有记录,相当于Visual FoxPro中的“内部联接”。

选择和投影运算的操作对象只是一个表,相当于对一个二维表进行切割。联接运算需要两个表作为操作对象。如果需要联接两个以上的表,应两两进行联接。

自然联接:在联接运算中,以字段值对应相等为条件进行的联接操作称为等值联接。自然联接是去掉重复属性的等值联接。自然联接为最常用的联接运算,前面的例子均属于自然联接。

例如,已知“人才档案”关系和“成就成果”关系,其关系模式如下:

人才档案(编号,姓名,性别,出生日期,学历,政治面貌,民族,工资现状,工作简历,照片)

成就成果(编号,成果名称,成果类别,成果出处)

若想由编号JI04001组成新关系,可通过选择和联接操作来实现。

4.关系的完整性

数据完整性是指关系模型中数据的正确性和一致性。关系模型允许定义三类完整性约束:实体完整性、参照完整性和用户自定义完整性约束。实体完整性和参照完整性是关系模型必须满足的完整性约束条件,称为关系的两个不变,应该由关系系统自动支持,也就是在插入、修改、删除操作时,数据库系统自动保证数据的正确性和一致性。

(1)实体完整性约束(Entity Integrity Rule)

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

例如,在关系“学生{学号,姓名,性别}”中,“学号”属性为主码,则“学号”不能取空值。

实体完整性约束要求关系中的元组在组成主键的属性列上的值不能为空。例如,在学生选课关系“选课(学号,课程号,成绩)”中,“学号”、“课程号”为码,则“学号”和“课程号”两个属性都不能取空值。

对于实体完整性约束的说明如下:

① 实体完整性约束是针对基本关系而言的。一个基本表通常对应现实世界的一个实体集,如学生关系表对应于学生的集合,教师关系对应于教师的集合。

② 现实世界中的实体是可区分的,即它们具有某种唯一性标志。

③ 相应地,关系模型中以主码作为唯一性标志。

④ 主码中的属性即主属性不能取空值。所谓空值,就是“不知道”或“无意义”的值。如果主属性取空值,就说明存在某个不可标志的实体,即存在不可区分的实体,这与第②点相矛盾,因此这个规则称为实体完整性。

(2)参照完整性约束(Reference Integrity Rule)

现实世界中的实体之间往往存在某种联系,在关系模型中实体及实体间的联系都是用关系来描述的,这样就自然存在着关系与关系间的引用。参照完整性约束要求不能在从表中引用主表中不存在的元组。

〖例1-10〗 学生实体和专业实体可以用下面的关系表示,其中主码用下划线标志:

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

专业(专业号,专业名)

这两个关系之间存在着属性的引用,即学生关系引用了专业关系的主码“专业号”。显然,学生关系中的“专业号”值必须是确实存在的专业的专业号,即专业关系中有该专业的记录。也就是说,学生关系中的某个属性的取值需要参照专业关系的属性取值。

〖例1-11〗 学生、课程、学生与课程之间的多对多关系可以用如下3个关系表示:

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

课程(课程号,课程名,学分)

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

这3个关系之间存在着属性的引用,即选修关系引用了学生关系的主码“学号”和课程关系的主码“课程号”。同样,选修关系中的“学号”值必须是确实存在的学生的学号,即学生关系中有该学生的记录;选修关系中的“课程号”值也必须是确实存在的课程的课程号,即课程关系中有该课程的记录。换句话说,选修关系中某些属性的取值需要参照其他关系的属性取值。

两个或两个以上的关系之间存在引用关系,同一关系内部的属性之间也可能存在引用关系。

〖例1-12〗 在关系“学生(学号,姓名,性别,专业号,年龄,班长)”中,“学号”属性是主码,“班长”属性表示该学生所在班级的班长的学号,它引用了本关系的“学号”属性,即“班长”必须是确实存在的学生的学号。

参照完整性约束:若属性(或属性组)F 是基本关系 R 的外码,它与基本关系 S 的主码 K1相对应(基本关系RS不一定是不同的关系),则R中每个元组在F上的值必须:或者取空值(F的每个属性值均为空值),或者等于S中某个元组的主码值。

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

对于例1-10,学生关系中每个元组的“专业号”属性只能取下面两类值:① 空值,表示尚未给该学生分配专业;② 非空值,即该值必须是专业关系中某个元组的“专业号”值,表示该学生不可能分配到一个不存在的专业中,即被参照关系“专业”中一定存在一个元组,它的主码值等于该参照关系“学生”中的外码值。

对于例1-11,按照参照完整性约束,“学号”和“课程号”属性也可以取两类值:空值或目标关系中已经存在的值,但由于“学号”和“课程号”是选修关系中的主属性,按照实体完整性规则,它们均不能取空值,所以选修关系中的“学号”和“课程号”属性实际上只能取相应被参照关系中已经存在的主码值。

在参照完整性规则中,R和S可以是同一个关系。对于例1-12,按照参照完整性约束,“班长”属性值可以取两类值:① 空值,表示该学生所在班级尚未选出班长;② 非空值,这时该值必须是本关系中某个元组的学号值。

(3)用户定义的完整性

任何关系数据库系统都应该支持实体完整性和参照完整性。除此之外,不同的关系数据库系统根据其应用环境的不同,往往需要一些特殊的约束条件,用户定义的完整性就是针对某一具体关系数据库的约束条件。用户自定义完整性约束是根据应用领域的需要,由用户定义的约束条件,体现了具体应用领域的语义约束。例如,某个属性必须取唯一性、某些属性值之间应满足一定的函数关系、某个属性的取值范围为0~100等。关系模型应提供定义和检验这类完整性的机制,以便用统一、系统的方法处理它们,而不要由应用程序承担这一功能。