早在1970年,IBM公司研究员科德博士发表《大型共享数据库的关系模型》论文,首次提出了关系模型的概念。后来科德又陆续发表多篇文章,进一步完善关系模型研究,使关系模型成为关系数据库最重要的理论基础。在关系模型中,最基本的概念就是关系。那么关系是什么?如何理解关系?这些是学习关系模型首先需要解决的问题。为了便于读者理解,下面首先给出关系的通俗定义,然后再从集合论的角度给出关系的数学定义。
为了描述一个现实系统中包含数据特征的事物对象及其关系,需要在概念层面进行建模抽象,从而刻画出事物对象之间的数据关系。在概念模型中,通常采用“实体”及“实体联系”来表示系统事物对象组成及数据关系。其中,实体(Entity)是包含数据特征的事物对象在概念模型世界中的抽象名称。例如,在大学教学管理系统中,可以抽象出“课程”“教学资源”“课程计划”“学生”“教师”“班级”等实体名称,并可以通过特定的实体联系表示实体之间的关系,从而描述大学教学管理系统的事物对象及其数据关系。
为了在计算机系统中实现概念模型,还必须将概念模型依次转换为逻辑模型和物理模型,只有这样才能在程序中实现编程处理。关系模型作为一种计算机可以实现的物理数据模型,它采用二维表的数据结构形式存储实体及其实体间联系的数据。关系模型所采用的二维表应具有关系特征,并采用关系运算来操作数据。在数据库领域,把具有关系特征的二维表称为“关系表”,简称“关系”(Relation)。换言之,关系是一种由行和列组成的,用于组织与存储实体数据的二维表,该二维表需具有如下关系特征:
1)表中每行存储实体的一个实例数据。
2)表中每列表示实体的一项属性。
3)表中单元格只能存储单个值。
4)表中不允许有重复行。
5)表中不允许有重复列。
6)表中行顺序可任意。
7)表中列顺序可任意。
【例2-1】 在图1-3中定义的“教师信息表”“课程信息表”“开课目录表”均具有上述关系特征,因此,它们都可被称为关系。
在关系模型中,与关系相关的概念还有:
1)元组(Tuple):在关系二维表中的一行,称为一个元组。
2)属性(Attribute):在关系二维表中的列,称为属性。
3)域(Domain):属性列的取值范围。
4)基数(Radix):一个值域的取值个数。
5)实体(Entity):包含数据特征的事物抽象。
关系模型是建立在集合理论和关系代数等数学基础上的数据模型。下面将从集合论角度给出关系的数学描述。
定义1:域是属性列的取值集合。关系模型使用域来表示实体属性的取值范围。通常用 D i 来表示某个域。
【例2-2】 假设一个“学生”实体有3个属性列(学号、姓名、性别)。可以使用 D 1 、 D 2 、 D 3 域来定义各属性列取值范围,其取值集合如下:
D 1 ={2023010001,2023010002,2023010003}
D 2 ={刘京,夏岷,周小亮}
D 3 ={男,女}
定义2:给定一组域 D 1 , D 2 ,…, D n ,这组域的笛卡儿积(Cartesian Product)为
D 1 × D 2 ×…× D n ={( d 1 , d 2 ,…, d n )| d i ∈ D i , i =1,2,3,…, n }
其中,每一个向量( d 1 , d 2 ,…, d n )称为一个 n 元组,简称元组。向量中的每个 d i 称为分量。若 D i ( i =1,2,…, n )为有限集,每个域的基数为 m i ( i =1,2,…, n ),则笛卡儿积 D 1 × D 2 ×…× D n 的基数 M 为 。
例2-2中 D 1 , D 2 , D 3 的笛卡儿积为 D 1 × D 2 × D 3 ={(2023010001,刘京,男),(2023010001,刘京,女),(2023010001,夏岷,男),(2023010001,夏岷,女),…,(2023010003,周小亮,女)}。
该笛卡儿积的基数应为3×3×2=18,即结果集合的元素共有18个元组。将这组笛卡儿积放入一个二维表,见表2-1。
定义3:关系是 D 1 × D 2 ×…× D n 笛卡儿积元组集合中有特定意义的子集合。它表示为 R ( D 1 , D 2 ,…, D n ),其中 R 为关系的名称, D 1 , D 2 ,…, D n 分别为 R 关系的属性, n 为关系属性的个数,称为“元数”或“度数”。
表2-1 D 1 、 D 2 和 D 3 的笛卡儿积
【例2-3】 “学生”实体的关系定义,可使用“学生)学号,姓名,性别)”来表示。在“学生”关系中,度数 n =3,称该关系为3元关系。以此类推, n 个属性的关系称为 n 元关系。
关系是从 D 1 × D 2 ×…× D n 笛卡儿积元组集合中提取的有实际意义的元组子集。关系中的元组数一般少于笛卡儿积的元组数。例如,在上面描述“学生”关系的笛卡儿积元组集合中,只有表2-2的元组子集才是“学生”关系中有实际意义的数据。
表2-2 “学生”关系
在关系的数学定义中,关系是 D 1 × D 2 ×…× D n 笛卡儿积元组集合中有特定意义的子集合。由于笛卡儿积不满足交换律,即( d 1 , d 2 ,…, d n )≠( d 2 , d 1 ,…, d n )。这个特性不适合数据库实际应用处理要求,因此,需要对关系特性进行如下限制与约束:
1)无限元组集合的关系在数据库系统中是无实际意义的。关系中的元组集合必须是数量有限的元组集合。
2)为了使关系中的属性列在关系表中可任意顺序,即让关系满足交换律,需给各属性列定义不同列名,并消除元组属性列的有序性。
由前面的关系定义,我们知道关系的数据结构实际上就是一个二维表,表中每行为一个元组,表中每列为一个属性列。关系是元组的集合,一个元组是该关系属性列笛卡儿积的一个结果向量。为了简洁地表示关系,可采用关系模式语句来表示,即
关系名)属性1,属性2,…,属性 x )
通常使用大写字母的英文单词给出关系名。例如,“学生”关系可以取名为STUDENT。如果关系名是两个或多个单词的组合,可使用下划线连接这些单词。关系的各属性列名放入关系模式语句的括号中,使用逗号分隔。同样列名也使用英文单词,其首字母大写。如果列名是两个单词或多个单词的组合,则每个单词的首字母都大写。例如“学生”关系模式语句可表示为
STUDENT(StudentNum,StudentName,Sex)
在关系模型中,要求关系中任意两个元组不能完全相同。这可通过在关系的各个属性中,选出能够唯一标识不同元组的属性或属性组来约束元组数据。将这样的属性或属性组称为键(Key)。
【例2-4】 在表2-3的EMPLOYEE(员工)关系表中,EmployeeNumber(工号)属性列的取值是唯一的,可以把它定义为EMPLOYEE关系表的键。
表2-3 EMPLOYEE关系表
在关系中,有时需要同时使用两个或更多个属性的组合值才能唯一标识不同元组,这种由多个属性所构成的键称为复合键(Compound Key)。在表2-3中,如果没有同姓名的员工在同一部门的情况,可以将“姓名”和“部门”属性组合在一起,其组合值可以唯一标识员工,即将Name和Department属性结合在一起,作为EMPLOYEE关系的复合键。
在一个关系中可能有多个键存在,将每个键都称为候选键(Candidate Key)。例如,在表2-3中,若“EmployeeNumber”“Email”属性列的取值都是唯一的,则它们均是关系的键,也都为候选键。
在一个关系中,不管它有多少个候选键,在定义数据库关系表时,都需要确定出一个最合适的键作为主键(Primary Key),它的不同取值用于在该关系表中唯一标识不同元组。例如,在表2-3中,可选定“EmployeeNumber”作为主键。
在关系数据库的设计中,每个关系表都必须确定一个主键。主键在关系数据库中具有如下作用:
1)主键属性列值可用来标识关系的不同行(元组)。
2)当表之间有关联时,主键可以作为表之间的关联属性列。
3)许多DBMS软件使用主键列索引顺序来组织表的数据块存储。
4)通过主键列的索引值可以快速检索关系中的行数据。
在关系模式表示中,可以在主键属性列添加下划线来标明主键。例如,在表2-3的EMPLOYEE关系表中,可以使用如下语句来表示该关系模式
EMPLOYEE( EmployeeNumber ,Name,Department,Sex,Email)
课堂讨论:本节重点与难点知识问题
1)如何理解“实体”和“关系”?它们分别是哪类模型的概念?
2)什么是关系?什么是关系模型?关系数据库如何组织与存储数据?
3)关系的数学定义是什么?关系具有哪些特性?
4)在关系表中,为什么需要确定主键或复合键?
5)在关系表中,主键有哪些作用?
6)如何表示关系模式?