1.2 关系模型

20世纪80年代以来,计算机厂商推出的数据库管理系统几乎都支持关系模型。目前,比较流行的以关系模型为基础的大型数据库管理系统包括Oracle、Sybase、Informix和SQL Server等,小型数据库管理系统则包括Visual FoxPro、Access、Paradox和Betrive等。

1.2.1 关系的基本概念及关系数据库

1.关系的基本概念

(1)关系

一个关系就是一张二维表,每个关系都有一个关系名。例如,图1-7所示的职工情况表就是一个二元关系,该表格清晰地反映出单位职工的基本情况。如果表名为“职工”,则“职工”即为关系名。在Visual FoxPro中,一个关系对应一个数据文件,关系名对应于文件名。

active=true

图1-7 职工情况表

(2)元组

二维表中的每一行在关系中称为元组。一个元组对应于数据文件中的一条记录,所以元组也称记录。例如,图1-7中姓名为“李长江”的所在行的所有数据就是一个元组,称为一条记录。

(3)属性

二维表中的每一列在关系中称为属性,每个属性都有一个属性名,属性的取值范围取决于各个元组的属性值。例如,图1-7中的第2列属性,“姓名”是它的属性名,“李长江”是其中的一个属性值。

在Visual FoxPro中,属性也就是数据文件中的字段,属性名就是字段名,而属性值对应于各个记录的字段值。

(4)域

域是指二维表中属性的取值范围,取值范围也就决定了表中字段的宽度。例如,图1-7中属性“婚否”的取值范围是.T.或.F.。

(5)关系模式

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

关系名(属性1,属性2,属性3,……,属性n

例如:

职工(职工号,姓名,性别,婚否,出生日期,基本工资,部门,简历,照片)

销售(职工号,商品号,数量)

商品(商品号,商品名称,类别,库存量,单价,单位)

(6)关键字(关键字段或码)

在关系中,可以用来唯一地标识一个元组的属性或属性组合称为关键字。单个属性的关键字称为单关键字,多个属性组合的关键字称为组合关键字。

例如,图1-7中的“职工号”是单关键字,因为每个职工的工号不允许重复。在销售(职工号,商品号,数量)关系中,它的关键字则是“职工号+商品号”的组合,因为一个职工可以销售多种商品,一个商品可以被多个职工销售,只有某个职工销售的某个商品则是确定的。

(7)主关键字(主键)与候选关键字

通常在一个关系中,关键字可能不止一个,但主关键字只能有一个,并且取值是确定的。当某关键字被选作表的主关键字后,如果还有其他的关键字,则其他的关键字称为候选关键字。

例如,在“职工”表中,如果不存在同名同姓的职工记录,则姓名也可以是关键字,但如果选择“职工号”作为主关键字,则“姓名”就是候选关键字。

(8)外部关键字

如果一个属性在本表中不是主关键字,而在另一个表中是主关键字,则该属性称为外部关键字。

例如,在“销售”表中的“职工号”是“职工”表的主关键字,但它并不是“销售”表的主关键字。这里,称“职工号”属性为“销售”表的外部关键字。

这里提醒大家注意:关系、元组及属性等是数学领域的术语,二维表、行和列等是日常用语,而表文件、记录和字段等则是计算机领域的术语,这些术语间是相互对应的。在Visual FoxPro中经常使用的是表文件、记录和字段等概念。

2.关系表之间的联系

前面已经讨论了实体间的联系类型有1:1、1:nm:n 的联系,这种联系类型在关系数据库中就是表与表间的联系。不同的联系方式,在设计数据库表时应当考虑以下问题。

(1)表与表之间是1:1的联系

对于1:1联系类型的信息,设计时可分为两个表或合并为一个表。如果要将一个表分成许多字段,或因安全原因而隔离表中的部分数据,则可以在表与表之间建立一对一的联系关系。例如,可以将“职工号”与“照片”的有关信息放在一个表中。

(2)表与表之间是1:n的联系

对于1:n联系类型的信息,设计时需将父表中的主关键字放入子表中,以实现两表之间的有效关联。例如,“职工”表与“销售”表之间为一对多的联系。具体设计表时,需在“销售”表中加进“职工”表的主关键字“职工号”,作为其外部关键字。

(3)表与表之间是m:n的联系

对于m:n联系类型的信息,设计时需要另外增加一个新表,这个表称为“关联表”,其中必须包括两个表的主关键字,再加入两表之间的关联字段。例如,“职工”表中的职工与“商品”表中的商品是多对多的联系,需要增加“销售”表,并在其中包括“职工号”和“商品号”,另外加上“销售数量”,作为“职工”表与“商品”表的关联字段。

3.关系数据库

用关系模型建立数据和描述数据之间联系的数据库就是关系数据库。在关系数据库中,一个数据文件存放一个关系的数据,若干个相关数据文件的集合就组成了关系数据库。

在Visual FoxPro中,数据库由4个层次组成:字段、记录、表和数据库。一个关系数据库由若干个数据表组成,每个数据表又由若干条记录组成,而每条记录又是由若干字段组成的。属于某一数据库的表称为数据库表,而不属于任何数据库的表称为自由表。

本书所使用的职工营销数据库,主要由职工情况、销售情况和商品情况3张数据表组成,详见图1-7~图1-9。

active=true

图1-8 销售情况表

active=true

图1-9 商品情况表

1.2.2 关系的特征

在关系模型中,对关系有一定的要求,关系必须具有以下特征:

① 关系中的每一属性(字段)都是不能再分的基本数据项,即表中不允许有子表;

② 关系中同一属性(字段)必须具有相同的数据类型(如字符型或数值型等);

③ 同一关系中不能出现相同的属性名(字段名);

④ 关系中不应有内容完全相同的元组(记录);

⑤ 关系中记录和字段的顺序可以任意排列,不影响关系表中所表示的信息含义。

1.2.3 关系操作

当对关系数据库进行查询等操作时,常常需要对关系进行一定的运算处理,其中,选择、投影和连接是关系的3种基本运算。

1.选择

按照一定条件在给定关系中选取若干元组(即选取若干记录)的操作称为选择。选择的条件通过逻辑表达式给出,条件为真的记录被选出。例如,在图1-7所示的关系中,如果按照“婚否=.F.”的条件进行选择操作,则可得到图1-10所示的结果。

active=true

图1-10 选择操作结果

2.投影

在给定关系中选取确定的若干属性(即选取若干字段)组成新的关系称为投影。例如,在图1-7所示的关系中,如果选取职工号、姓名和性别3个字段的数据输出,则可得到图1-11所示的结果。

active=true

图1-11 投影操作结果

3.连接

连接是指将两个或两个以上关系模式通过公共的属性名(字段名)拼接成一个新的关系模式,生成的新关系中包含满足连接条件的元组(记录)。例如,根据职工、销售、商品三个关系模式中共有的职工号、商品号连接成一个新的关系模式,结果如图1-12所示。

active=true

图1-12 连接操作结果

1.2.4 数据库的完整性规则

数据库系统在运行过程中,由于数据输入、编辑、非法访问、程序错误等各方面的原因,容易产生数据错误和混乱,为保证关系中数据的正确、有效,需要建立数据完整性的约束机制来加以控制。关系模型的完整性规则就是对关系的某种约束条件。数据库表之所以与自由表有区别,主要是因为数据库表可以受完整性规则的约束。

所谓数据库的完整性,是指数据库中数据的正确性、有效性和一致性。这是数据库系统应遵守的一项标准,它保证了数据库中数据的完整、可靠。

要实现数据库的完整性,必须在数据库的建立和操作过程中,遵循一定的完整性规则,并随时检查是否满足完整性规则约束。数据库的完整性规则分为实体完整性、参照完整性和用户自定义完整性三部分。

1.实体完整性

实体完整性是指一个关系表中主关键字的取值必须是确定的、唯一的,不允许为空(NULL)值。

例如,对“职工”表中主关键字“职工号”字段、商品表中的主关键字“商品号”字段的取值必须确定、唯一,且不能为空值。这就要求在“职工”表、“商品”表中存储的每一条记录必须满足这一条件,而且在输入新记录、修改记录时也要遵守这一条件。

2.参照完整性

数据库的参照完整性是指:在“子”表中实现关联的外部关键字,它的取值,或者为空值,或者为“父”表中实现相应关联的主关键字值的子集。在两个表之间大量存在一对多的联系,即“父”表与“子”表间的联系。这也是关系数据库中最主要的一种联系,并且它是通过“父”表中的主关键字与“子”表中相应的外部关键字来实现关联的。

例如,在“职工”表(父表)与“销售”表(子表)之间的参照完整性要求是:“销售”表的“职工号”字段的取值必须是“职工”表“职工号”字段取值当中已经存在的一个值。类似地,在“商品”表与“销售”表之间也必须遵守参照完整性的规则。

3.用户自定义完整性

用户自定义完整性是用户根据实际应用环境的需求来决定的,通常为某个字段的取值或多个字段之间取值范围限制等。例如,在“职工”表中,“性别”字段的取值必须在“男”或“女”之间。在一般情况下,要实现数据库的完整性约束条件及完整性检验,用户需编写相应的代码或利用数据库管理系统提供的功能完成。