数据库系统工程师03关系模型.docx
《数据库系统工程师03关系模型.docx》由会员分享,可在线阅读,更多相关《数据库系统工程师03关系模型.docx(21页珍藏版)》请在冰豆网上搜索。
数据库系统工程师03关系模型
第三章关系模型(逻辑结构设计)
关系理论是建立在集合代数理论基础上的,有着坚实的数学基础。
E.F.Codd于70年代初提出关系数据理论,他因此获得1981年的ACM图灵奖。
早期代表系统:
SystemR:
由IBM研制。
INGRES由加州Berkeley分校研制。
目前主流的商业数据库系统:
Oracle,Informix,Sybase,SQLServer,DB2,
Access,Foxpro,Foxbase。
3.1关系基本概念
关系理论是以集合代数为基础的。
3.1.1域(Domain):
一组值的集合,这组值具有相同的数据类型。
如整数的集合、字符串的集合、全体学生的集合。
用D表示。
3.1.2笛卡尔积(Car’tesianProduct)
一组域D1,D2,…,Dn的笛卡尔积为:
D1×D2×…×Dn={(d1,d2,…,dn)|di∈Di,i=1,…,n}。
笛卡尔积的每个元素(d1,d2,…,dn)称作一个n元组(n-tuple)。
元组的每一个值di叫做一个分量(component)。
若Di为有限集,其基数为mi(i=1,2,3…n),则笛卡尔积的基数为
笛卡尔积可表示为一个二维表,表中的每行对应一个元组,表中每列对应一个域。
例:
D1为教师集合(T)={t1,t2}
D2为学生集合(S)={s1,s2,s3}
D3为课程集合(C)={c1,c2}
则D1×D2×D3是个三元组集合,元组个数为2×3×2,是所有可能的(教师,学生,课程)元组集合。
笛卡尔积可表为二维表的形式:
T
S
C
t1
s1
c1
t1
s1
c2
t1
s2
c1
…
…
…
t2
s3
c2
表中的行表示一个元组,列表示一个域。
3.1.3关系
(1)笛卡尔积D1×D2×…×Dn的子集叫做在域D1,D2,…,Dn上的关系,用R(D1,D2,…,Dn)表示。
(2)R是关系的名字,n是关系的度或目。
(3)关系是笛卡尔积中有意义的子集。
关系也可以表示为二维表。
T
S
C(属性)
t1
s1
c1
(元组)t1
s2
c2
t2
s3
c1
(4)关系的性质:
列是同质的,即每一列中的分量来自同一域,是同一类型的数据。
如TEACH(T,S,C)={(t1,s1,c1),(t1,t2,c1)}是错误的。
(5)不同的列可来自同一域,每列必须有不同的属性名。
如P={t1,t2,s1,s2,s3},C={c1,c2},则TEACH不能写成TEACH(P,P,C),还应写成TEACH(T,S,C)。
(6)行列的顺序无关紧要。
任意两个元组不能完全相同(集合内不能有相同的两个元素)。
每一分量必须是不可再分的数据。
满足这一条件的关系称作满足第一范式(1NF)的。
3.2关系模式
数据结构:
单一的数据结构——关系。
实体集、联系都表示成关系。
DEPT(D#,DN,DEAN)
S(S#,SN,SEX,AGE,D#)
C(C#,CN,CREDIT)
PROF(P#,PN,D#,SAL)
SC(S#,C#,SCORE)
TEACH(P#,C#)
3.2.1候选码(CandidateKey)
关系中的某一属性或属性组的值能唯一地标识一个元组,称该属性或属性组为候选码
如DEPT中的D#,DN都可作为候选码。
任何一个候选码中的属性称作主属性。
如SC中的S#,C#。
3.2.2主码(PrimaryKey)
进行数据库设计时,从一个关系的多个候选码中选定一个作为主码。
如可选定D#作为DEPT的主码。
3.3.3外部码(ForeignKey)
关系R中的一个属性组,它不是R的码,但它与另一个关系S的码相对应,则称这个属性组为R的外部码。
如S关系中的D#属性。
3.3.4关系模式
关系的描述称作关系模式,包括关系名、关系中的属性名、属性向域的映象、属性间的数据依赖关系等,记作R(A1,A2,…,An)。
属性向域的映象一般直接说明为属性的类型、长度等。
某一时刻对应某个关系模式的内容(元组的集合)称作关系。
关系模式是型,是稳定的。
关系是某一时刻的值,是随时间不断变化的。
3.3.5关系数据库
其型是关系模式的集合,即数据库描述,称作数据库的内涵(Intension)。
其值是某一时刻关系的集合,称作数据库的外延(Extension)。
3.3.6关系操作
关系操作是集合操作,操作的对象和结果都是集合,是一次一集合(Set-at-a-time)的方式,而非关系型的数据操作方式是一次一记录(Record-at-a-time)。
关系操作可以用关系代数和关系演算两种方式来表示,它们是相互等价的。
如用关系代数来表示关系的操作,可以有选择、投影、连接、除、交、差、并等。
3.3.7关系模式的完整性
(1)实体完整性:
A、关系的主码中的属性值不能为空值。
B、空值:
不知道或无意义。
C、意义:
关系对应到现实世界中的实体集,元组对应到实体,实体是相互可区分的,通过主码来唯一标识,若主码为空,则出现不可标识的实体,这是不容许的。
(2)参照完整性:
A、如果关系R2的外部码Fk与关系R1的主码Pk相对应,则R2中的每一个元组的Fk值或者等于R1中某个元组的Pk值,或者为空值。
B、意义:
如果关系R2的某个元组t2参照了关系R1的某个元组t1,则t1必须存在。
(3)用户定义的完整性:
用户针对具体的应用环境定义的完整性约束条件。
如S#要求是8位整数,SEX要求取值为“男”或“女”。
(4)系统支持
A、实体完整性和参照完整性由系统自动支持。
B、系统应提供定义和检验用户定义的完整性的机制。
3.3关系数据语言概述
3.3.1抽象的查询语言
(1)关系代数:
用对关系的运算来表达查询,需要指明所用操作。
(2)关系演算:
用谓词来表达查询,只需描述所需信息的特性。
元组关系演算:
谓词变元的基本对象是元组变量。
域关系演算:
谓词变元的基本对象是域变量。
3.3.2具体系统中的实际语言
SQL:
介于关系代数和关系演算之间,由IBM公司在研制SystemR时提出的。
QUEL:
基于Codd提出的元组关系演算语言ALPHA,在INGRES上实现。
QBE:
基于域关系演算,由IBM公司研制。
3.3.3关系数据语言的特点
(1)一体化:
一般关系系统的数据语言都同时具有数据定义、数据操纵和数据控制语言,而不是分为几个语言。
对象单一,都是关系,因此操作符也单一。
而非关系型系统,如DBTG,有对记录的操作,有对系的操作。
(2)非过程化:
用户只需提出“做什么”,无须说明“怎么做”,存取路径的选择和操作过程由系统自动完成。
(3)面向集合的存取方式:
操作对象是一个或多个关系,结果是一个新的关系(一次一关系)。
非关系系统是一次一记录的方式。
3.4关系代数
3.4.1关系代数
(1)基本运算
A、一元运算:
选择、投影、更名。
B、多元运算:
广义笛卡儿积、并、集合差。
(2)其它运算:
集合交、自然连接、除、赋值。
(3)扩展运算:
广义投影、外连接、聚集。
(4)修改操作:
插入、删除、更新。
3.4.2一些标记
给定关系模式R(A1,A2,…,An),设R是它的一个具体的关系,t∈R是关系的一个元组。
分量:
设t∈R,则t[Ai]表示元组t中相应于属性Ai的一个分量。
属性列:
A={Ai1,Ai2,…,Aik}⊆{A1,A2,…,An},称A为属性列或域列。
t[Ai]=(t[Ai1],t[Ai2],…,t[Aik])。
3.4.3选择
(1)基本定义:
在关系R中选择满足给定条件的元组(从行的角度)。
σF(R)={t|t∈R,F(t)=‘真’}
F是选择的条件,∀t∈R,F(t)要么为真,要么为假。
(2)F的形式:
由逻辑运算符连接算术表达式而成。
逻辑表达式:
∧(与),∨(或),⌝(非)
算术表达式:
XθY
X,Y是属性名、常量、或简单函数。
θ是比较算符,θ∈{>,≥,<,≤,=,≠}
例:
找年龄不小于20的男学生。
σAGE≥20∧SEX=‘male’(S)
3.4.4投影
(1)定义:
从关系R中取若干列组成新的关系(从列的角度)。
∏A(R)={t[A]|t∈R},A⊆R
投影的结果中要去掉相同的行。
例:
A
B
C
D
a
B
c
d
e
F
g
h
i
B
c
l
∏B,C(R)
结果是:
例:
找001号学生所选修的课程号:
∏C#(σS#=001(SC))
3.4.5并运算
(1)定义:
所有至少出现在两个关系中之一的元组集合。
RUS={r|r∈Rvr∈S}
(2)两个关系R和S若进行并运算,则它们必须是相容的:
A、关系R和S必须是同元的,即它们的属性数目必须相同。
B、对i,R的第i个属性的域必须和S的第i个属性的域相同。
例:
求选修了001号或002号课程的学生号。
方案1:
∏S#(σC#=001vC#=002(SC))
方案2:
∏S#(σC#=001(SC))∪∏S#(σC#=002(SC))
3.4.6差运算
(1)定义:
所有出现在一个关系而不在另一关系中的元组集合。
R-S={r|r∈R∧r∉S}
R和S必须是相容的。
例:
求选修了001号而没有选002号课程的学生号。
∏S#(σC#=001(SC))-∏S#(σC#=002(SC))
3.4.8更名运算
(1)定义:
给一个关系表达式赋予名字ρx(E)
返回表达式E的结果,并把名字x赋给E。
ρx(A1,A2,⋯,An)(E)
返回表达式E的结果,并把名字x赋给E,同时将各属性更名为A1,A2,..An。
关系被看作一个最小的关系代数表达式,可以将更名运算施加到关系上,得到具有不同名字的同一关系。
这在同一关系多次参与同一运算时很有帮助。
3.4.7广义笛卡尔积运算
(1)元组的连串(Concatenation):
若r=(r1,…,rn),s=(s1,…,sm),则定义r与s的连串为:
rs=(r1,…,rn,s1,…,sm)
(2)定义:
两个关系R,S,其度分别为n,m,则它们的笛卡尔积是所有这样的元组集合:
元组的前n个分量是R中的一个元组,后m个分量是S中的一个元组。
R⨯S={rs|r∈R∧s∈S}
R⨯S的度为R与S的度之和,R⨯S的元组个数为R和S的元组个数的乘积。
例:
求数学成绩比王红同学高的学生姓名。
∏S.姓名(σR.成绩姓名
课程
成绩
张三
物理
93
王红
数学
86
张三
数学
89
R.姓名
R.课程
R.成绩
S.姓名
S.课程
S.成绩
王红
数学
86
张三
物理
93
王红
数学
86
王红
数学
86
王红
数学
86
张三
数学
89
3.4.8交运算
(1)定义:
所有同时出现在两个关系中的元组集合。
R⋂S={r|r∈R∧r∈S}
交运算可以通过差运算来重写:
R⋂S=R-(R-S)
例:
求选修了001号和002号课程的学生号。
∏S#(σC#=001(SC))∩∏S#(σC#=002(SC))
3.4.9θ连接
(1)定义:
从两个关系的广义笛卡儿积中选取给定属性间满足一定条件的元组。
RS={rs|r∈R∧s∈S∧r[A]θS[B]}
θ为算术比较符,为等号时称为等值连接,θ为>时,为大于连接,θ为<时,为小于连接。
例:
R
A
B
C
1
2
3
4
5
6
7
8
9
S
D
E
3
1
6
2
RS
BA
B
C
D
E
1
2
3
3
1
1
2
3
6
2
4
5
6
6
2
例:
求数学成绩比王红同学高的学生。
∏S.姓名((σ课程=数学∧姓名=王红(R))(σ课程=数学ρS(R)))
R.成绩(2)自然连接:
从两个关系的广义笛卡尔积中选取在相同属性列B上取值相等的元组,并去掉重复的列。
RS={rs[B]|r∈R∧s∈S∧r[B]=S[B]}
自然连接与等值连接的不同:
自然连接中相等的分量必须是相同的属性组,并且要在结果中去掉重复的属性,而等值连接则不必。
例:
求001号学生所在系的名称。
∏DN(σS#=001(S)DEPT)
(3)当R与S无相同属性时,RS=R×S。
3.4.10除运算
(1)除运算
给定关系R(X,Y)和S(Y,Z),其中X,Y,Z为属性组。
R中的Y与S中的Y可以有不同的属性名,但必须出自相同的域集。
R与S的除运算得到一个新的关系P(X),P是R中满足下列条件的元组在X属性列上的投影:
元组在X上分量值x的象集YX包含S在Y上投影的集合:
记做:
R÷S={tr[Z]|tr∈R∧∏y(S)
YX}
其中YX为x在R中的象集,x=tr[Z]。
例:
R
A
B
C
a1
b1
c2
a2
b3
c7
a3
b4
c6
a1
b2
c3
a4
b6
c6
a2
b2
c3
a1
b2
c1
S
B
C
D
b1
c2
d1
b2
c1
d1
b2
C1
d2
(1)象集(ImageSet)
关系R(X,Z),X,Z是属性组,x是X上的取值,定义x在R中的象集为:
Zx={t[Z]|t∈R∧t[X]=x}
从R中选出在X上取值为x的元组,去掉X上的分量,只留Z上的分量。
XZ
姓名
课程
张三
物理
王红
数学
张三
数学
x=张三
Zx
课程
物理
数学
(2)除运算
例:
3.4.11赋值运算
为使查询表达简单、清晰,可以将一个复杂的关系代数表达式分成几个部分,每一部分都赋予一个临时关系变量,该变量可被看作关系而在后面的表达式中使用。
临时关系变量←关系代数表达式。
赋值给临时关系变量只是一种结果的传递,而赋值给永久关系则意味着对数据库的修改。
例:
R÷S=∏X(R)-∏X(∏X(R)⨯∏Y(S)-R)用赋值重写为:
temp1←∏X(R),
temp2←∏X(temp1⨯∏Y(S)-R)
result←temp1-temp2
例:
求选修了其选修课为001号课程的学生名。
(哪个效率高?
)
方案1:
∏SN(σPC#=001(SCCS))
方案2:
∏SN(σPC#=001(C)SCS))
例:
求未选修001号课程的学生号。
(哪些正确?
)
方案1:
∏S#(σC#≠001(SC))
方案2:
∏S#(S)-∏S#(σC#=001(SC))
例:
求仅选修了001号课程的学生号。
选修001号课程的学生-仅选001号课程之外的学生
=∏S#(σC#=001(SC))-∏S#(SC-σC#=001(SC))
=∏S#(σC#=001(SC))-∏S#(σC#≠001(SC))
3.4.12广义投影
(1)定义:
在投影列表中使用算术表达式来对投影进行扩展。
∏F1,F2,…,Fn(E)F1,F2,…,Fn是算术表达式。
例:
求教工应缴纳的所得税。
∏P#,SAL*5/100(PROF)
ρp#,INCOME-TAX(∏P#,SAL*5/100(PROF))
3.4.13外连接
(1)定义:
为避免自然连接时因失配而发生的信息丢失,可以假定往参与连接的一方表中附加一个取值全为空值的行,它和参与连接的另一方表中的任何一个未匹配上的元组都能匹配,称之为外连接。
外连接=自然连接+失配的元组
(2)外连接的形式:
左外连接、右外连接、全外连接。
左外连接=自然连接+左侧表中失配的元组。
右外连接=自然连接+右侧表中失配的元组。
全外连接=自然连接+两侧表中失配的元组。
例:
列出所有老师的有关信息,包括姓名、工资、所教授的课程。
3.4.14聚集函数
(1)定义:
求一组值的统计信息,返回单一值。
使用聚集的集合可以是多重集,即一个值可以重复出现多次。
如果想去除重复值,可以用连接符‘-’将‘distinct’附加在聚集函数名后,如sum-distinct。
A、sum:
求和:
求全体教工的总工资。
sumSAL((PROF))
求001号学生的总成绩。
sumSCORE(σS#=001(SC))
B、avg:
求平均:
求001号同学选修课程的平均成绩。
AvgSCORE(σS#=001(SC))
C、count:
计数:
求001号同学选修的课程数。
countC#(σS#=001(SC))
求任课老师的总数。
count-distinctP#(PC)
D、max:
求最大值。
min:
求最小值。
求学生选修数学的最高成绩。
MaxSCORE(σCN=数学(C)SC))
(2)分组
将一个元组集合分为若干个组,在每个分组上使用聚集函数。
属性下标G聚集函数属性下标(关系)
分组运算G的一般形式
G1,G2,...,GnGF1,A1,F2,A2,…,Fm,Am(E)
Gi是用于分组的属性,Fi是聚集函数,Ai是属性名。
G将E分为若干组,满足:
A、同一组中所有元组在G1,G2,...,Gn上的值相同。
B、不同组中元组在G1,G2,...,Gn上的值不同。
例:
求每位学生的总成绩和平均成绩。
S#GsumSCORE,avgSCORE(SC)
3.4.15数据库修改
(1)删除
将满足条件的元组从关系中删除。
r←r-E
是对永久关系的赋值运算。
例:
删除001号老师所担任的课程。
PC←PC-σPC#=001(PC)
删除没有选课的学生。
S←S-(∏S#(S)-∏S#(SC))S
(2)插入
插入一个指定的元组,或者插入一个查询结果。
r←r⋃E
例:
新加入一个老师
PC←PC⋃{(P07,“周正”,750,D08)}
加入计算机系学生选修“数学”的信息。
SC←SC⋃∏S#(SσDN=计算机系(DEPT))⨯∏C#(σCN=数学(C))
(3)更新
利用广义投影改变元组的某些属性上的值。
r←∏F1,F2,…,Fn(r)
例:
给每位老师上调10%的工资。
PROC←∏P#,PN,SAL←SAL*1.1,D#(PROC)
对工资超过800的老师征收5%所得税。
PC←(∏P#,PN,SAL←SAL*0.95,D#(σSAL>800(PC)))∪(∏P#,PN,SAL,D#(σSAL≤800(PC))
3.5视图
3.5.1定义
视图是命名的、从基本表中导出的虚表,它在物理上并不存在,存在的只是它的定义。
视图中的数据是从基本表中导出的,每次对视图查询都要重新计算。
createviewview_nameas<查询表达式>
视图之上可以再定义视图。
视图Vs临时关系变量。
例:
给出老师所教授课程的信息。
createviewp_courseas∏PN,CN(PROFPCC)
给出李明老师所教授的课程名称。
σPN=李明(p_course)
3.5.2视图更新
(1)信息缺失
createviewp_salaryas∏PN,SAL(PROF)
p_salary←p_salary∪{(李明,800)}
往PROF中加入元组(李明,800),缺P#信息。
(2)信息歧义
createviewp_deanas∏PN,DEAN(PROFDEPT)
p_dean←∏PN,DEAN←王之(σPN=李明(p_dean))
是将李明所在系的系主任改为王之呢,还是将李明调到王之任系主任的系中?
(3)实体化视图
a)视图的计算结果被实际存储起来。
b)优点:
查询迅速。
c)缺点:
一致性维护。
d)应用场合:
数据仓库。
(4)视图的优点
a)个性化服务:
简化了用户观点,使不同用户可以从不同角度观察同一数据。
b)安全性:
“知必所需”,限制用户数据的访问范围。
c)逻辑独立性:
视图作为基本表与外模式之间的映象。