1.8 关系数据库
关系数据库是当前使用最为普遍的数据库,关系数据库采用关系模型。
1.8.1 基本概念
1.关系
在关系模型中,基本数据结构被限制为二维表格。因此,数据在用户观点下的逻辑结构就是一张二维表,每一张二维表称为一个关系(relation)。
关系模型中最基本的概念是关系,表1.5给出的工资表就是一个关系。
表1.5 工资表
并非任何一个二维表都是一个关系,只有具备以下特征的二维表才是一个关系:
① 表中没有组合的列,也就是说每一列都是不可再分的;
② 表中每一列的所有数据都属于同一种类型;
③ 表中各列都指定了一个不同的名字;
④ 表中没有数据完全相同的行;
⑤ 表中行之间顺序位置的调换和列之间位置的调换不影响它们所表示的信息内容。
具有上述性质的二维表称为规范化的二维表。如不作特殊说明,本书中提到的二维表均是规范化的二维表。
2.元组和属性
表中的行称为元组。一行为一个元组,对应存储文件中的一个记录值。表中的列称为属性,每一列有一个属性名。属性值相当于记录中的数据项或者字段值。
一般来说,属性值构成元组,元组构成关系。即一个关系描述现实世界的对象集,关系中的一个元组描述现实世界中的一个具体对象,它的属性值则描述了这个对象的属性。一个元组由该行全体属性值组成,元组的全体组成了一个关系。
3.关键字(或码)
在一个关系中,能够唯一地标识一个元组的属性或属性组合称为候选关键字。有时,可能有多个侯选关键字,从中选择一个作为主关键字。主关键字在关系中用来作为插入、删除、检索元组的区分标志。如果一个关系中的属性或属性组合并不是该关系的关键字,但它们是另外一个关系的关键字,则称其为该关系的外关键字。
1.8.2 关系数据库的体系结构
关系模型基本上遵循数据库的三级体系结构。在关系模型中,概念模式是关系模式的集合,外模式是关系子模式的集合,内模式是存储模式的集合。
1.关系模式
关系模式是对关系的描述,它包括模式名、组成该关系的诸属性名、值域名和模式的主键。具体的关系称为实例。图1.17是一个教学模型的实体联系图。
实体类型S的属性SNO、SNAME、AGE、SEX、SDEPT分别表示学生的学号、姓名、年龄、性别和学生所在系;实体类型C的属性CNO、CNAME、CDEPT、TNAME分别表示课程号、课程名、课程所属系和任课教师。S和C之间有M:N的联系(一个学生可选多门课程,一门课程可以被多个学生选修),联系类型SC的成绩属性用SCORE表示。
图1.17 教学模型的实体联系图
转换成的关系模式如下:
关系模式S(SNO,SNAME,SGE,SEX,SDEPT)
关系模式C(CNO,CNANE,CDEPT,TNAME)
关系模式SC(SNO,CNO,SCORE)
表1.6、表1.7、表1.8是对应的关系。
表1.6 关系S
表1.7 关系C
表1.8 关系SC
关系模式是用数据定义语言(DDL)定义的。关系模式的定义包括:模式名、属性名、值域名及模式的主键。由于不涉及物理存储方面的描述,因此关系模式仅仅是对数据本身特征的描述。
2.关系子模式
有时,用户使用的数据不直接来自关系模式中的数据,而是从若干关系模式中抽取满足一定条件的数据。这种结构可用关系子模式实现。关系子模式是用户所需数据的结构的描述,其中包含这些数据来自哪些模式和应满足哪些条件。如果需要用到成绩子模式G(SNO,SNAME,CNO,SCORE)。可以看出,子模式G对应的数据来源于关系S和关系SC,构造时应满足它们的SNO值相等。子模式G的构造过程如图1.18所示。
子模式定义语言还可以定义用户对数据进行操作的权限,例如,是否允许读取、修改等。由于关系子模式来源于多个关系模式,因此是否允许对子模式的数据进行插入和修改就不一定了。
图1.18 子模式G的定义
3.存储模式
存储模式描述了关系是如何在物理存储设备上存储的,关系存储时的基本组织方式是文件。由于关系模式有关键码,因此存储一个关系可以用散列方法或索引方法实现,如果关系中元组数目较少(100以内),也可以用堆文件的方式实现。此外,还可以对任意的属性集建立辅助索引。
1.8.3 关系模型的完整性规则
关系模型的完整性规则实现对数据的约束。关系模型提供了三类完整性规则:实体完整性规则、参照完整性规则、用户定义完整性规则。其中实体完整性规则和参照完整性规则是关系模型必须满足的完整性约束条件,称为关系完整性规则。
1.实体完整性规则
实体完整性规则规定关系中元组的主键值不能为空。
如图1.19中给出学生表、课程表和成绩表中,学生表的主键是学号,课程表的主键是课程号,成绩表的主键学号和课程号的组合,这三个主键的值在表中应是唯一的且确定的。主键不能取空值(NULL),或是不确定的值,因为空值无法标识表中的一行。为了保证每一个实体有唯一的标识符,主键不能取空值。
2.参照完整性规则
参照完整性规则的形式定义如下:
如果属性集K是关系模式R1的主键,K也是关系模式R2的外键,那么在R2的关系中,K的取值只允许两种可能,或者为空值,或者等于R1关系中某个主键值。这条规则的实质是“不允许引用不存在的实体”。
图1.19 实体完整性和参照完整性
对于参照完整性规则,有三点需要注意。
① 外键和相应的主键可以不同名,但要定义在相同值域上。
② 当R1和R2是同一个关系模式时,表示同一个关系中不同元组之间的联系。例如,表示课程之间选修联系的模式R(CNO,CNAME,PCNO),其属性表示课程号、课程名、选修课程的课程号,R的主键是CNO,而PCNO就是一个外键,表示PCNO值一定要在关系中存在(某个CNO值)。
③ 外键值是否允许空,应视具体问题而定,若外键是模式主键中的成分,则外键值不允许空,否则允许空。
在上述形式定义中,关系模式R1的关系称为参照关系、主表或者父表;关系模式R2的关系称为依赖关系、副表或者子表。
例如,图1.19中学生表和课程表为主表,成绩表为副表,学号是学生表的主键、成绩表的外键,课程号是课程表的主键、成绩表的外键。成绩表中的学号必须是学生表中学号的有效值,成绩表与学生表之间的联系是通过学号实现的。同样,成绩表中的课程号必须是课程表中课程号的有效值,成绩表与课程表之间的联系是通过课程号实现的。
实体完整性规则和参照完整性规则是关系模型必须满足的规则,由系统自动支持。
3.用户定义的完整性规则
用户自定义完整性规则是针对某一具体数据的约束条件,由应用环境决定。它反映某一具体应用所涉及的数据必须满足的语义要求。系统应提供定义和检验这类完整性的机制,以便用统一的系统方法处理它们。例如,学生成绩应该大于或等于零,职工的工龄应小于年龄,人的身高不能超过3m等。
1.8.4 关系代数
关系代数是施加于关系上的一组集合代数运算,每个运算都以一个或多个关系作为运算对象,并生成另外一个关系作为运算的结果。关系代数包含两类运算,传统的集合运算和专门的关系运算。
1.传统的集合运算
传统的集合运算主要包括并、差、交、笛卡儿积运算和除。
(1)并
设关系R和S具有相同的关系模式,R和S的并是由属于R或属于S的元组构成的集合,记为R∪S。形式定义如下:
R∪S={t|t∈R∨t∈S},t是元组变量,R和S的元数相同
(2)差
设关系R和S具有相同的关系模式,R和S的差是由属于R但不属于S的元组构成的集合,记为R−S。形式定义如下:
R−S={t|t∈R∧t∉S},t是元组变量,R和S的元数相同
(3)交
关系R和S的交是由既属于R又属于S的元组构成的集合,记为R∩S,这里要求R和S定义在相同的关系模式上。形式定义如下:
R∩S={t|t∈R∧t∈S},t是元组变量,R和S的元数相同
交操作不是一个独立的操作。
(4)笛卡儿积
设关系R和关系S的元数分别为r和s。定义R和S的笛卡儿积R×S是一个(r+s)元的元组集合,每个元组的前r个分量(属性值)来自R的一个元组,后s个分量是S的一个元组,记为R×S。形式定义如下:
R×S={t|t=<tr,ts>∧tr∈R∧ts∈S}
若R有n个元组,S有m个元组,则R×S有n×m个元组。
(5)除
设关系R和S的元数分别为r和s(设r>s>0),那么R÷S是一个(r−s)元的元组的集合。R÷S是满足下列条件的最大关系:R÷S中每个元组t与S中每个元组u组成的新元组<t,u>必在关系R中。形式定义如下:
R÷S=Π1,2,…,r−s(R)−Π1,2,…,r−s((Π1,2,…,r−s(R)×S)−R)
例如,有5个关系R、S、T、U和V,如图1.20所示,它们的并、差、笛卡儿积和除的运算结果如图1.21所示。
图1.20 基本关系
图1.21 运算结果
2.专门的关系运算
专门的关系运算主要包括选择、投影和连接运算。
(1)选择
从关系中找出满足给定条件的所有元组称为选择,选择条件是以逻辑表达式给出的,该逻辑表达式的值为真的元组被选取。这是从行的角度进行的运算,即水平方向抽取元组。经过选择运算得到的元组可以形成新的关系,其关系模式不变,但其中元组的数目小于或等于原来的关系中元组的个数,它是原关系的一个子集。
关系R关于公式F的选择操作用σF(R)表示,形式定义如下:
σF(R)={t|t∈R∧F(t)=true}式中,σ为选择运算符,σF(R)表示从R中挑选满足公式F为真的所有元组所构成的关系。
例如,σ2>'3'(R)表示从R中挑选第2个分量值大于3的元组所构成的关系。书写时,为了与属性序号区别起见,常量用引号括起来,而属性序号或属性名直接书写。
(2)投影
从关系中挑选若干属性组成新的关系称为投影。这是从列的角度进行的运算,相当于对关系进行垂直分解。经过投影运算可以得到一个新关系,其关系所包含的属性个数往往比原关系少,或者属性的排列顺序不同。如果新关系中包含重复元组,则要删除重复元组。
设关系R是k元关系,R在其分量,,…,(m≤k,i1,i2,…,im为1~k间的整数)上的投影用表示,它是一个m元元组集合,形式定义如下:
图1.22 关系R和S
例如,Π3,1(R)表示关系R中取第1、3列组成新的关系,新关系中第1列为R的第3列,新关系的第2列为R的第1列。如果R的每列标上属性名,那么操作符Π的下标处也可以用属性名表示。例如,对于关系R(A,B,C),那么ΠC,A(R)与Π3,1(R)是等价的。
例如,有关系R、S如图1.22所示,它们的笛卡儿积、选择和投影运算结果如图1.23所示。
图1.23 R和S的笛卡儿积、选择和投影运算
(3)连接
连接也称为θ连接。它是从两个关系的笛卡儿积中选取属性满足一定条件的元组,记作:
式中,A和B分别为R和S上度数相等且可比的属性组。θ是比较运算符。连接运算从R和S的广义笛卡儿积R×S中选取(R关系)在A属性组上的值与(S关系)在B属性组上值满足比较关系θ的元组。
连接运算中有两种常用的连接,一种是等值连接,另一种是自然连接。θ为“=”的连接运算称为等值连接,它是从关系R与S的广义笛卡儿积中选取A、B属性值相等的那些元组。例如,对于图1.22的关系R和S,它们的连接运算结果如图1.24所示。
自然连接是除去重复属性的等值连接,它是连接运算的一个特例,是最常用的连接运算。两个关系R和S的自然连接的形式定义为:
其中,i1,i2,…,im为R和S的全部属性,但公共属性只出现一次。其具体计算过程如下:
① 计算R×S;
② 设R和S的公共属性是A1,A2,…,AK,挑选R×S中满足R.A1=S.A1,R.A2=S.A2,…,R.AK=S.AK的元组;
③ 去掉S.A1,S.A2,…,S.AK这些列。
例如,图1.25表示了关系R、S的自然连接算结果。
图1.24 等值连接运算
图1.25 自然连接运算
由于关系数据库是建立在关系模型基础上的,而选择、投影、连接是作为关系的二维表的三个基本运算,因此,应很好理解、掌握这三种基本运算。