关系型数据库理论
关系模型数据库系统的数据结构简单,表示数据及其数据之间的联系均采用关系(二维表),同时关系模型有扎实的数学理论做基础,使得数据的操作可以通过关系的运算来完成。
关系及关系模型
关系是数学上的一个概念,建立在日常生活中所论及的关系概念之上,例如我们通常所说的邻里关系、朋友关系、学生与所选修的课程及该课程的成绩关系等。在这里我们所论及的朋友关系涉及到了互为朋友的双方,在数学上可表示为(张,李);邻里关系也涉及到了互为邻里的双方,表示为(李家,张家);学生与所选修的课程及该课程的成绩关系,涉及到学生、所选的课程以及所取得的成绩,在数学上表示为(李兰,软件基础,90)。(李,张)、(李家,张家)、(李兰,软件基础,90)在数学上称为元组,括号里用逗号隔开的对象,数学上称为元组的分量。
数学上关系的概念是日常生活中关系概念的抽象,下面给出关系的简单、直观的概念:
1.关系
关系是以元组为元素的集合。数据库技术中论及的关系概念应该是:关系是同类型元组的结合。
简单说,关系就是集合,可以用大写字母R1,R2,R来表示。
范例:学生与所选课程之间的关系R可以表示为:
R={(李兰,软件基础,90),(张娜,高等数学,87),(张伟,C语言,76),…,(韶华,英语,79)}
这样的一个关系R,在日常生活中可通常表示成一个表格的形式:
姓名 |
课程名 |
成绩 |
李兰 |
软件基础 |
90 |
张娜 |
高等数学 |
87 |
张伟 |
C语言 |
76 |
… |
… |
… |
韶华 |
英语 |
79 |
我们可以看到,这张表表示一个关系,表中的每一行表示一个元组,也就是关系集合的元素,表格中每列的数据表示元组的分量。
2.关系模型
从上面的例子中可以看到,数学上关系的概念可以用来描述一个二维表,而二维表就是我们现实世界中进行各种档案管理使用的方法,其中记录了大量的数据。这样就用数学理论中的一个概念描述了现实世界的一个对象。关系型数据库就是用关系描述数据的数据库系统。
(1)二维表与关系
关系可以用来描述二维表,对应的术语是:
- 关系←→二维表;
- 元组←→二维表中的行
- 分量←→二维表中的列
(2)二维表与关系型数据库中的数据
一个关系型数据库中的数据对应于一个二维表,其中对应的术语是:
- 二维表←→一个数据库中的表、一个数据视图
- 二维表的行←→数据表中的记录
- 二维表的列←→表记录的字段
范例:
这里的教学管理系统的E-R模型图,其中实体“学生”的属性为学号,姓名、年龄、性别,分别用S#,SNAME,AGE,SEX表示,实体“课程”的属性为课程号,课程名,授课教师,分别用C#,CNAME,TEACHER表示,实体学生用S表示,课程用C表示,学生与课程之间的关系用SC表示,SC的属性成绩用GRADE表示。
用关系描述教学管理模型的数据:
分析:在这个E-R图中,实体有学生和课程两个,两个实体之间的联系是多对多的,按照将E-R模型转换成关系模型的转换方法,由于学生实体与课程实体之间的联系是多对多的,所以转换成关系模型时,实体和联系分别转换为关系模式:
S(S#,SNAME,AGE,SEX)
C(C#,CNAME,TEACHER)
SC(S#,C#,GRADE)
这些关系模式集可以描述三类关系,下面是这三类关系模式的关系实例:
上面的三个关系中,关系S的关键字是:S#(学号),关系C的关键字是:C#(课程号),关系SC的关键字是:S#+C#(学号+课程号)。关键字是能唯一标识记录的字段或字段表达式。这样我们就将现实世界(教学管理系统)用S、C、SC三个关系模式描述清楚了。
(3)关系模型的三类完整性规则
关系描述了现实世界中的数据,这些数据以数据库(表)的形式存储到计算机中,根据现实世界的变化,计算机中的数据也要进行相应的改变。为了维护数据库数据与现实世界数据的一致性,关系数据库中的数据的建立与数据的更新必须遵守以下规则:
- 实体完整性规则:实体完整性规则要求关系中,记录关键字的字段不能为空,不同记录的关键字,字段值也不能相同,否则,关键字就失去了唯一标识记录的作用。
- 参照完整性规则:参照完整性规则要求关系中“不引用不存在的实体。”
例如在联系关系SC中课程号字段出现的课程号,必须在课程关系中存在,假如在关系C中找不到“小学算术”这个课程的课程号,而SC中出现了记录:(李冰,CC01(小学算术),95),那么这条记录就是一条错误的记录,因为它违背了参照完整性规则
参照完整性规则可以理解如下:
如果属性集K是关系模式R1的关键字,K也是关系模式R2的属性,那么在关系R2中K为外键,在R2的关系中K的取值只允许有两种可能,或者为空值,或者等于R1关系中某个关键字的值。
其中提到的外键是指:当关系中的某个属性或属性组虽然不是该关系的关键字或只是该关系关键字的一部分,但却是另一个关系的关键字,则成该属性是这个关系的外键,如上面提到的SC关系中的课程号不是SC的关键字,但课程号是关系C的关键字,因此课程号是SC的外键,在关系SC中属性课程名的值只能为空或者为C中课程号字段中的某个值。
主键不能为空,并且不可以重复,外键可以为空
3.用户完整性规则:这是针对某一具体数据的约束条件,由应用环境决定。用户定义的完整性规则反映某一具体应用涉及的数据必须满足语义的要求。系统提供定义和检验这类完整性的机制,以便用统一的方法处理它们,不再由应用程序承担这项工作,例如在定义关系模式时,定义关系中的每个字段,对每个字段必须定义该字段的字段名(年龄),字段类型(整型),字段宽度(2位),小数位数(0位),经过这样的定义,在给每条记录的年龄字段输入数据时,可以输入两位整型数据,这就是一种约束,如果我们还想进一步对录入的数据进行约束,以减少数据录入的错误,需要定义一个具体的约束条件(可以写一条规则),把年龄限制在15岁到25岁之间(实际上这是学生的实际年龄范围),以满足实际数据的需要,这就是用户完整性规则,在进行数据操作时由系统负责检验数据的合理性。
总结前面关于关系模型的论述,我们看到,在定义一个关系模式时,需要进行以下三个部分的定义:
1) 数据结构的定义:数据库中的全部数据及其互相联系都被组织成“关系”的形式,并且关系模型的基本数据结构也是关系。
2) 数据操作的定义:关系模型提供一组完备的高级关系运算,以支持数据库的各种操作。关系运算分为关系代数和关系演算两类。
3) 关系模型的三类完整性规则的定义:除了进行数据结构、数据操作的定义,为了确保数据的正确性,还要进行三类完整性规则的定义。
关系代数
关系是一个数学上的概念,是一类集合(以同类型元组为元素的结合),因此关系代数是以集合代数为基础发展起来的,关系是可以进行运算的。如同数字运算的对象和结构都是数字、集合运算的对象和结果都是集合一样,关系运算的对象和结果都是关系。关系运算可以分为两类:
传统的集合运算:这类运算从关系是集合的定义出发,把关系看出集合,则集合的所有运算对关系也是有效的。这类运算有:关系的并集、交集、差集、笛卡尔积。
专门的关系运算:这类运算是用来进行数据库的查询操作。这些运算可以把二维表进行任意的分割和组装,随机地由已有的二维表构造出各式各样用户所需要的二维表。这类运算有:投影、选择、连接、除法运算。
1. 传统的集合运算
传统的集合运算是二元运算。所谓二元运算是指运算的对象为两个,比如加法就是二元运算,进行运算的对象是两个数;二元关系运算是指,两个关系进行运算,结果为一个新关系。
(1)关系的并运算
关系的并运算的运算符号与集合并运算的符号相同,都是∪,关系运算中,只有两个同类型关系的并才有意义。设R1和R2是两个同类型的关系,它们之间的并运算表达式是:R1∪R2,其结果也是同类型的关系,其中R1∪R2的元组或者是R1的元组或者是R2的元组,记为:
R1∪R2={t|t∈R1∨t∈R2}
“∨”这个符号的意思是“或”,即t是属于(∈)R1里面的元组,或者t是属于R2里面的元组。所以这里的表达式的意思是R1∪R2产生了一个新的关系,这个新的关系由元组t组成,t可能是来自R1里面的元组,也可能是来自R2里面的元组。
范例:
设R1、R2为学生实体模式下的两个关系:
则由关系并的定义得R1∪R2
(2)关系交运算
关系交运算符号与集合交运算的符号相同,都是∩,关系运算中,只有两个同类型关系的交才有意义。设R1和R2是两个同类型的关系,它们之间的交运算表达式是:R1∩R2,其结果也是同类型的关系,其中R1∩R2的元组是由既是R1的元组也是R2的元组构成,记为:
R1∩R2={t|t∈R1∧t∈R2}
“∧”这个符号的意思是“且”,即t既是属于(∈)R1里面的元组,同时t也是属于R2里面的元组。所以这里的表达式的意思是R1∩R2产生了一个新的关系,这个新的关系由元组t组成,t既是来自R1里面的元组,也是来自R2里面的元组。
范例:设R1、R2为上述范例中的学生实体模式下的两个关系,求R1∩R2
由关系交运算的定义可得R1∩R2
(3)关系差运算
关系差运算的运算符合与集合差运算的符号相同,都是-,关系运算中,只有两个同类型关系的差才有意义。设R1和R2是两个同类型的关系,它们之间的差运算表达式是R1-R2,其结果也是同类型的关系,其中 R1-R2的元组是由R1的元组,而不是R2的元组构成,记为:
R1-R2={t|t∈R1∧t∉R2}
范例:设R1、R2为上述范例中的学生实体模式下的两个关系,求R1-R2
由关系差运算的定义可得R1-R2
(4)笛卡尔积运算
笛卡尔积是关系这类集合所特有的一种运算,其运算符合是乘法运算符“×”,是一个二元关系运算,两个运算对象可以是同类型的关系也可以是不同类型的关系,若R1是r1元元组的集合,R2是r2元元组的集合,则R1×R2是r1+r2元组的集合,R1×R2的元组(元组对应着二维表中的行)是由R1的分量(分量对应着二维表中的列)和R2的分量组成的,记为:
R1×R2={t|t=(r1,r2)∧r1∈R1∧r2∈R2}
范例:设关系R1、R2分别为学生实体和学生与课程联系的两个关系,求R1×R2。
由笛卡尔积的定义可得R1×R2
从上例中我们看到R1×R2是一个很大的运算,由R1、R2进行笛卡尔积运算得到的新关系是比关系R1、R2大得多的关系。这个运算的运算量大、占有的存储空间大,并且我们看到在R1×R2关系中,四条记录只有第一条记录有实际意义的,而其他的三条记录均没有实际的意义。我们分析第一条记录,又是一条非常有用的信息,反映了李兰同学的所有信息包括她的学号、姓名、性别、年龄、选学的课程名以及所选课程的成绩,这条记录的信息来源于两个关系中,是两个关系的一种连接。
2. 专门的关系运算
专门的关系运算有选择、投影、关系的自然连接和关系的除法,其中关系的选择运算和投影运算是一元运算,是对一个关系进行垂直和水平分解而得到一个关系,而关系的自然连接和关系的除法是二元运算,是把两个关系的信息根据需要组织成一个新关系,是信息的综合,这几种关系的运算都与记录的查询操作有关。
(1)选择运算
关系的选择运算的运算符是“δ”,关系的选择运算是一元运算,运算的对象是关系,运算的结果也是关系,新关系是原关系的子集,记为:
δF(R)={t|t∈R∧F(t)}
在上式中δ表示的是选择运算,F是一个条件表达式,R是进行关系运算的对象,δF(R)是选择运算的结果,其元组首先是关系R的元组,并且这些元组要使得条件F为真,即F(t)为真,因此,选择运算也可叙述为:在关系R中选择满足条件F的记录,组成一个新的关系
范例:设关系R1是实体学生关系模式的一个关系,在关系R1中查找满足年龄小于等于17的学生。
解决这个问题可以使用选择运算来完成。
R=δ年龄≤17(R1)={t|t∈R1∧age≤17}
运算的结果为:
通过这个例子可以看到,关系的选择运算可以用来在一个关系中查找满足条件的记录,由这些满足条件的记录组成的新关系就是选择运算的结果。在这个例子中条件是学生关系中记录的年龄字段的值小于等于17。选择运算是对关系进行水平分割生成用户需要的关系。
(2)投影运算
关系投影运算的运算符是“Ⅱ”,关系投影运算是一元运算,运算的对象是关系,运算的结果也是关系,新关系的元组是在原关系的元组中选出的若干个分量组成的元组,记为:
Ⅱti1,ti2,…tim(R)={t|t=(ti1,ti2,…tim)∧(t1,t2,…,tk)∈R}(其中K>im)
上式中“Ⅱ”是投影运算的运算符,R是投影运算的运算对象,(t1,t2,…,tk)是关系R的元组,(ti1,ti2,…tim)是投影运算所得到新关系的元组。
范例:设S是学生关系模式的一个关系,在某次查询中要求查找每个学生的年龄
解决这个问题,可以使用投影操作:
R=Ⅱ姓名,年龄(S)={t|t=(姓名,年龄)∧(学号,姓名,性别,年龄)∈S}
运算结果R为:
在关系R中查找某个学生的年龄比在关系S中查找某个学生的年龄运算量要小得多。
投影运算是对关系进行垂直分割,产生用户所需要的关系
(3)连接运算
连接运算与投影和选择运算不同,连接运算是将两个关系连接起来,以满足查询任务的要求,连接运算是二元运算。实际上,关系笛卡尔积运算就是一种连接运算,是两个关系的最大连接。笛卡尔积运算的结果,产生了很多没有实际意义的记录,而连接运算是将两个关系连接起来,获得与用户查询有关的新关系。关系的连接有两类;条件连接和自然连接