2.6 关系模型
在1970年,IBM公司研究员E. F. Codd博士发表题为“大型共享数据库的关系模型”的论文,文中首次提出了数据库的关系模型。后来又多次发表多篇文章,进一步完善了关系模型,使关系模型成为关系数据库最重要的理论基础。在关系模型中,最基本的概念就是关系。
关系模型是数据库使用的一种典型数据模型。在关系模型中,其数据结构为具有一定特征的二维表。在关系数据库中,数据以关系表形式存储实体数据,关系是一个由行和列组成的二维表。
2.6.1 关系数据结构
在关系模型中,无论是实体集,还是实体集之间的联系均由单一的关系表示。在关系模型中,只有关系这一种单一的数据结构,从用户的角度来说关系模型的逻辑结构就是一张二维表。其中关于数据库结构的数据称为元数据。比如表名、列名、表和列的属性等都是元数据。
1.关系中基本术语
(1)元组(Tuple)
元组也称记录,关系表中的每行对应一个元组,组成元组的元素称为分量。数据库中的一个实体或实体之间的一个联系均使用一个元组来表示。
例如,在表2-3中有3个元组,分别对应3个学生,“史丹妮,女,会计”是一个元组,由3个分量组成。
表2-3 元组
(2)属性(Attribute)
关系中的每列对应一个域。由于域可以相同,因此为了加以区分,必须给每列一个命名,这个命名就称为属性。N目关系必有n个属性。
属性具有型和值两层含义:型是指字段名和属性值域;值是指属性具体的取值。
关系中的字段名具有标识列的作用,所以在同一个关系中的字段名(列名)不能相同。一个关系中通常有个多个属性,属性用于表示实体的特征。
(3)候选码(Candidate key)
若关系中的某一属性或属性组的值能唯一地标识一个元组,则称该属性或属性组为候选码(Candidate key)。
(4)主码(Primary key)
若一个关系中有多个候选码,则选定其中一个为主码(也可以称为主键、主关键字)。
例如,假设关系中没有重名的学生,则学生的“姓名”就是该Student关系的主码;若在Student关系中增加学生的“学号”属性,则Student关系的候选码为“姓名”和“学号”两个,应当选择“学号”属性作为主码。当包含两个或更多个的键称为复合码(键)。
主码不仅可以标识唯一的行,还可以建立与别的表之间的联系。
主码作用如下:
● 唯一标识关系的每行;
● 作为关联表的外键,链接两个表;
● 使用主码值来组织关系的存储;
● 使用主码索引快速检索数据。
主码选择的注意事项如下。
1)建议取值简单的关键字为主码。比如学生表中的“学号”和“身份证号”,建议选择“学号”作为主码。
2)在设计数据库表时,复合主键会给表的维护带来不便,因此不建议使用复合主键。
3)数据库开发人员如果不能从已有的字段(或者字段组合)中选择一个主码,那么可以向数据库添加一个没有实际意义的字段作为该表的主码。可以避免“复合主键”情况的发生,同时可以确保数据库表满足第二范式的要求(范式概念稍后介绍)。
4)数据库开发人员如果向数据库表中添加一个没有实际意义的字段作为该表的主键,即代理键。建议该主键的值由数据库管理系统(例如MySQL)或者应用程序自动生成,避免人工录入时人为操作产生的错误。
键的主要类型如下。
1)超键:在一个关系中,能唯一标识元组的属性或属性集称为关系的超键。
2)候选键:如果一个属性集能唯一标识元组,且又不含有多余的属性,那么这个属性集称为关系的候选键。
3)主键:如果一个关系中有多个候选键,则选择其中的一个键为关系的主键。用主键可以实现关系定义中“表中任意两行(元组)不能相同”的约束。
例如,在一个图书管理系统中,可将图书明细表中的图书编号列假设是唯一的,因为图书馆管理员是通过该编号对图书进行操作的。因此,把图书编号作为主键是最佳的选择,而如果使用图书名称列作为主键则会存在问题。为此,最好创建一个单独的键将其明确地指定为主键,这种唯一标识符在现实生活中很普遍,例如,身份证号、牌照号、订单号和航班号等。
(5)全码(All-key)
在最简单的情况下,候选码只包含一个属性;在最极端的情况下,关系模式的所有属性都是这个关系模式的候选码,称为全码。全码是候选码的特例。例如,设有以下关系:学生选课(学号,课程)其中的“学号”和“课程”相互独立,属性间不存在依赖关系,它的码就是全码。
(6)主属性(Prime attribute)和非主属性(Non-prime attribute)
在关系中,候选码中的属性称为主属性,不包含在任何候选码中的属性称为非主属性。
(7)代理键
代理键是具有DBMS分配的唯一标识符,该标识符已经作为主键添加到表中。每次创建行时由DBMS分配代理键的唯一值,通常是较短的数字,该值永远不变。该值对于用户没有任何意义。MySQL数据库使用AUTO INCREMENT函数自动分配代理键的数值。在AUTO INCRE-MENT中,起始值可以是任意值(默认为1),但增量总是1。
2.数据库中关系的类型
关系数据库中的关系可以有3种类型:基本关系(通常又称为基本表或基表)、查询表和视图表。
基本表是实际存在的表,它是实际存储数据的逻辑表示。
查询表是查询结果表或查询中生成的临时表。
视图表是由基本表或其他视图表导出的表,是虚表,不对应实际存储的数据。
3.关系的性质
1)关系中的元组存储了某个实体或实体某个部分的数据。
2)关系中元组的位置具有顺序无关性,即元组的顺序可以任意交换。
3)同一属性的数据具有同质性,即每一列中的分量是同一类型的数据,它们来自同一个域。
4)同一关系的字段名具有不可重复性,即同一关系中不同属性的数据可出自同一个域,但不同的属性要给予不同的字段名。
5)关系具有元组无冗余性,即关系中的任意两个元组不能完全相同。
6)关系中列的位置具有顺序无关性,即列的次序可以任意交换、重新组织。
7)关系中每个分量必须取原子值,即每个分量都必须是不可分的数据项。
关系模型要求关系必须是规范化的,即要求关系模式必须满足一定的规范条件,这些规范条件中最基本的一条就是关系的每个分量必须是一个不可分的数据项。
4.关系模式
在数据库中要区分型和值。在关系数据库中,关系模式是型,关系是值。关系模式是对关系的描述。那么应该描述哪几个方面呢?
首先,关系是一张二维表,表的每一行对应一个元组,每一列对应一个属性。一个元组就是该关系所涉及的属性集的笛卡儿积中的一个元素。关系是元组的集合,因此关系模式必须指出这个元组集合的结构,即它由哪些属性构成,这些属性来自哪些域,以及属性与域之间的映像关系。
其次,一个关系通常是由赋予它的元组语义来确定的。元组语义实质上是一个n目谓词(n是属性集中属性的个数),凡使该n目谓词为真的笛卡儿积中的元素的全体就构成了该关系模式的关系。
现实世界随着时间在不断地变化,因而在不同的时刻,关系模式的关系也会有所变化。但是,现实世界的许多已有事实限定了关系模式所有可能的关系必须满足一定的完整性约束条件,这些约束或者通过对属性取值范围的限定,例如,学生的性别只能取值为“男”或“女”,或者通过属性值间的相互关联(主要体现于值的相等与否)反映出来。关系模式应当刻画出这些完整性约束条件,因此一个关系模式应当是一个5元组。
关系的描述称为关系模式(Relation Schema),它可以形式化地表示为R(U,D,Dom,F)。
其中,R:关系名;U:组成该关系的属性的集合;D:属性组U中的属性所来自的域;Dom:属性向域的映像集合;F:为属性间数据依赖关系的集合。关系模式通常可以简记为R(U)或R(A1,A2,…,An)。其中R为关系名,A1,A2,…,An为字段名。而域名及属性向域的映像常直接称为属性的类型及长度。
关系模式是关系的框架或结构。关系是按关系模式组合的表格,关系既包括结构也包括其数据。因此,关系是关系模式在某一时刻的状态或内容。关系模式是静态的、稳定的,而关系的数据是动态的、随时间不断变化的,因为关系操作在不断地更新着数据库中的数据。但在实际应用中,人们通常把关系模式和关系都称为关系,这不难以区别。
关系数据库中关于表的三组术语的对应关系如表2-4所示。
表2-4 对应关系
经常有人会混着用上述术语,读者应知道它们的对应关系。
5.关系数据库
在关系数据库中,实体集以及实体间的联系都是用关系来表示的。在某一应用领域中,所有实体集及实体之间的联系所形成的关系的集合就构成了一个关系数据库。关系数据库也有型和值的区别。关系数据库的型称为关系数据库的模式,它是对关系数据库的描述,包括若干域的定义以及在这些域上定义的若干关系模式。关系数据库的值是这些关系模式在某一时刻对应关系的集合,也就是说关系数据库的数据。
2.6.2 关系操作
关系模型与其他数据模型相比,最具特色的是关系操作语言。关系操作语言灵活、方便,表达能力和功能都非常强大。
1.关系操作的基本内容
关系操作包括数据查询、数据维护和数据控制三大功能。
1)数据查询指数据检索、统计、排序、分组以及用户对信息的需求等功能。
2)数据维护指数据添加、删除、修改等数据自身更新的功能。
3)数据控制是为了保证数据的安全性和完整性而采用的数据存取控制及并发控制等功能。
关系操作的数据查询和数据维护功能使用关系代数中的8种操作来表示,即并(Union)、差(Difference)、交(Intersection)、广义的笛卡儿积(Extended Cartesian Product)、选择(Select)、投影(Project)、连接(Join)和除(Divide)。其中选择、投影、并、差、笛卡尔积是5种基本操作。其他操作可以由基本操作导出。
2.关系操作语言的种类
在关系模型中,关系数据库操作通常是用代数方法或逻辑方法实现,分别称为关系代数和关系演算。
关系操作语言可以分为3类。
1)关系代数语言,是用对关系的运算来表达查询要求的语言。ISBL(Information System Base Language)是关系代数语言的代表,是由IBM United Kingdom研究中心研制的。
2)关系演算语言,是用查询得到的元组应满足的谓词条件来表达查询要求的语言。可以分为元组关系演算语言和域关系演算语言两种。
3)具有关系代数和关系演算双重特点的语言。结构化查询语言(Structure Query Language,SQL)是介于关系代数和关系演算之间的语言,它包括数据定义、数据操作和数据控制3种功能,具有语言简洁、易学易用的特点,是关系数据库的标准语言。
这些语言都具有的特点是:语言具有完备的表达能力;是非过程化的集合操作语言;功能强;能够嵌入高级语言来使用。
2.6.3 关系的完整性
关系模型的完整性规则是对关系的某种约束条件。
关系模型允许定义3类完整性约束:实体完整性、参照完整性和用户自定义的完整性。
其中实体完整性和参照完整性是关系模型必须满足的完整性约束条件,称为两个不变性,应该由关系系统自动支持;用户自定义的完整性是应用领域需要遵循的约束条件,体现了具体领域中的语义约束。
1.实体完整性(Entity Integrity)
实体完整性规则:若属性A是基本关系R的主属性,则属性A不能取空值。
例如,学生关系“学生(学号,姓名,性别,专业号,年龄)”中,“学号”为主码,则“学号”不能取空值。
实体完整性规则规定基本关系的主码不能取空值,若主码由多个属性组成,则所有这些属性都不可以取空值。
例如,学生选课关系“选修(学号,课程号,成绩)”中,“学号、课程号”为主码,则“学号”和“课程号”两个属性都不能取空值。
对于实体完整性规则说明如下。
1)实体完整性规则是针对基本关系而言的。一个基本表通常对应信息世界的一个实体集,例如学生关系对应于学生的集合。
2)信息世界中的实体是可区分的,即它们具有某种唯一性标识。
3)关系模型中以主码作为唯一性标识。
4)主码中的属性即主属性不能取空值。所谓空值就是“不知道”或“不确定”的值,如果主属性取空值,就说明存在某个不可标识的实体,即存在不可区分的实体,这与第2点相矛盾,因此这个规则称为实体完整性规则。
2.参照完整性(Referential Integrity)
在实际中,实体之间往往存在着某种联系,在关系模型中实体及实体间的联系都是用关系来描述的,这样就自然存在着关系与关系间的引用。先来看下面3个例子。
【例2-1】学生关系和专业关系表示如下,其中主码用下划线标识:
学生(学号,姓名,性别,专业号,年龄)
专业(专业号,专业名)
这两个关系之间存在着属性的引用,即学生关系引用了专业关系的主码“专业号”。
显然,学生关系中的“专业号”值必须是确实存在的专业的专业号,即专业关系中有该专业的记录,也就是说,学生关系中的某个属性的取值需要参照专业关系的属性来取值。
【例2-2】学生、课程、学生与课程之间的多对多联系选修可以用如下3个关系表示:
学生(学号,姓名,性别,专业号,年龄)
课程(课程号,课程名,学分)
选修(学号,课程号,成绩)
这3个关系之间也存在着属性的引用,即选修关系引用了学生关系的主码“学号”和课程关系的主码“课程号”。同样,选修关系中的“学号”值必须是确实存在的学生的学号,即学生关系中有该学生的记录;选修关系中的“课程号”值也必须是确实存在的课程的课程号,即课程关系中有该课程的记录。也就是说,选修关系中某些属性的取值需要参照其他关系的属性来取值。不仅两个或两个以上的关系间可以存在引用关系,同一关系内部属性间也可能存在引用关系。
【例2-3】在关系“学生(学号,姓名,性别,专业号,年龄,班长)”中,“学号”属性是主码,“班长”属性表示该学生所在班级的班长的学号,它引用了本关系“学号”属性,即“班长”必须是确实存在的学生的学号。
设F是基本关系R的一个或一组属性,但不是关系R的主码。如果F与基本关系S的主码Ks相对应,则称F是基本关系R的外码(Foreign Key),并称基本关系R为参照关系(Referencing Relation),基本关系S为被参照关系(Referenced Relation)或目标关系(Target Relation)。关系R和关系S有可能是同一关系。
注意:主码(主键)与外码(外键)的列名不一定相同,唯一的要求是它们的值的域必须相同。
显然,被参照关系S的主码Ks和参照关系R的外码F必须定义在同一个(或一组)域上。
在例2-1中,学生关系的“专业号”属性与专业关系的主码“专业号”相对应,因此“专业号”属性是学生关系的外码。这里专业关系是被参照关系,学生关系为参照关系。
在例2-2中,选修关系的“学号”属性与学生关系的主码“学号”相对应,“课程号”属性与课程关系的主码“课程号”相对应,因此“学号”和“课程号”属性是选修关系的外码。这里学生关系和课程关系均为被参照关系,选修关系为参照关系。
在例2-3中,“班长”属性与本身的主码“学号”属性相对应,因此“班长”是外码。学生关系既是参照关系也是被参照关系。需要指出的是,外码并不一定要与相应的主码同名。但在实际应用中,为了便于识别,当外码与相应的主码属于不同关系时,则给它们取相同的名字。参照完整性规则就是定义外码与主码之间的引用规则。
参照完整性规则:若属性(或属性组)F是基本关系R的外码,它与基本关系S的主码Ks相对应(基本关系R和S有可能是同一关系),则对于R中每个元组在F上的值必须为以下值之一。
1)取空值(F的每个属性值均为空值)。
2)等于S中某个元组的主码值。
在例2-1中学生关系中每个元组的“专业号”属性只能取下面两类值。
1)空值,表示尚未给该学生分配专业。
2)非空值,这时该值必须是专业关系中某个元组的“专业号”值,表示该学生不可能分配到一个不存在的专业中,即被参照关系“专业”中一定存在一个元组,它的主码值等于该参照关系“学生”中的外码值。
在例2-2中按照参照完整性规则,“学号”和“课程号”属性也可以取两类值:空值或被参照关系中已经存在的值。但由于“学号”和“课程号”是选修关系中的主属性,按照实体完整性规则,它们均不能取空值,所以选修关系中的“学号”和“课程号”属性实际上只能取相应被参照关系中已经存在的主码值。
在参照完整性规则中,关系R与关系S可以是同一个关系。在例2-3中,按照参照完整性规则,“班长”属性可以取两类值。
1)空值,表示该学生所在班级尚未选出班长。
2)非空值,该值必须是本关系中某个元组的学号值。
3.用户定义的完整性(User-defined Integrity)
任何关系数据库系统都应该支持实体完整性和参照完整性。除此之外,不同的关系数据库系统根据其应用环境的不同,还需要支持一些特殊的约束条件,用户定义的完整性就是针对某一具体关系数据库的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求。例如某个属性必须取唯一值,属性值之间应满足一定的关系,某属性的取值范围在一定区间内等。关系模型应提供定义和检验这类完整性的机制,以便用统一的系统方法处理它们,而不需要由应用程序承担这一功能。关系数据库DBMS可以为用户实现如下自定义完整性约束。
1)定义域的数据类型和取值范围。
2)定义属性的数据类型和取值范围。
3)定义属性的默认值。
4)定义属性是否允许空值。
5)定义属性取值的唯一性。
6)定义属性间的数据依赖性。