1.3 关系数据库
关系是数学集合论中的一个重要概念。1970年,E.F.Codd发表了题为“大型共享数据库数据的关系模型”的论文,把关系的概念引入了数据库,自此人们开始了数据库关系方法和关系数据理论的研究,在层次和网状数据库系统之后,形成了以关系数据模型为基础的关系数据库系统。
1.3.1 关系模型
1.关系中常用的术语
关系模型是用二维表格的形式描述相关数据,也就是把复杂的数据结构归纳为简单的二维表格。表格中的每一个数据都可以看成是独立的数据项,它们共同构成了该关系的全部内容。在关系模型中,有以下常用的术语。
(1)关系:一个关系就是一张二维表格,每个关系有一个关系名,在Access 2010中,一个关系就是一个表对象。
(2)元组:表格中的每一行称为一个元组。在Access 2010中,称为记录。
(3)属性:表格中的每一列称为一个属性,给每列起一个名称,该名称就是属性名,如表1-1中的学号、姓名、性别、出生日期等。在Access 2010中,称为字段。
(4)分量:元组中的一个属性值称为分量。关系模型要求关系的每一个分量必须是一个不可分的数据项,即不允许表中还有表。
(5)域:属性的取值范围。从总体上说,以属性分类的若干个元组的集合,构成关系模式中的一个关系,在某种意义上也可以说,关系模式就是一张二维表格,用来描述客观事物以及不同事物间的联系。
(6)候选关键字:关系中的某个属性组(一个属性或几个属性的组合)可以唯一标识一个元组,这个属性组称为候选关键字。
(7)关键字:关键字是指在一个数据表中,若某一字段或几个字段的组合值能够唯一标识一个记录,则称其为关键字(或键),当一个数据表有多个关键字时,可从中选出一个作为主关键字。
(8)外部关键字:如果关系中的一个属性不是本关系的关键字,而是另外一个关系的关键字或候选关键字,这个属性就称为外部关键字。
(9)主属性:包含在任一候选关键字中的属性称为主属性。
2.关系的性质
关系是一个二维表,但并不是所有的二维表都是关系。关系应具有以下性质:
(1)每一列中的分量是同一类型的数据,来自同一个域。
(2)不同的列要给予不同的属性名。
(3)列的顺序无所谓,即列的次序可以任意交换。
(4)任意两个元组不能完全相同。
(5)行的顺序无所谓,即行的次序可以任意交换。
(6)每一个分量都必须是不可再分的数据项。
由上述可知,二维表中的每一行都是唯一的,而且所有行都具有相同类型的字段。关系模型的最大优点是一个关系就是一个二维表格,因此易于对数据进行查询等操作。
3.关系之间的联系
在关系数据库中,表之间具有相关性。表之间的这种相关性是依靠每一个独立的数据表内部具有相同属性的字段建立的。在两个相关表中,起着定义字段取值范围作用的表称为父表,而另一个引用父表中相关字段的表称为子表。根据父表和子表中相关字段的对应关系,表和表之间的关联存在以下4种类型:
(1)一对一联系:父表中每一个记录最多与子表中的一个记录相关联,反之也一样。具有一对一关联的两张表通常在创建表时可以将其合并成为一张表。
(2)一对多联系:父表中每一个记录可以与子表中的多个记录相关联,而子表中的每一个记录都只能与父表中的一个记录相关联。一对多关联是数据库中最为普遍的关联。
(3)多对一联系:父表中多个记录可以与子表中的一个记录相关联。
(4)多对多联系:父表中的每一个记录都与子表中的多个记录相关联,而子表中的每一个记录又都与父表中的多个记录相关联。多对多关联在数据库中比较难实现,通常将多对多联系分解为多个一对多联系。
4.关系数据库
在关系模型中,实体以及实体之间的联系都是用关系来表示的。例如教师实体、学生实体、课程实体等。在一个给定的应用领域中,所有实体以及实体间联系的关系的集合就构成一个关系数据库。
关系数据库系统是支持关系模型的数据库系统。它是由若干张二维表组成的,包括二维表的结构以及二维表中的数据两部分。Access就是一个关系型的数据库管理系统,由Access所创建的二维表称为数据表。
1.3.2 关系代数运算
关系代数是一种抽象的查询语言,是关系数据操纵语言的一种传统表达方式,它是用对关系的运算来表达查询要求的。
关系代数的运算对象是关系,运算结果也是关系。关系代数的运算可以分为两大类:传统的集合运算和专门的关系运算。
1.传统的集合运算
设R和S均为n元关系(元数相同即属性个数相同),且两个关系属性的性质相同。
下面以学生A(表1-2)和学生B(表1-3)两个关系为例,用以说明传统的集合运算:并运算、交运算、差运算和广义笛卡儿积运算。
表1-2 学生A
表1-3 学生B
1)并运算
两个关系的并运算可以记作R∪S,运算结果是将两个关系的所有元组组成一个新的关系,若有相同的元组,只留下一个。
学生A∪学生B的结果如表1-4所示。
表1-4 学生A∪学生B
2)交运算
两个关系的交运算可以记作R∩S,运算结果是将两个关系中公共元组组成一个新的关系。
学生A∩学生B的结果如表1-5所示。
表1-5 学生A∩学生B
3)差运算
两个关系的差运算可以记作R-S,运算结果是由属于R但不属于S的元组组成一个新的关系。
学生A-学生B的结果如表1-6所示。
表1-6 学生A-学生B
4)广义笛卡儿积运算
设R和S是两个关系,如果R是m元关系,有i个元组,S是n元关系,有j个元组,则笛卡儿积R×S是一个m+n元关系,有i×j个元组。记作:R×S。
例如,教师和教师授课表两个关系,如表1-7和表1-8所示。
表1-7 教师
表1-8 教师授课表
教师和教师授课表两个关系的笛卡儿积的结果如表1-9所示。
表1-9 教师×教师授课表
2.专门的关系运算
专门的关系运算包含选择、投影、连接和除运算。这类运算将“关系”看作元组的集合,其运算不仅涉及关系的水平方向(表中的行),而且也涉及关系的垂直方向(表中的列)。
1)选择运算
选择(Selection)是根据给定的条件选择关系R中的若干元组组成新的关系,是对关系的元组进行筛选。记作:σF(R)。其中F是选择条件,是一个逻辑表达式,它由逻辑运算符和比较运算符组成。
选择运算也是一元关系运算,选择运算结果往往比原有关系元组个数少,它是原关系的一个子集,但关系模式不变。
例如,从表1-2中,选择性别为“女”的学生名单,可以记成:σ性别="女"(学生A)。
结果如表1-10所示。
2)投影运算
从指定的关系中选择某些属性的所有值组成一个新的关系,记作:ΠA(R),A是R中的属性列。它是从列的角度进行操作的。
例如,从表1-3中列出所有学生的姓名,性别,可以记成:П姓名,性别(学生A)。
结果如表1-11所示。
表1-10 选择运算结果
表1-11 投影运算结果
3)连接运算
用来连接相互之间有联系的两个或多个关系,从而组成一个新的关系。连接运算是一个复合型的运算,包含了笛卡儿积、选择和投影三种运算。通常记作:。
每一个连接操作都包括一个连接类型和一个连接条件。连接条件决定运算结果中元组的匹配和属性的去留;连接类型决定如何处理不符合条件的元组,有内连接、自然连接、左外连接、右外连接和全外连接等。
(1)内连接,又称等值连接,是按照公共属性值相等的条件连接,并且不消除重复属性。
表1-7和表1-8的内连接,操作过程是:
首先,形成教师×教师授课表的乘积,共有9个元组,如表1-9所示。
然后根据连接条件“教师.教师编号=教师授课表.教师编号”,从乘积中选择出相互匹配的元组。结果如表1-12所示。
表1-12 内连接结果
(2)自然连接,是在内连接的基础上,再消除重复的属性,这是最常用的一种连接,自然连接的运算用表示。
表1-7和表1-8的自然连接的结果如表1-13所示。
表1-13 自然连接结果
此外,还有左连接、右连接和完全连接,这里不再赘述。
4)除运算
关系R与关系S的除法运算应满足的条件是:关系S的属性全部包含在关系R中,关系R的一些属性不包含在关系S中。关系R与关系S的除法运算表示为R÷S。除法运算的结果也是关系,而且该关系中的属性由R中除去S中的属性之外的全部属性组成,元组由R与S中在所有相同属性上有相等值的那些元组组成。如表1-14所示。
表1-14 关系R与关系S的除运算结果
1.3.3 关系的完整性
关系模型允许定义3种完整性约束,即实体完整性、参照完整性和用户定义完整性约束。实体完整性约束和参照完整性约束统称为关系完整性约束,是关系模型必须满足的完整性的约束条件,它由关系数据库系统自动支持。用户定义完整性约束是应用领域需要遵循的约束条件。
1.实体完整性约束
由于每个关系的主键是唯一决定元组的,所以实体完整性约束要求关系的主键不能为空值,组成主键的所有属性都不能取空值。
例如,在“学生”关系:学生(学号、姓名、性别、出生日期),其中学号是主键,因此,学号不能为空值。
例如,在“成绩”关系:成绩(学号、课程编号、分数),其中学号和课程编号共同构成主键,因此,学号和课程编号都不能为空值。
2.参照完整性约束
参照完整性约束是关系之间相关联的基本约束,它不允许关系引用不存在的元组,即在关系中的外键取值只能是关联关系中的某个主键值或者为空值。
例如,院系编号是“院系(院系编号、名称、简介)”关系的主键,是“学生(学号、姓名、院系编号)”关系的外键。“学生”关系中的“院系编号”必须是“院系”关系中一个存在的“院系编号”的值,或者是空值。
3.用户定义完整性约束
实体完整性约束和参照完整性约束是关系数据模型必须要满足的,而用户定义的完整性约束是与应用密切相关的数据完整性的约束,不是关系数据模型本身所要求的。用户定义的完整性约束是针对具体数据环境与应用环境由用户具体设置的约束,它反映了具体应用中数据的语义要求,它的作用就是要保证数据库中数据的正确性。
例如,限定某属性的取值范围,学生成绩的取值必须是0~100的数值。
1.3.4 关系规范化
关系模型是建立在严格的数学关系理论基础之上的,通过确立关系中的规范化准则,既可以方便数据库中数据的处理,又可以给程序设计带来方便。在关系数据库设计过程中,使关系满足规范化准则的过程称为关系规范化(Relation Normalization)。
关系规范化就是将数据库中不太合理的关系模型转化为一个最佳的数据模型,因此它要求对于关系数据库中的每一个关系都要满足一定的规范,根据满足规范的条件不同,可以划分为6个范式(Normal Form,NF),分别为:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、BCNF、第四范式(4NF)和第五范式(5NF)。
下面简要阐述前3个范式:
(1)第一范式:若一个关系模式R的所有属性都是不可再分的基本数据项,则该关系模式属于第一范式(1NF)。
第一范式是指数据库表的每一列都是不可再分割的基本数据项,同一列不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。在第一范式中表的每一行只包含一个实例的信息。
简而言之,第一范式就是无重复的列。在任何一个关系数据库中,第一范式是对关系模型的基本要求,不满足第一范式的数据库就不是关系数据库。
(2)第二范式(2NF):若关系模式R属于1NF,且每个非主属性都完全函数依赖于主键,则该关系模式属于2NF,2NF不允许关系模式中的非主属性部分函数依赖于码。
第二范式是在第一范式的基础上建立起来的,即满足第二范式必须先满足第一范式。第二范式要求数据库表中的每个实例或行必须可以被唯一地区分。这个唯一属性列被称为主关键字或主键。
第二范式要求实体的属性完全依赖于主关键字。所谓“完全依赖”是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。
(3)第三范式(3NF):若关系模式R属于1NF,且每个非主属性都不传递依赖于主键,则该关系模式属于3NF。
满足第三范式必须先满足第二范式。也就是说,第三范式要求一个数据库表中不包含已在其他表中包含的非主关键字信息。
简而言之,第三范式就是属性不依赖于其他非主属性。
1.3.5 数据库的设计方法
在数据库设计中有两种方法:一种是以信息需求为主,兼顾处理需求,称为面向数据的方法(Data-Oriented Approach);另一种是以处理需求为主,兼顾信息需求,称为面向过程的方法(Process-Oriented Approach)。这两种方法目前都有使用,在早期由于应用系统中处理多于数据,因此以面向过程的方法使用较多,而近期由于大型系统中数据结构复杂、数据量庞大,而相应处理流程趋于简单,因此用面向数据的方法较多。由于数据在系统中稳定性高,数据已成为系统的核心,因此面向数据的设计方法已成为主流方法。
根据规范化理论,数据库设计的步骤可以分为以下阶段:
1.需求分析阶段
需求分析是数据库设计的第一阶段,也是数据库应用系统设计的起点。准确了解与分析用户需求(包括数据与处理),是整个设计过程的基础。这里所说的需求分析只针对数据库应用系统开发过程中数据库设计的需求分析。
2.概念设计阶段
概念结构设计是数据库设计的关键,是对现实世界的第一层面的抽象与模拟,最终设计出描述现实世界的概念模型。概念模型是面向现实世界的,它的出发点是有效和自然地模拟现实世界,给出数据的概念化结构。长期以来被广泛使用的概念模型是实体-联系模型(Entity-Relationship Model,即E-R模型)。该模型将现实世界的要求转化成实体、属性、联系等几个基本概念,以及它们之间的基本连接关系,并且用E-R图非常直观地表示出来。
3.逻辑设计阶段
逻辑结构设计是将上一步所得到的概念模型转换为某个数据库管理系统所支持的数据模型,并对其进行优化。
4.物理设计阶段
数据库的物理设计的主要目标是对数据库内部物理结构做调整并选择合理的存取路径,以提高数据库访问速度并有效利用存储空间。
5.数据库实施阶段
运用数据库管理系统提供的数据语言、工具及宿主语言,根据逻辑设计和物理设计的结果建立数据库,编制与调试应用程序,组织数据入库,并进行试运行。
6.数据库运行与维护阶段
数据库应用系统经过试运行后即可投入正式运行。在数据库系统运行过程中必须不断地对其进行评价、调整与修改。
设计一个完善的数据库应用系统是不可能一蹴而就的,它往往是上述6个阶段的不断反复修改、完善的过程。