Visual FoxPro程序设计教程(第3版)
上QQ阅读APP看书,第一时间看更新

1.3 关系数据库

自20世纪80年代以来,新推出的数据库管理系统几乎都是基于关系模型的。Visual FoxPro就是一种关系数据库管理系统。

1.3.1 基本概念

1.关系与表

关系的逻辑结构就是一张二维表,如学籍表、课程表等。在Visual FoxPro中,一个关系就是一个“表”,每个表对应一个磁盘文件,表文件的扩展名为.DBF。表文件名即表的名称,也就是关系的名称。

2.属性与字段

一个关系有很多属性(即实体的属性),对应二维表中的列(垂直方向)。每一个属性有一个名字,称为属性名。对于一张二维表格来说,属性就是表格中的栏(列),同栏的数据应具有相同的性质,如“姓名”这一栏就只能填充姓名数据,而不能是其他数据。

在Visual FoxPro中,属性表示为表中的“字段”,属性名即为字段名。

3.关系模式与表结构

对关系的描述称为关系模式,一个关系模式对应一个关系的结构。其格式为:

在Visual FoxPro中对应的表结构为:

4.元组与记录

在一个表格(一个关系)中,行(水平方向)称为“元组”。在Visual FoxPro中,元组表示为表中的“记录”。

一个表中可以有多个记录,也可以没有记录,没有记录的表称为“空表”。

5.域

域是属性取值的范围,不同的属性有不同的取值范围,即不同的域。如成绩的取值范围是0~100,逻辑型属性的取值只能是.T.(真)或.F.(假)。

6.码与关键字

用来区分不同元组(实体)的属性或属性组合,称为码。在Visual FoxPro中对应的概念是关键字,关键字是字段或字段的组合,用于在表中唯一标识记录。如学生成绩表中的学号字段是关键字,因为学号不可能重复,可以用来唯一标识一个记录;性别字段就不是关键字,因为表中相同的性别可能会在不同记录中出现,即有两个或两个以上记录的该属性相同。

如果码的任意真子集都不能成为码,这样的“最小码”称为“候选码”。候选码可能有多个,被选中用来区别不同元组的候选码称为主码。在Visual FoxPro中,对应的概念是候选关键字和主关键字。

如果表中的某个字段不是本表的关键字,而是另外一个表中的关键字,则称该字段为外部关键字。

7.关系模型与数据库

从集合论的观点来看,一个关系模型就是若干个有联系的关系模式的集合,一个关系模式是命名的属性集合,另外,关系是元组的集合,元组是属性值的集合。

在Visual FoxPro中,把相互之间存在联系的表放到一个数据库中统一管理。例如,在订货管理数据库中可以包含订单表和客户表。

1.3.2 数据完整性

数据完整性是指数据库中数据的正确性和一致性(或相容性),保证数据完整性可以防止数据库中存在不合法的数据,防止错误的数据进入数据库中。

数据完整性可以分为实体完整性、域完整性和参照完整性。

1.实体完整性

实体完整性是指数据库表的每一行都有一个唯一的标识。实体完整性由实体完整性规则来定义,完整性规则是指表中的每一行在组成码(关键字)的列上不能有空值或重复值,否则就不能起到唯一标识行的作用。

2.域完整性

域完整性是指数据库数据取值的正确性。它包括数据类型、精度、取值范围以及是否允许空值等。取值范围又可分为静态和动态两种:静态取值范围是指列数据的取值范围是固定的,如年龄小于150;动态取值范围是指列数据的取值范围由另一列或多列的值决定,或更新列的新值依赖于它的旧值。

3.参照完整性

参照完整性是指数据库中表与表之间存在码(关键字)与外码(外部关键字)的约束关系,利用这些约束关系可以维护数据的一致性或相容性,即在数据库的多个表之间存在某种参照关系。要实现这种参照关系,首先要创建表的码与外码。

①当对含有外码的表进行插入、更新操作时,必须检查新行中外键的值是否在主表中存在,若不存在就不能执行该操作。

②当对主表中的行进行删除、更新操作时,必须检查被删除行或被更新行中主码的值是否在被一个或多个外码参照引用,若正被参照就不能执行该操作。

1.3.3 对关系数据库的要求

通常生活中的二维表格多种多样,不是所有二维表格都被当作“关系”而存放到数据库中。也就是说,在关系模型中对“关系”有一定的规范化要求。

①关系中的每个属性(列)必须是不可分割的数据单元。如图1-3a所示的复合表不符合要求,不能直接作为关系,应将它改为如图1-3b所示的二维表。

图1-3 复合表与关系表

a)复合表 b)关系表

②同一关系中不应有完全相同的属性名,即在同一个表格中不能出现相同的栏(字段)。

③关系中不应有完全相同的元组,即在同一个表格中不能出现相同的行(记录)。

④元组(记录)和属性名(字段)与次序无关,即交换两行或两列的位置不影响数据的实际含义。

1.3.4 关系运算

关系运算对应于Visual FoxPro中对表的操作,在对关系数据库进行查询时,为了找到用户感兴趣的数据,需要对关系进行一定的运算。这些运算以一个或两个关系作为输入,运算的结果是产生一个新的关系。关系的运算主要指选择、投影和连接3种运算。

1.选择运算

选择运算是指从关系中找出满足给定条件的元组,又称为筛选运算。选择的条件以逻辑表达式给出,使得逻辑表达式的值为真的元组被选取。选择是从行的角度进行的运算,即选择部分行,经过选择运算可以得到一个新的关系,其关系模式不变,但其中的元组是原关系的一个子集。

在Visual FoxPro中,选择操作使用命令短语FOR|WHILE〈条件〉或设置记录过滤器来实现。

2.投影运算

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

在Visual FoxPro中,投影操作使用命令短语FIELDS〈字段1〉,〈字段2〉,…,或设置字段过滤器来实现。

选择运算和投影运算经常联合使用,从数据库文件中提取某些记录和某些数据项。

3.连接运算

从两个关系中选取满足连接条件的元组组成新关系,称为连接(或链接、连结)。连接是关系的横向结合,连接运算将两个关系模式的属性名拼接成一个更宽的关系模式,生成的新关系中包含满足连接条件的元组。连接过程是通过连接条件来控制的,连接条件中将出现两个关系中的公共属性名,或者具有相同语义、可比的属性。

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

在Visual FoxPro中,连接操作相当于对两个二维表进行拼接。有两种意义下的连接操作,用JOIN命令实现两个表的连接将得到一个新的表;关联操作命令SETRELATION属于逻辑上的连接操作。

4.自然连接和优化

自然连接是指去掉重复属性的等值连接,它是按照属性值对应相等为条件进行的连接操作。自然连接是最常用的连接运算。

系统在执行连接运算时,要进行大量的比较操作,因此执行时比较费时。尤其在包括许多元组的关系之间进行连接时,更加突出。

优化的一般方法是:

①首先进行选择运算,尽量减少关系中元组的个数,缩小参与连接运算关系的数量,减少访问记录的次数。

②然后能投影的投影,使关系中的属性个数减少。在投影时必须注意保留连接两个关系所需要的公共属性或具有相同语义的属性,否则关系之间就失去了联系。

③最后再进行连接操作。

利用关系的投影、选择和连接运算,可以方便地分解或构造新的关系。