第三讲 关系数据模型
3.1关系
- 关系模型只包含单一的数据结构——关系
- 现实世界中的实体集和联系集都用关系表示
- 从用户角度来看,关系的逻辑结构就是一张“展平”的二维表
- 关系的概念源于数学中的集合论
- 从集合论的角度给出关系模型的相关概念。域、笛卡尔积、关系
域:
- 域是具有相同类型的值的集合
- 域可以是有限集,也可以是无穷集
- 如果域D为有限集时,则称D中的元素的个数为D的基数,记作|D|
- 例如,证书的集合、实数的集合、字符串的集合、长度不超过20的字符串的集合和几何{0,1}等都是域
笛卡尔积:
- 给定n个域D1,D2,···,Dn(他们不必互不相同)上的笛卡尔积记作:D1×D2×···×Dn,且D1×D2×…×Dn={(d1, d2,…, dn)|d1∈D1∧d2∈D2∧···∧dn∈Dn}
- 每个元素(d1, d2,…,dn)称为一个n-元组(简称元组),而di为元组的第i个分量。若D1,D2,…Dn均为有限集,其基数为|D1|×|D2|×…×|Dn|
- 例如,有三个域:D1={0,1},D2={ a, b,c},D3={D,E},则D1、D2、D3的笛卡尔积为︰
D1× D2×D3={(0, a,D),(0,a,E),(0,b,D),(0, b, E),(0,c,D).(0,c,E),(1,a,D),(1,a,E),(1, b,D),(1, b, E), (1,c,D),(1,c, E)}
其基数为|D1|×|D2|×|D3I= 12
关系:
- 域D1,D2,···,Dn上的关系r是笛卡尔积D1×D2×···×Dn的任意子集。n个域上的关系称为n-元关系,“元”又称目或度
- 例如,(0,a,D),(0, b, E), (1,c,E)是上面提到的笛卡尔积D1×D2×D3的一个子集,它可以看作域D1、D2和D3上的一个三元关系
关系的另一种表示形式:
- 关系可以使用二维表来表示
- 每个表都有一个惟一的名字(关系名),表的每一列对应的分量称为属性,表的第一行是表头,给出各列的属性名,其余每行对应于一个元组,每个元组都代表一个实体或联系
- 关系的这种直观表示允许我们对关系附加一些语义
- 例如,我们可以通过属性名解释关系元组的语义,可以通过属性的语义定义关系的码,定义关系的完整性约束
关系的性质: - 关系是笛卡尔积的子集,即元组的集合,所以,关系中行的次序不重要,且关系(表)中不能包含两个相同的元组(行)
- 用二维表表示关系使得我们可以以任意列次序显示关系,或者说列的顺序不重要
- 在关系数据库中,任何有意义的关系都要满足一定的约束条件,这些约束都是语义约束
- 除了语义约束外,对关系的限制主要有两点,第一,在关系数据库中,只考虑有限关系;第二,关系的每个属性都必须是元子
3.2关系的码
超码、候选码、主码
- 考虑职工关系,其模式如下︰EMPS (Eno, Ename, Esex, Eage, Eaddress, Dname, Esalary)Eno是EMPS关系的码,因为每位职工都有惟一的编号
- 包含了Eno的任意属性集则是超码,如,{Eno, Ename},该属性集也能惟一地确定每位职工
- 如果认为家庭住址相同的两位职工不可能同名同姓,则{Ename,Eaddress}也是EMPS的码
码:
- 设K是关系R的属性集,如果K能唯一地标识一个元组,而其真子集不能,则K是R的码
- 设K是R的码,K属于X,则X是关系R的超码
主码: - 通常,当一个关系具有多个码时,应当选择其中一个作为唯一识别关系元组的码,称为主码
- 主码用于表示由多个码中选出的作为唯一识别关系元组的码,而所有的码又称为候选码
- 码中的属性成为主属性,而不在任何码中出现的属性成为非主属性
- 例如Eno和{Ename,Eaddress}都是EMPS的候选码,则Eno、Ename和Eaddress都是主属性,而Esex,Eage, Dname, Esalary是非主属性。定义关系时可以选择一个作为EMPS的主码,比如选择Eno为主码
3.3关系模式
- 关系的型: 关系模式看作类型。关系的型用关系模式刻画
- 关系的值: 关系就是具有特定类型的变量。关系的值即关系在某一时刻的快照,又称关系实例
关系模式概念对应于程序设计语言中的类型概念,是对关系型的描述,可以表示为R(U,D,DOM,F)。其中R为关系模式名,U为关系模式的诸属性,D为属性对应的域,DOM为U到D的映射,F为属性间的数据依赖集定义
在实际的关系数据库中进行某个关系的定义时给出各个属性的数据类型、取值范围和完整性约束
--下面的语句创建教师表Teachers
CREATE TABLE Teachers
(Tno CHAR(7) PRIMARY KEY,
Tname CHAR(10) NOT NULL,
Sex CHAR(2) CHECK(Sex='男'OR'女'),
Birthday DATE,
Title CHAR(6),
Dno CHAR(4),
FOREIGN (Dno) REFERENCES Departments(Dno));
- D和DOM是定义表时才考虑的
- 目前还不用考虑属性之间的数据以来F
- 因此关系模式简记为R(A1,A2,…,An),或者简写为R(U)
3.4从E-R模型到关系模型
ER图向关系模式转换包括属性处理、实体集处理和联系集处理
派生属性的处理:转换时我们忽略派生属性
复合属性的处理:忽略复合属性本身,而直接考虑它的成分属性
多值属性的处理:为每个多值属性M创建一个关系Rm
- 如果多值属性M时实体集E的属性,K是E的主码,则关系Rm的属性由M和K组成
- 如果多值属性M是联系集R的属性,并且R设计实体集E1,…,En,他们的主码分别是K1,…,Kn,则关系Rm的属性由M和K1,…,Kn组成
- 例如,Phones是实体集Departments的多值属性。我们为它创建一个关系。由于Phones还是复合属性,我们需要队它做“展平”处理:直接使用它的成分属性Office和Phone#。实体集Departments的码是Dno。这样,由多值属性Phones得到的关系模式为:Phones(
phone#,Dno,Office )
实体集的处理:
- 强实体集处理:每个强实体集用一个关系表示。实体集名可以作为关系名,实体集的全部属性构成关系的属性
- 弱实体集处理:每个弱实体集用一个关系表示。弱实体集名可以作为关系名,弱实体集存在依赖的标识实体集的主码和弱实体集的全部属性构成关系的属性
联系集的处理:
- 联系是一对一的,则可以和任意一端实体集转换得到的关系模式合并
- 联系时一对多的,则和多段实体集转换得到的关系模式合并
- 联系是多对多的,则该联系集转换成独立的关系模式
例子:
由上图E-R图中
强实体集得到如下关系模式:
- Departments(Dno, Dname)
- Teachers(Tno, Tname, Sex, Birthday, Title)
- Students(Sno, Sname, Sex, Birthday, Enrollyear, Speciality)
- Courses(Cno,Cname, Period, Credit)
一对一和一对多联系的转换:
- Departments(Dno, Dname,Dheadno)
- Teachers(Tno, Tname,Sex, Birthday, Title, Dno)
- Students(Sno, Sname, Sex, Birthday, Enrollyear, Speciality, Dno)
多对多联系得到的关系模式:
- Teaches (Tno,Cno)
- SC(Sno,Cno,Grade)
- Evalues (Sno,Tno, Cno, Escore)
合并后得到的关系模式:
- Departments(Dno, Dname, Dheadno)
- Teachers(Tno, Tname,Sex, Birthday,Title, Dno)
- Students(Sno, Sname, Sex, Birthday, Enrollyear, Speciality, Dno)
- Courses(Cno, Cname, Period, Credit)
- Teaches (Tno.Cno)
- SC(Sno,Cno,Grade)
- Evalues (Sno,Tno,Cno,Escore)Phones (Phone#,Dno,Office)
3.5关系的完整性约束
关系的完整性分类包括:实体完整性、参照完整性和用户自定义的完整性
空值:
- 空值意指“缺失的值”
- 允许元组在某些属性上取空值非常方便,商品化DBMS也都支持空值。例如,关系Departments表中,一个元组在Dheadno上可能取空值,表示该院系目前没有院长,它可能是新成立的院系,或者因为人事调动目前还没有院长
- 需要注意的是,空值是未知的值,它不能参与运算,即便两个空值比较,其结果只能是“不知道”。例如,两个人在“性别”属性上都取空值。不能说这两个人性别一样对于空值,可以问“元组t在属性A上值是空值吗?”
**实体完整性规则:**关系R的所有元组在主码上的值必须唯一,并且在主码的任何属性上都不能取空值
例子:
- 选修关系模式SC(
Sno,Cno,Grade),它的主码是{Sno, Cno}。按照实体完整性规则要求有以下约束: - SC的任何关系实例的所有元组在{Sno,Cno}上的值必须唯一,否则某个给定的学生在给定的课程上将有两个成绩;
- SC的所有关系实例的任何元组都不能在Sno上取空值,否则我们记录的成绩不知道是哪位学生的成绩;
- SC的所有关系实例的任何元组也不能在Cno上取空值,取空值意味着一个学生不知道选修了哪门课程,有一个成绩,这是不符合实际意义的
参照完整性:
- Students (Sno,Sname, Sex, Birthday, Enrollyear, Speciality, Dno)
- Courses (Cno, Cname, Period,Credit)
- SC(Sno,Cno,Grade)
- 这三个关系之间也存在引用,关系SC中“Sno”必须是Students中一个已有的学生,关系SC中的“Cno"必须是Courses中一个已有的课程
外码:
- 如果FK是关系R的属性集,并且不是R的码,但是FK与关系R’的主码K’对应,则称FK是关系R的外码。其中R是参照关系,R’是被参照关系(R与R’不一定是不同的关系),并称FK参照R’的主码K’
参照完整性规则:
参照完整性规则︰如果属性集FK是关系R的外码,它参照关系S的主码Ks,则R的任何元组在FK上的值等于s的某个元组在主码Ks上的值,或者为空值
用户自定义的完整性规则:
用户定义的完整性反映特定的数据库所涉及的数据必须满足的语义约束条件。由于不存在一般性规则,这些约束条件必须由用户根据实际问题的语义指定
- 例如:在教务管理数据库中,我们可以定义如下约束条件:学生的成绩必须是0到100之间的整数;学生的累积不及格课程不得超过5门;性别的取值只能是男、女和空值;教师和学生的姓名都不能取空值等
3.6关系代数的五种基本运算
- 附加运算: 交、除、连接、自然连接
- 基本运算:选择、投影、并、差、笛卡尔积
选择运算:
设R是一个关系。涉及(1)运算对象,他们是常量或属性名;(2)算数比较运算符< ≦ = ≧ >和≠;(3)逻辑运算符∧ ∨和﹁。
注意:选择的结果形成一个新的关系,它与R具有相同的属性。
投影运算:
设R是一个n元关系,A1,…,Ak ( k<n )都是R的属性。关系R在属性A1,…,Ak上的投影记作Π(R),它是满足如下条件的k-元组(a1, … ak)的集合∶存在R中的元组u,对于1 ≤ i ≤ k ,u在属性Ai上的值等于ai。设u是R的元组,u[A1,…,Ak]表示u在属性A1,…,Ak上的值形成的k元组,则Π(R)={t|(∃u)(u∈R∧t=u[A1,… ,Ak])}
并运算:
设R和S是具有相同属性的关系。关系R和S的并记作R∪S,它是属于R,或属于S,或属于二者的所有元组的集合。采用集合论的记号,我们有R∪S={t|t∈R∨t∈S}
差运算:
设R和S是具有相同属性的关系。关系R和S的差记作R-S,它是属于R但不属于S的所有元组的集合。采用集合论的记号,我们有R -S={t|t∈R∧t∈/ S}
笛卡尔积:
设R和S分别为n元和m元关系。R和S的笛卡尔积记作RxS,它是一个(n+m)-元关系,其每个元组的前n个分量是关系R的一个元组,后m个分量是关系S的一个元组。如果属性A同时出现在R和S中,则RxS中分别用R.A和S.A表示,以示区别。设u=(u1,…, un),v=(v1,…,vm)。u和v的串接定义为u⌒v=(u1,…, un,v1,…,vm)。于是,
RxS={t|(∃u) (∃v)(u∈R ∧ v∈S∧t=u⌒v}
3.7附加的关系运算
- 附加运算: 交、除、连接、自然连接
交运算:
设R和S是具有相同属性的关系。关系R和S的交运算记作R∩S它是既属于R,又属于S的所有元组的集合。R∩S相当于R-(R-S)的缩写
除运算:
- 设R是n元关系,S是m元关系,其中n>m,并且S≠∅
- 设s的所有属性都在R中
- 设R的属性为A1,…,An-m,An-m+1,…,An。S的属性为An-m+1,…, An
- 关系R和S的除运算记作R÷S,其结果是A1、…,An-m上的关系
- 关系R÷S是满足如下条件的(n-m)-元组(a1…an-m)的集合∶对于S中的每个元组(an-m+1,…,an),元组(a1,…,an-m,an-m+1,…,an)在R中条件S≠∅可以去掉,此时,R÷S退化为R在属性A1,…,An-m上的投影
连接运算:
设A是关系R的属性,B是关系S的属性,θ是算术比较运算符(<、≤、=、≥、>或≠)。关系R和S在属性A和B上的θ-连接记作【图1】(如果A仅为R的属性,B仅为S的属性,R.AθS.B可以简写为AθB ) ,它是满足如下条件的元组t的集合∶存在u∈R ,v∈S使得u[A]和v[B]满足算术比较关系θ,并且t=。容易明白,【图1】 = 【图2】,R.AθS.B是连接条件。当θ为等号(=)时,我们称它为等值连接
自然连接运算:
自然连接要求在R和S的所有共同属性上做等值连接,然后再投影去掉重复属性。设R和S的共同属性为C1,…,Ck,R的其它属性为A1,…,Ai,S的其它属性为B1,…,Bj;,则R和S的自然连接为︰
注意∶
①自然连接是唯一依赖于关系属性名的运算
②当R和S不含共同属性时,自然连接就退化为笛卡尔积
③尽管自然连接和等值连接都是根据属性值相等进行连接,但它们有明显区别,自然连接在同名属性上进行相等比较,并投影去掉重复属性
3.8关系代数表达查询
关系代数表达式形式地定义如下∶
(1)数据库中的关系和常量关系(显式给出的元组集合)是关系代数表达式
(2)如果E是关系代数表达式,则σF(E)也是,其中F是选择条件
(3)如果E是关系代数表达式,X是E中的属性列表,则Πx(E)是关系代数表达式
(4)如果E1和E2是关系代数表达式,则E1∪E2、E1-E2、E1×E2、E1∩E2、E1÷E2、E1连接FE2和E1自然连接E2都是关系代数表达式
下面,用一些例子说明如何用关系代数表达式表示查询。这些例子涉及如下关系︰
- Departments (
Dno, Dname, Dheadno) - Teachers (
Tno, Tname,Sex,Age, Title, Dno) - Students (
Sno,Sname, Sex, Age, Speciality, Dno) - Courses (
Cno, Cname,Period, Credit) - Teaches (
Tno,Cno, TCscore) - SC (
Sno,Cno,Grade)
1.列出系编号为MA(数学系)的所有学生的详细信息
2.列出所有课程的课程号、课程名和学分
3.列出年龄不超过45岁的所有副教授的姓名、性别和年龄。
4.列出选修了课程号为CS201的课程的所有学生的学号和姓名。
5.列出每个学生选修的每门课程的成绩,要求列出的学号、姓名、课程名和成绩。
6.列出所有选修了全部课程的学生的学号和姓名。