软件设计师——09 数据库技术基础
1 基本概念
1.1 数据库与数据库系统
- **数据库系统(DBS,DataBase System)**由数据库、硬件、软件和人员组成;
- 数据库管理系统(DBMS,DataBase Management System)
- 负责对共享数据进行有效组织、管理和存取;
- 功能:数据定义(DDL)、数据操纵(DML)、数据库运行管理、数据组织存储管理、数据库建立维护、网络通信等;
- 分类:关系数据库系统(RDBS)、面向对象的数据库系统(OODBS)、对象关系数据库系统(ORDBS);
1.2 数据库的三级模式结构
-
内模式(存储模式):描述数据物理结构和存储方式,是数据在数据库内部的表示方式,定义所有的内部记录类型、索引、文件组织方式及数据控制方面的细节。一个数据库只有一个内模式,对应数据库中的物理存储文件;
-
概念模式(模式):描述数据库全部数据的逻辑结构和特征,一个数据库只有一个概念模式,对应数据库中的基本表;
-
外模式(用户模式或子模式):是用户与数据库系统的接口,描述用户用到的部分数据,一个数据库可有多个外模式,对应数据库中的视图;
-
数据库的两级映像与数据独立性:
-
模式/内模式映像:实现概念模式和内模式的相互转换,是表与数据物理存储的映射,保障数据物理独立性,即数据物理存储改变时,应用程序无需改变;
-
外模式/模式映像:实现外模式和概念模式的相互转换,是视图与表的映射,保障数据逻辑独立性,即数据逻辑结构改变时,应用程序无需改变;
-
1.3 数据库设计的基本步骤
-
用户需求分析:分析数据存储要求,产出数据流图、数据字典、需求说明书,获取用户的信息、处理、系统要求;
-
概念结构设计:设计E-R图(实体-联系图),步骤包括选择局部应用、逐一设计分E-R图、合并分E-R图,合并时存在属性、命名、结构冲突;
- 属性冲突。同一属性可能会存在于不同的分E-R图中;
- 命名冲突。相同意义的属性,在不同的分E-R图上有着不同的命名,或是名称相同的属性在不同的分E-R图中代表着不同的意义;
- 结构冲突。同一实体在不同的分E-R图中有不同的属性,同一对象在某一分E-R图中被抽象为实体,而在另一分E-R图中又被抽象为属性;
-
逻辑结构设计:将E-R图转换成关系模式,步骤有确定数据模型、转换为指定数据模型、确定完整性约束和用户视图;
-
物理结构设计:确定逻辑模型在计算机中的具体实现方案,包括数据分布、存储结构和访问方式;
-
数据库实施阶段:依据逻辑和物理设计结果建库,编制调试应用程序,组织数据入库并试运行;
-
数据库运行和维护阶段:对投入运行的数据库应用系统不断评价、调整与修改;
1.4 大数据
- 具有4V特征,即大量化(Volume)、多样化(Variety)、价值密度低(Value)、快速化(Velocity)。
2 数据模型
2.1 基本概念
- 数据模型是对现实世界数据特征的抽象,常用的分为概念数据模型和基本数据模型
- 概念数据模型(信息模型):从用户视角对数据和信息建模,是用户与数据库设计人员交流的语言,主要用于数据库设计,典型代表是实体-联系模型(E-R模型)
- 基本数据模型:从计算机系统视角对数据建模,是现实世界数据特征的抽象,用于数据库管理系统(DBMS)的实现
2.2 数据模型的三要素
- 数据结构
- 数据操作
- 数据的约束条件
2.3 E-R模型
-
E-R模型,即实体-联系模型,用于描述现实世界的概念模型,贴近人的思维方式,易理解,包含实体、联系和属性三个主要概念;
-
实体:用矩形表示,由一组属性(候选键、主键、外键等)表示,实体集是具有相同属性的实体集合;
- 候选键能唯一标识一行元组的属性集;
- 主键是从候选键中选的一个;
- 外键是在另一个关系模式中充当主键的属性;
-
联系:用菱形表示,是实体集之间的对应关系,分为一对一(1:1)、一对多(1:n或1:*)、多对多(m:n或*😗);
-
一对一联系:实体集A中的一个实体最多与实体集B中的一个实体联系,反之亦然;
如一个学校只有一名校长,每位校长只在一个学校工作
-
一对多联系:实体集A中的一个实体可与实体集B中的多个实体联系;
如一个学校有很多学生,每个学生只在一个学校上课
-
多对多联系:实体集A中的多个实体可与实体集B中的多个实体联系,这种联系会产生新的关系模式,其属性由两个实体的主键及自身特有属性组成;
如一名学生可以选修多门课程,一门课程也可以由多名学生选修
-
-
属性:用椭圆表示,是实体某方面的特性,分为:
- 简单和复合属性:简单属性不可再分,复合属性可划分子属性,如通信地址
- 单值和多值属性:单值属性对特定实体只有一个值,多值属性可能有多个值,如员工亲属姓名
- NULL属性:属性无值或值未知时用NULL
- 派生属性:可从其他属性得来,如工作年限由当前时间和参加工作时间计算
- 还有弱实体集,即存在必须以另一个实体为前提的实体,如职工家属依赖于职工。
-
实体-联系方法:
-
通过不同构件(矩形表示实体集、菱形表示联系集、椭圆表示属性等)及线段等,将实体、联系、属性等相互连接,构建E-R图;
-
例:
-
-
练习:E-R模型向关系模型转换时,两个实体E1E_{1}E1和E2E_{2}E2之间的多对多联系R应该转换为一个独立的关系模式,且该关系模式的关键字由()组成。
- A.联系R的属性
- B.E1E_{1}E1或E2E_{2}E2的关键字
- C.E1E_{1}E1和E2E_{2}E2的关键字
- D.E1E_{1}E1和E2E_{2}E2的关键字加上R的属性
C
多对多的联系会产生一个新的关系模式,此关系模式的属性由联系的两个实体的主键以及自己的特有属性所组成
2.4 关系模型
-
在数据库领域,常见的数据模型有层次模型、网状模型、关系模型和面向对象模型;
-
关系模型是目前最常用的数据模型之一,在关系模型里,采用表格结构来表达实体集以及实体集之间的联系。
-
关系模型实例:
- S学生关系:包含学号(Sno)、姓名(Sname)、专业(SD)、年龄(Age)、性别(Sex)等属性,每一行代表一个学生的信息
- T教师关系:包含教师编号(Tno)、姓名(Tname)、年龄(Age)、性别(Sex)等属性,每一行代表一位教师的信息
- SC选课关系:包含学号(Sno)、课程号(Cno)、成绩(Grade)等属性,用于体现学生选课以及对应的成绩情况,反映学生与课程之间的联系
- C课程关系:包含课程号(Cno)、课程名(Cname)、先修课号(Pcno)等属性,每一行代表一门课程的信息
3 关系代数
3.1 关系数据库的基本概念
3.1.1 属性和域
- 现实中的一个实体(事物)常用用若干特征来描述,这些特征就是属性,每个属性的取值范围对应的集合是该属性的域;
- 例如员工的员工号、姓名、性别等都是属性,写作
员工(员工号、姓名、性别)
,每个属性都有其取值的域;
3.1.2 笛卡尔积与关系
-
设D1,D2,⋯ ,DnD_{1},D_{2},\cdots,D_{n}D1,D2,⋯,Dn为任意集合,其笛卡尔积为D1×D2×⋯×Dn={(d1,d2,⋯ ,dn)∣di∈Di,i=1,2,⋯ ,n}D_{1}×D_{2}×\cdots×D_{n}=\{(d_{1},d_{2},\cdots,d_{n})|d_{i}∈D_{i},i = 1,2,\cdots,n\}D1×D2×⋯×Dn={(d1,d2,⋯,dn)∣di∈Di,i=1,2,⋯,n},其中每个元素(d1,d2,⋯ ,dn)(d_{1},d_{2},\cdots,d_{n})(d1,d2,⋯,dn)称为一个nnn元组;
-
练习:若D1={0,1}D_{1}=\{0,1\}D1={0,1},D2={a,b}D_{2}=\{a,b\}D2={a,b},D3={c,d}D_{3}=\{c,d\}D3={c,d},求:D1×D2×D3D_{1}×D_{2}×D_{3}D1×D2×D3
D1×D2×D3={(0,a,c),(0,a,d),(0,b,c),(0,b,d),(1,a,c),(1,a,d),(1,b,c),(1,b,d)}D_{1}×D_{2}×D_{3}=\{(0,a,c),(0,a,d),(0,b,c),(0,b,d),(1,a,c),(1,a,d),(1,b,c),(1,b,d)\}D1×D2×D3={(0,a,c),(0,a,d),(0,b,c),(0,b,d),(1,a,c),(1,a,d),(1,b,c),(1,b,d)}
-
相关术语:
3.1.3 关系的相关名词
- 候选码:关系中某一属性或属性组的值能唯一标识一个元组,该属性或属性组就是候选码
- 主码:若一个关系有多个候选码,选定其中一个作为主码
- 主属性:包含在任何候选码中的属性为主属性,不包含在任何候选码中的属性为非码属性
- 外码:关系模式RRR中的属性或属性组不是RRR的主码,但它是其他关系的主码,那么该属性或属性组是RRR的外码
- 例:员工(员工号,姓名,性别,参加工作时间,部门号)和部门(部门号,名称,电话,负责人)
- 部门号在员工关系中是外码
3.1.4 关系的三种类型
- 基本关系(基本表):实际存在的表,是实际存储数据的逻辑表示
- 查询表:查询结果对应的表
- 视图表:由基本表或其他视图表导出的表,本身不独立存储在数据库中,数据库只存放其定义,常称为虚表
3.1.5 关系数据库模式
-
关系的描述称为关系模式,形式化表示为:
R(U,D,dom,F) R(U,D,dom,F) R(U,D,dom,F)- 其中RRR是关系名,UUU是属性名集合,DDD是属性的域,domdomdom是属性向域的映像集合,FFF是属性间数据的依赖关系集合;
-
通常简记为:
R(U)或R(A1,A2,⋯ ,An) R(U)或R(A_{1},A_{2},\cdots,A_{n}) R(U)或R(A1,A2,⋯,An)- RRR为关系名,A1,A2,⋯ ,AnA_{1},A_{2},\cdots,A_{n}A1,A2,⋯,An为属性名或域名,属性向域的映像常直接说明属性的类型、长度,主属性上加下划线表示为主码属性;
-
例:如员工(员工号,姓名,性别,参加工作时间,部门号)。
3.1.6 完整性约束
-
完整性规则用于保证用户修改数据库时数据的一致性,防止数据意外破坏,关系模型的完整性分为三类:
-
实体完整性:关系的主属性不能取空值
-
参照完整性:外键的值要么为空,要么必须等于对应关系中的主键值。以员工和部门关系为例,员工关系中的部门号(外码)要么为空,要么等于部门关系中的部门号(主键)
-
用户定义完整性:根据语义要求自定义的约束条件
-
3.1.7 关系运算
-
关系操作的特点是操作对象和操作结果都是集合。关系代数运算符有4类:
- 集合运算符(并∪\cup∪、差−-−、交∩\cap∩、笛卡尔积×××)
- 专门的关系运算符(选择σ\sigmaσ、投影π\piπ、连接⋈\bowtie⋈、除÷\div÷)
- 算术比较符(>>>、≥\geq≥、<<<、≤\leq≤、===、≠\neq=)
- 逻辑运算符(非¬\neg¬、与∧\land∧、或∨\lor∨)
3.2 五种基本关系代数运算
3.2.1 讲解
-
并(Union):关系RRR与SSS的属性及属性个数相同,运算结果是由属于RRR或属于SSS的元组构成的集合,记作:
R∪S={t∣t∈R∨t∈S} R\cup S=\{t|t\in R\vee t\in S\} R∪S={t∣t∈R∨t∈S} -
差(Difference):关系RRR与SSS的属性及属性个数相同,运算结果是由属于RRR但不属于SSS的元组构成的集合,记作:
R−S={t∣t∈R∧t∉S} R - S=\{t|t\in R\wedge t\notin S\} R−S={t∣t∈R∧t∈/S} -
广义笛卡尔积(Extended Cartesian Product):若关系模式RRR有nnn个属性,关系模式SSS有mmm个属性,广义笛卡尔积的结果有(n+m)(n + m)(n+m)个属性,前nnn个来自RRR,后mmm个来自SSS。若RRR有K1K_1K1个元组,SSS有K2K_2K2个元组,运算结果有K1×K2K_1×K_2K1×K2个元组,记作:
R×S={t∣∧tn∈R∧tm∈S} R×S=\{t|\wedge t_n\in R\wedge t_m\in S\} R×S={t∣∧tn∈R∧tm∈S} -
投影(Projection):从关系的垂直方向进行运算,在关系RRR中挑选若干属性列AAA组成新的关系,记作:
πA(R)={t[A]∣t∈R} \pi_A(R)=\{t[A]|t\in R\} πA(R)={t[A]∣t∈R} -
选择(Selection):从关系的水平方向进行运算,从关系RRR中选择满足条件的元组,记作:
σF(R)={t∣t∈R∧F(t)=True} \sigma_F(R)=\{t|t\in R\wedge F(t)=True\} σF(R)={t∣t∈R∧F(t)=True}- 其中FFF的运算对象是属性名(或列的序号)或者常量(用单引号括起,如′1′'1'′1′表示数字1),包含算术运算符(<<<、≤\leq≤、>>>、≥\geq≥、≠\neq=)、逻辑运算符(∧\wedge∧、∨\vee∨、¬\neg¬)。
3.2.2 练习
-
设有关系R、S如下所示,请求出R∪SR\cup SR∪S、R−SR - SR−S、R×SR×SR×S、πA,C(R)\pi_{A,C}(R)πA,C(R)、σA>B(R)\sigma_{A > B}(R)σA>B(R)和σC<4(R×S)\sigma_{C < 4}(R×S)σC<4(R×S);
R∪SR\cup SR∪S(并运算,将属于RRR或属于SSS的元组合并,去除重复元组)
A B C a b c b a d c d e d f g f h k R−SR - SR−S(差运算,属于RRR但不属于SSS的元组)
A B C a b c c d e R×SR×SR×S(笛卡尔积,RRR中每个元组与SSS中每个元组组合)
R.A R.B R.C S.A S.B S.C a b c b a d a b c d f g a b c f h k b a d b a d b a d d f g b a d f h k c d e b a d c d e d f g c d e f h k d f g b a d d f g d f g d f g f h k πA,C(R)\pi_{A,C}(R)πA,C(R)(投影运算,选取RRR的AAA、CCC列)
A C a c b d c e d g σA>B(R)\sigma_{A > B}(R)σA>B(R)(选择运算,选取RRR中AAA值大于BBB值的元组)
A B C b a d σ3<4(R×S)\sigma_{3 < 4}(R×S)σ3<4(R×S)(先做笛卡尔积,再选取第三列小于第四列的元组。注意:如果3和4加了引号,就代表是数字3和数字4)
R.A R.B R.C S.A S.B S.C a b c d f g a b c f h k b a d f h k c d e f h k
3.3 扩展的关系代数运算
3.3.1 讲解
-
交(Intersection):关系RRR与SSS的属性及属性个数相同,交运算的结果是由既属于RRR又属于SSS的元组构成的集合,记作:
R∩S={t∣t∈R∧t∈S}R\cap S = \{t|t\in R\wedge t\in S\}R∩S={t∣t∈R∧t∈S}-
且R∩S=R−(R−S)R\cap S = R-(R - S)R∩S=R−(R−S)或者R∩S=S−(S−R)R\cap S = S-(S - R)R∩S=S−(S−R);
R−SR - SR−S表示属于RRR但不属于SSS的元组(即RRR独有的),R−(R−S)R-(R-S)R−(R−S)表示属于RRR但不属于R−SR-SR−S的元组(即RRR中非RRR独有的);
-
-
连接(Join):连接运算是从两个关系RRR和SSS的笛卡尔积中选取满足条件的元组,分为θ\thetaθ连接、等值连接和自然连接3种
-
θ\thetaθ连接:
-
从关系RRR与SSS的笛卡尔积中选取属性间满足一定条件的元组,表达式为:
R⋈SXθY={t∣t=∧tn∈R∧tm∈S∧tn[X]θtm[Y]} \underset{X\theta Y}{R\bowtie S}=\{t|t = \wedge t^{n}\in R\wedge t^{m}\in S\wedge t^{n}[X]\theta t^{m}[Y]\} XθYR⋈S={t∣t=∧tn∈R∧tm∈S∧tn[X]θtm[Y]} -
也可表示为:
R⋈SXθY=σXθY(R×S) \underset{X\theta Y}{R\bowtie S}=\sigma_{X\theta Y}(R\times S) XθYR⋈S=σXθY(R×S)
-
-
等值连接:当θ\thetaθ为“===”时,就是等值连接,表达式为:
R⋈SX=Y={t∣t=∧tn∈R∧tm∈S∧tn[X]=tm[Y]} \underset{X = Y}{R\bowtie S}=\{t|t = \wedge t^{n}\in R\wedge t^{m}\in S\wedge t^{n}[X]=t^{m}[Y]\} X=YR⋈S={t∣t=∧tn∈R∧tm∈S∧tn[X]=tm[Y]} -
自然连接:是一种特殊的等值连接,要求两个关系中进行比较的分量必须是相同的属性组,且相同属性组的值要相等,同时在结果集中将重复属性列去掉,表达式为:
R⋈S={t∣t=∧tn∈R∧tm∈S∧R.B1=S.B1∧R.B2=S.B2∧⋯∧R.Bk=S.Bk} R\bowtie S=\{t|t = \wedge t^{n}\in R\wedge t^{m}\in S\wedge R.B_{1}=S.B_{1}\wedge R.B_{2}=S.B_{2}\wedge\cdots\wedge R.B_{k}=S.B_{k}\} R⋈S={t∣t=∧tn∈R∧tm∈S∧R.B1=S.B1∧R.B2=S.B2∧⋯∧R.Bk=S.Bk}
-
-
除(Division):除运算是同时从关系的水平方向和垂直方向进行运算,表达式为:
R÷S={tn[X]∣tn∈R∧πY(S)⊆Yx}R\div S=\{t^{n}[X]|t^{n}\in R\wedge\pi_{Y}(S)\subseteq Y_{x}\}R÷S={tn[X]∣tn∈R∧πY(S)⊆Yx} -
广义投影(Generalized Projection):允许在投影列表中使用算术运算,是对投影运算的补充,表达式为:
πF1,F1,⋯ ,Fn(R)\pi_{F_{1},F_{1},\cdots,F_{n}}(R)πF1,F1,⋯,Fn(R) -
外连接(Outer Join):在自然连接中,关系RRR与SSS的一些元组因没有公共属性会被抛弃,外连接可避免这种丢失,它会将自然连接时舍弃的元组也放入新关系,并在新增加的属性上填入空值;
- 左外连接(Left Outer Join):记为R⋈SR\bowtie SR⋈S,以左侧的关系RRR为主,保留RRR的所有元组,右侧的关系SSS未等值的用NULLNULLNULL填充,加入到R⋈SR\bowtie SR⋈S中;
- 右外连接(Right Outer Join):记为R⋉SR\ltimes SR⋉S,以右侧的关系SSS为主,保留SSS的所有元组,左侧的关系RRR未等值的用NULLNULLNULL填充,加入到R⋈SR\bowtie SR⋈S中;
- 全外连接(Full Outer Join):记为R⋈⊆SR\bowtie\subseteq SR⋈⊆S,是左外连接和右外连接的并。
3.3.2 练习
-
设有关系R、S如下图所示,求R⋈SR.A<S.B\underset{R.A < S.B}{R\bowtie S}R.A<S.BR⋈S;
这是一个θ\thetaθ连接(这里θ\thetaθ为“<<<”)的运算。θ\thetaθ连接的定义是从关系RRR与SSS的笛卡尔积中选取属性间满足一定条件(这里是R.A<S.BR.A < S.BR.A<S.B)的元组;
首先,计算R×SR\times SR×S(笛卡尔积),得到所有可能的元组组合。然后,从这些组合中筛选出满足RRR的属性AAA的值小于SSS的属性BBB的值的元组,最终得到下面结果表中的元组;
R⋈SR.A<S.B\underset{R.A < S.B}{R\bowtie S}R.A<S.BR⋈S结果表
R.A R.B R.C S.A S.B S.C a b c d f g a b c f h k b a d d f g b a d f h k c d e d f g c d e f h k d f g d f g d f g f h k -
设有关系R、S如下图所示,求R⋈SR\bowtie SR⋈S;
这是自然连接(R⋈SR\bowtie SR⋈S)的运算。自然连接是一种特殊的等值连接,要求两个关系中进行比较的分量必须是相同的属性组,且相同属性组的值要相等,同时在结果集中将重复属性列去掉;
在关系RRR和关系SSS中,相同的属性组是AAA和CCC。需要找出RRR和SSS中AAA和CCC都相等的元组,然后将这些元组组合起来,并去掉重复的属性列;
R⋈SR\bowtie SR⋈S结果表
A B C D a b c d b a d g d f g g -
设有关系R、S如下图所示,求R÷SR\div SR÷S;
除运算R÷SR\div SR÷S的规则是:找出在关系RRR中,对于关系SSS的所有元组,都有对应的匹配元组的那些RRR中的属性组(这里是AAA和BBB);
R÷SR\div SR÷S结果表
A B a b c k -
设有关系RRR,求πA,B−C(R)\pi_{A,B - C}(R)πA,B−C(R);
这是广义投影运算,广义投影允许在投影列表中使用算术运算。这里的πA,B−C(R)\pi_{A,B - C}(R)πA,B−C(R)表示对关系RRR进行投影,选取AAA列,以及通过BBB列的值减去CCC列的值得到的新列(即B−CB - CB−C);
πA,B−C(R)\pi_{A,B - C}(R)πA,B−C(R)的结果表:
A B - C a 6 b 0 c 5 d 3 -
设有关系R、S如下图所示,求R⋈SR\bowtie SR⋈S、R⋉SR\ltimes SR⋉S、R⋈⊆SR\bowtie\subseteq SR⋈⊆S;
左外连接(R⋈SR\bowtie SR⋈S):以左侧的关系RRR为主,保留RRR的所有元组,右侧的关系SSS中与RRR元组无法等值连接(即不满足连接条件)的部分,用NULLNULLNULL填充对应的属性值。例如关系RRR中的(b,a,d)(b,a,d)(b,a,d)和(d,f,g)(d,f,g)(d,f,g),在关系SSS中没有能与之等值连接的元组,所以在左外连接结果中,它们对应的DDD属性值为NULLNULLNULL;
左外连接R⋈SR\bowtie SR⋈S结果表:
A B C D a b c d c d e g c d e c b a d null d f g null 右外连接(R⋉SR\ltimes SR⋉S):以右侧的关系SSS为主,保留SSS的所有元组,左侧的关系RRR中与SSS元组无法等值连接的部分,用NULLNULLNULL填充对应的属性值。比如关系SSS中的(f,d,g)(f,d,g)(f,d,g),在关系RRR中没有能与之等值连接的元组,所以在右外连接结果中,其对应的AAA属性值为NULLNULLNULL;
右外连接R⋉SR\ltimes SR⋉S结果表
A B C D a b c d c d e g c d e c null f d g 全外连接(R⋈⊆SR\bowtie\subseteq SR⋈⊆S):是左外连接和右外连接的并集,既保留RRR的所有元组,也保留SSS的所有元组,无法等值连接的部分都用NULLNULLNULL填充对应的属性值。像RRR中的(b,a,d)(b,a,d)(b,a,d)、(d,f,g)(d,f,g)(d,f,g)和SSS中的(f,d,g)(f,d,g)(f,d,g),在全外连接结果中,不能等值连接的部分属性值都为NULLNULLNULL。
全外连接R⋈⊆SR\bowtie\subseteq SR⋈⊆S结果表
A B C D a b c d c d e g c d e c b a d null d f g null null f d g -
给定员工关系EEE(员工号,员工名,部门名,电话,家庭住址)、工程关系PPP(工程号,工程名,前期工程号)、参与关系EPEPEP(员工号,工程号,工作量)。查询“005”员工参与了“虎头山隧道”工程的员工名、部门名、工程名、工作量的关系代数表达式如下:
π2,3,5,6(π1,2,3(____)⋈(____)) \pi_{2,3,5,6}(\pi_{1,2,3}(\_\_\_\_) \bowtie (\_\_\_\_)) π2,3,5,6(π1,2,3(____)⋈(____))
- A.σ2=′005′(E)\sigma_{2='005'}(E)σ2=′005′(E)
- B.σ1=′005′(E)\sigma_{1='005'}(E)σ1=′005′(E)
- C.σ2=′005′(P)\sigma_{2='005'}(P)σ2=′005′(P)
- D.σ1=′005′(P)\sigma_{1='005'}(P)σ1=′005′(P)
- A.π2,3(σ2=′虎头山隧道′(P))⋈EP\pi_{2,3}(\sigma_{2='虎头山隧道'}(P)) \bowtie EPπ2,3(σ2=′虎头山隧道′(P))⋈EP
- B.π2,3(σ2=′虎头山隧道′(EP))⋈P\pi_{2,3}(\sigma_{2='虎头山隧道'}(EP)) \bowtie Pπ2,3(σ2=′虎头山隧道′(EP))⋈P
- C.π1,2(σ2=′虎头山隧道′(EP))⋈P\pi_{1,2}(\sigma_{2='虎头山隧道'}(EP)) \bowtie Pπ1,2(σ2=′虎头山隧道′(EP))⋈P
- D.π1,2(σ2=′虎头山隧道′(P))⋈EP\pi_{1,2}(\sigma_{2='虎头山隧道'}(P)) \bowtie EPπ1,2(σ2=′虎头山隧道′(P))⋈EP
B D
筛选“005”员工:员工关系EEE中,员工号是第1个属性,所以筛选“005”员工的关系代数操作是σ1=′005′(E)\sigma_{1='005'}(E)σ1=′005′(E),对应选项B
筛选“虎头山隧道”工程:工程关系PPP中,工程名是第2个属性,筛选“虎头山隧道”工程的操作是σ2=′虎头山隧道′(P)\sigma_{2='虎头山隧道'}(P)σ2=′虎头山隧道′(P)。之后要将工程信息与参与关系EPEPEP连接,需先对σ2=′虎头山隧道′(P)\sigma_{2='虎头山隧道'}(P)σ2=′虎头山隧道′(P)取工程号(第1个属性)和工程名(第2个属性),即π1,2(σ2=′虎头山隧道′(P))\pi_{1,2}(\sigma_{2='虎头山隧道'}(P))π1,2(σ2=′虎头山隧道′(P)),再与EPEPEP连接,对应选项D
最终投影:将筛选出的员工信息(员工名是EEE的第2个属性,部门名是EEE的第3个属性)、工程名(来自PPP的第2个属性)、工作量(来自EPEPEP的第3个属性)进行投影,即π2,3,5,6\pi_{2,3,5,6}π2,3,5,6,结合前面的连接操作,得到完整的关系代数表达式
4 关系数据库SQL语言
4.1 SQL语言简介
-
SQL是结构化查询语言的简称,是关系数据库中最普遍使用的语言,包含数据查询、数据操纵、数据定义和数据控制功能,是通用且功能强大的关系数据库标准语言;
-
SQL语言支持关系数据库的三级模式;
- 基本表和视图都是表:
- 基本表是存储在数据库中的表;
- 视图是虚表,由基本表或其他视图导出,数据库只存放视图的定义,不存放视图的数据;
- 用户可用SQL对视图或表进行查询等操作;
- 基本表和视图都是表:
4.2 SQL数据定义(DDL)
- 包括对表、视图、索引的创建和删除。
4.2.1 创建表(Create Table)
-
语句格式:
CREATE TABLE<表名>(<列名><数据类型>[列级完整性约束条件][,<列名><数据类型>[列级完整性约束条件]]…[,<表级完整性约束条件>]);
-
完整性约束:
-
例:
Create Table Student(Sno char(11) not null unique,Sname char(30) not null,Ssex char(2),Sage int,DepartmentNo char(5),primary key(Sno),foreign key(DepartmentNo) References Department(DepartmentNo) );
4.2.2 修改和删除表
-
修改表(Alter Table):
-
语句格式:
ALTER TABLE<表名>[ADD<新列名><数据类型>[完整性约束条件]][DROP<完整性约束名>][MODIFY<列名><数据类型>];
-
例:
Alter Table Student Add ldentity_id char(18) not null unique;
-
-
删除表(Drop Table):
-
语句格式:
Drop Table <表名>;
-
例:
Drop Table Student;
-
4.2.3 索引建立与删除
-
数据库中索引的作用:
- 保证数据记录唯一性;
- 加快数据检索速度;
- 加速表与表之间的连接;
- 减少查询中分组和排序的时间;
- 使用优化隐藏器提高系统性能;
-
索引分为聚簇索引(索引项顺序与表中记录物理顺序一致)和非聚簇索引;
-
创建索引:
-
语句格式:
CREATE [UNIQUE][CLUSTER] INDEX <索引名> ON<表名>(<列名>[<次序>][,<列名>[<次序>]]…);
-
例:
Create Unique Index Sno idx On Student(Sno);
-
-
删除索引:
-
语句格式:
DROP INDEX <索引名>;
-
例:
Create Unique Index Sno idx On Student(Sno);
-
-
练习:采用三级模式结构的数据库系统中,如果对一个表创建聚簇索引,那么改变的是数据库的()。
- A.外模式
- B.模式
- C.内模式
- D.用户模式
C
对于内模式,又称存储模式,对应文件级,是数据物理结构和存储方式的描述,是数据在数据库内部的表示方法,定义所有内部的记录类型、索引和文件的组织方式,以及数据控制方面的细节;
例如:B+树结构存储、Hash方法存储和聚簇索引等。创建聚簇索引,意为索引项的顺序是与表中记录的物理顺序一致的索引组织,所以需要改变的是数据库的内模式。
4.2.4 视图创建与删除
-
视图是由一个或多个基本表或视图导出的表,基于对表的查询,是虚拟表;
-
视图的创建:
-
语句格式:
CREATE VIEW 视图名(列表名) AS SELECT 查询子句 [WITH CHECK OPTION];
-
创建时需遵循:
- 子查询通常不允许含ORDER BY子句和DISTINCT短语;
- WITH CHECK OPTION保证UPDATE、INSERT、DELETE操作时,行满足视图定义的谓词条件;
- 视图属性列名全部省略或全部指定,省略时隐含由SELECT子查询目标列的主属性组成
-
例:
Create View CS_Student_View As Select Sno,Sname,Sage From Student where Department = '1001' With Check Option;
-
-
视图的删除:
-
语句格式:
DROP VIEW 视图名;
-
例:
Drop View CS_Student_View;
-
4.3 SQL数据查询
- SQL数据操纵功能:包括Insert(插入)、Delete(删除)、Update(修改)、Select(查询),属于数据库操纵语言(DML)。
4.3.1 Select基本结构
-
语句格式:
SELECT[ALL|DISTINCT]<目标列表达式>[,<目标列表达式>]… FROM<表名或视图名>[,<表名或视图名>][WHERE<条件表达式>][GROUP BY<列名1>[HAVING<条件表达式>]][ORDER BY<列名2>[ASC|DESC]…]
- 其中Having只能与Group By搭配使用;
-
Where子句的条件表达式运算符:
- 集合运算符:In(在集合中)、Not In(不在集合中)
- 字符匹配运算符:Like(与
_
和%
进行单个或多个字符匹配) - 空值比较运算符:Is Null(为空)、Is Not Null(不为空)
- 算术运算符:
>
、>=
、<
、<=
、=
、◇
- 逻辑运算符:And(与)、Or(或)、Not(非)
4.3.2 简单查询
-
列操作:
-
查询指定列
# 查询全部学生的姓名和年龄 Select Sname,Sage From Student;
-
查询全部列
# 查询全部学生的所有列 Select * From Student;
-
-
元组(行)操作:
-
消除重复行
# 消除结果中的重复行 Select Distinct DepartmentNo From Student;
-
单条件查询
# 查询年龄小于20的学生的姓名、年龄 Select Sname,Sage From Student Where Sage<20;
-
确定范围
# 查询年龄在20 - 22之间的学生的姓名、年龄 Select Sname,Sage From Student Where Sage Between 20 And 22;
-
确定集合
# 查询院系为'01001'和'01002'的学生姓名 Select Sname From Student Where DepartmentNo In('01001','01002');
-
字符匹配
# 查询姓张的学生的详细情况 Select * From Student Where Sname Like '张%';
-
多重查询条件
# 查询计算机学院年龄在18岁以下的学生姓名 Select Sname From Student Where DepartmentNo='01001' And Sage<18;
-
4.3.3 连接查询
-
涉及两个及以上表的查询,连接运算有
=
、>
、<
、>=
、<=
、!=
等; -
例:
Select Student.*,Department.DepartmentName From Student,Department Where Student.DepartmentNo = Department.DepartmentNo;
4.3.4 子查询与聚集函数
-
子查询:也称嵌套查询,是一个SELECT - FROM - WHERE查询块嵌入另一个查询块之中;
-
例:
Select Sno,Sname From Student Where DepartmentNo in(Select DepartmentNo From Department Where DepartmentName = '计算机学院' or DepartmentName = '电气工程学院');
-
聚集函数:
Count([Distinct|All]*)
:统计元组个数Count([Distinct|All]<列名>)
:统计某一列/属性/字段的个数Sum([Distinct|All]<列名>)
:计算一列(数值型)中值的总和Avg([Distinct|All]<列名>)
:计算一列(数值型)中值的平均值Max([Distinct|All]<列名>)
:求一列值的最大值Min([Distinct|All]<列名>)
:求一列值的最小值
-
例:
Select Count(*),Avg(Sage) From Student Where DepartmentNo = '01001';
4.3.5 分组查询
-
将查询结果按某一列或多列进行分组:
Group By <列名> [Having <条件表达式>]
-
例:
Select DepartmentNo,Avg(Sage) From Student Group By DepartmentNo Having Count(Sno)>300;
4.3.6 更名运算
-
SQL提供为关系和属性重新命名的机制,使用“As”实现;
-
例:
Select Sname As 学生姓名,Sage 学生年龄 From Student;
4.3.7 字符串操作
-
对字符串最常用的操作是模式匹配LIKE,使用
%
(匹配任意字符串)和_
(匹配任意一个字符)描述模式,且模式匹配大小写敏感; -
例:
Select Sno,Sname,Sage From Student Where Sname Like '李%';
4.3.8 视图的查询
-
例:
Select Sno,Sname,Sage From CS_Student_View Where Sage < 20;
-
系统执行时通常先转换成等价的对基本表的查询,再执行查询语句。
4.4 SQL数据更新
-
插入(Insert):
-
语句格式如下,用于向基本表中插入新的元组;
INSERT INTO 基本表名(字段名[,字段名]...) VALUES(常量[,常量]...);
-
例:
Insert Into Student Values('30260010021','张三','男','01001');
-
-
删除(Delete):
-
语句格式如下,用于从基本表中删除满足条件的元组。若省略WHERE子句,则删除表中所有元组;
DELETE FROM 基本表名 [WHERE 条件表达式];
-
例:
Delete From Student Where Sname = '张三';
-
-
修改(Update):
-
语句格式如下,用于修改基本表中满足条件的元组的属性值。若省略WHERE子句,则修改表中所有元组的对应属性值;
UPDATE 基本表名 SET 列名=值表达式(,列名=值表达式...) [WHERE 条件表达式];
-
例:
Update Student Set Sage = Sage+1 Where Sname = '张三';
-
4.5 SQL访问控制
-
权限类型:SQL标准包括Insert、Delete、Update和Select权限,其中Select权限对应于Read权限;
-
授权(Grant):
-
语句格式:
GRANT <权限>[,<权限>]...[ON <对象类型><对象名>] TO <用户>[,<用户>]... [WITH GRANT OPTION];
WITH GRANT OPTION
子句表示被授权的用户可以将获得的权限再授予其他用户;
-
不同对象的操作权限:
- 属性列(对象类型为Table):操作权限有Insert、Delete、Update、Select、All Privileges(前4种权限的总和)
- 视图(对象类型为Table):操作权限有Insert、Delete、Update、Select、All Privileges(前4种权限的总和)
- 基本表(对象类型为Table):操作权限有Insert、Delete、Update、Select、Alter、Index、All Privileges(前6种权限的总和)
- 数据库(对象类型为DataBase):有CreateTab(建立表的权限),可由数据库管理员(DBA)授予普通用户
-
例:
# 将Student表的查询权限授予User1,且User1可将该权限再授予其他用户 Grant Select On Table Student To User1 With Grant Option;
-
-
收回权限(Revoke):
-
语句格式如下,用于收回之前授予用户的权限;
REVOKE <权限>[,<权限>]...[ON <对象类型><对象名>] FROM <用户>[<用户>]...;
-
例:
# 从User1和User2处收回对Student表和Department表的所有权限; Revoke All Privileges On Table Student,Department From User1,User2;
-
-
练习:如果将Students表的插入权限赋予用户User1,并允许其将该权限授予他人,那么正确的SQL语句如下:
GRANT ____ TABLE Students TO User1 ____;
- A.INSERT
- B.INSERT ON
- C.UPDATE
- D.UPDATE ON
- A.FOR ALL
- B.PUBLIC
- C.WITH GRANT OPTION
- D.WITH CHECK OPTION
B C
正确的语句应该为:
GRANT INSERT ON TABLE Students TO User1 WITH GRANT OPTION;
其中,INSERT ON 表示授予 INSERT 权限,Students 表示授予权限的对象,User1 是被授权的用户,WITH GRANT OPTION 表示允许该用户将所授予的权限授权给他人。
5 关系数据库的规范化
5.1 函数依赖
-
关系数据库设计的方法之一是设计满足合适范式的模式,规范化理论主要包括数据依赖、范式和模式设计方法,核心基础是数据依赖,数据依赖中最重要、最基本的是函数依赖;
-
函数依赖:设R(U)R(U)R(U)是属性集UUU上的关系模式,XXX、YYY是UUU的子集。若对R(U)R(U)R(U)的任何一个可能的关系rrr,rrr中不可能存在两个元组在XXX上的属性值相等,而在YYY上的属性值不等,则称XXX函数决定YYY或YYY函数依赖于XXX,记作X→YX \to YX→Y(读作XXX决定YYY);
-
部分函数依赖:
-
如果X→YX \to YX→Y,但YYY不完全函数依赖于XXX,则称YYY对XXX部分函数依赖;
-
例:(A,B)(A,B)(A,B)能确定CCC,AAA也能确定CCC,即(A,B)(A,B)(A,B)属性集中的部分属性(AAA)就可以确定CCC,则CCC部分函数依赖于(A,B)(A,B)(A,B);
-
-
传递函数依赖:
-
在R(U,F)R(U,F)R(U,F)中,如果X→YX \to YX→Y,Y⊈XY \nsubseteq XY⊈X,Y→ZY \to ZY→Z,则称ZZZ对XXX传递依赖(其中UUU是属性集,FFF是UUU上的一组函数依赖);
-
例:若A→BA \to BA→B,B→CB \to CB→C,且BBB不能→A\to A→A(防止直接A→CA \to CA→C),则称CCC传递函数依赖AAA;
-
-
函数依赖求候选键:
- 图示法:
- 将关系的函数依赖关系用“有向图”的方式表示;
- 找入度为000的属性,以该属性集合为起点,尝试遍历所有有向图,若能正常遍历图中所有结点,则该属性集即为关系模式的候选键;
- 若入度为000的属性集不能遍历图中所有结点,则需要尝试性的将一些中间结点(既有入度,也有出度的结点)并入度为000的属性集中,直至该属性集合能遍历所有结点,则该属性集合为候选键;
- 第二种方法:根据依赖集,找出从未在右边出现过的属性,必然是候选键之一,以该属性为基础,根据依赖集依次扩展,看能否遍历所有属性,若无法遍历所有属性,将无法遍历的加入候选键中;
- 图示法:
-
函数依赖的公理系统(Armstrong公理系统):设关系模式R(U,F)R(U,F)R(U,F),其中UUU为属性集,FFF是UUU上的一组函数依赖,有以下推理规则:
- A1自反律:若Y⊆X⊆UY \subseteq X \subseteq UY⊆X⊆U,则X→YX \to YX→Y为FFF所蕴涵
- A2增广律:若X→YX \to YX→Y为FFF所蕴涵,且Z⊆UZ \subseteq UZ⊆U,则XZ→YZXZ \to YZXZ→YZ为FFF所蕴涵
- A3传递律:若X→YX \to YX→Y,Y→ZY \to ZY→Z为FFF所蕴涵,则X→ZX \to ZX→Z为FFF所蕴涵
- 根据以上三条推理规则,可推出以下三条推理规则:
- 合并规则:若X→YX \to YX→Y,X→ZX \to ZX→Z,则X→YZX \to YZX→YZ为FFF所蕴含
- 伪传递规则:若X→YX \to YX→Y,WY→ZWY \to ZWY→Z,则XW→ZXW \to ZXW→Z为FFF所蕴含
- 分解规则:若X→YX \to YX→Y,Z⊆YZ \subseteq YZ⊆Y,则X→ZX \to ZX→Z为FFF所蕴含
-
练习:关系R(A,B,C)R(A,B,C)R(A,B,C)满足下列函数依赖F{A→B,A→C,B→AC}F\{A→B,A→C,B→AC\}F{A→B,A→C,B→AC},关系RRR的候选关键字为()。
- A.ACACAC
- B.AAA和BBB
- C.AAA和BCBCBC
- D.ACACAC和ABABAB
B
可以通过图示法来求候选键。如果一个属性集能唯一标识元组,且又不含有多余属性,那么这个属性集就是候选键;
根据图示法可以得到如下图所示的依赖关系有向图。从属性AAA出发,可以遍历到BBB和CCC,因此AAA是一个候选键,但这时,我们注意到,从BBB出发,也可以遍历图中剩余的顶点,因此BBB也是其一个候选键。所以本题的候选键是AAA和BBB;
-
练习:给定关系模式R(U,F)R(U,F)R(U,F),U={A,B,C,D}U=\{A,B,C,D\}U={A,B,C,D},函数依赖集F={AB→C,CD→B}F=\{AB→C,CD→B\}F={AB→C,CD→B}。关系模式RRR(),主属性和非主属性个数分别为()。
- A.只有1个候选关键字ACBACBACB
- B.只有一个候选关键字BCDBCDBCD
- C.有2个候选关键字ABDABDABD和ACDACDACD
- D.有2个候选关键字ACBACBACB和BCDBCDBCD
- A.4和0
- B.3和1
- C.2和2
- D.1和3
C A
根据给定的函数依赖集FFF,可以求出RRR的所有候选键:
- 首先看函数依赖集中的AB→CAB→CAB→C,此时已经得到属性AAA、BBB和CCC,还剩下属性DDD未被决定。进一步地,我们可以发现,由于DDD不出现在任何右部,它只能在某个候选键中左边出现。因此,候选键必须包括AAA、BBB和DDD三个属性。因此,ABDABDABD是一个候选键;
- 接下来看函数依赖集中的CD→BCD→BCD→B,此时已经得到属性BBB、CCC和DDD,此时还剩下属性AAA未被决定。进一步地,我们可以发现,由于AAA不出现在任何右部,它只能在某个候选键中左边出现。因此,候选键必须包括AAA、CCC和DDD三个属性。因此,ACDACDACD是一个候选键。因此,RRR的所有候选键为ABDABDABD和ACDACDACD;
- 根据关系模式的定义,主属性指的是一个关系模式的任何一个候选键的属性,而非主属性则是指不属于任何一个候选键的属性。因此,ABDABDABD和ACDACDACD都是候选键,并且它们的并集等于UUU,因此没有其他属性可以作为主属性。因此,RRR中有4个主属性,0个非主属性。
-
练习:给定关系模式R(U,F)R(U,F)R(U,F),其中UUU为属性集,FFF是UUU上的一组函数依赖,属于自反律的是()。
- A.若Y∈X∈UY∈X∈UY∈X∈U,则X→YX→YX→Y为FFF所蕴含
- B.若X→Y,Y→ZX→Y,Y→ZX→Y,Y→Z,则X→YX→YX→Y为FFF所蕴含
- C.若X→Y,Z∈YX→Y,Z∈YX→Y,Z∈Y,则X→ZX→ZX→Z为FFF所蕴含
- D.若X→Y,X→ZX→Y,X→ZX→Y,X→Z,则X→YZX→YZX→YZ为FFF所蕴含
A
自反律:若Y∈X∈UY∈X∈UY∈X∈U,则X→YX→YX→Y为FFF所蕴含。
根据函数依赖的性质,自反律指的是对于任意的属性集XXX,都有X→XX→XX→X属于FFF。因此,从给定的选项中可以得出,只有选项AAA满足自反律的要求,因为选项AAA中的XXX和YYY可以相同,即X=YX = YX=Y,这样就得到了X→XX→XX→X,满足自反律的要求
选项BBB、CCC、DDD均不满足自反律的要求。选项BBB中的X→YX→YX→Y和Y→ZY→ZY→Z无法推出X→XX→XX→X
选项CCC中的X→YX→YX→Y和Z∈YZ∈YZ∈Y也无法推出X→XX→XX→X
选项DDD中的X→YX→YX→Y和X→ZX→ZX→Z也无法推出X→XX→XX→X
5.2 规范化
-
关系数据库设计的方法之一是设计满足适当范式的模式,可通过判断分解后的模式达到的范式来评价规范化程度;
-
范式级别关系为5NF⊂4NF⊂BCNF⊂3NF⊂2NF⊂1NF5NF \subset 4NF \subset BCNF \subset 3NF \subset 2NF \subset 1NF5NF⊂4NF⊂BCNF⊂3NF⊂2NF⊂1NF,级别越高,模式规范化程度越高;
-
1NF(第一范式):
- 若关系模式RRR的每一个分量是不可再分的数据项,即属性是原子不可再分的,则关系模式RRR属于第一范式;
- 存在问题:数据冗余、插入异常、删除异常等;
-
2NF(第二范式):若关系模式R∈1NFR \in 1NFR∈1NF,且每一个非主属性完全(函数)依赖于主属性(候选码),则关系模式R∈2NFR \in 2NFR∈2NF。即每个非主属性都由整个主属性(候选码)决定,当1NF1NF1NF消除了非主属性对码的部分函数依赖,就称为2NF2NF2NF;
如果不存在部分函数依赖,就达到了2NF;
-
3NF(第三范式):若关系模式R(U,F)R(U,F)R(U,F)中不存在这样的码XXX,属性组YYY及非主属性Z(Z⊈Y)Z(Z \not\subseteq Y)Z(Z⊆Y)使得X→Y(Y↛X)X \to Y(Y \nrightarrow X)X→Y(Y↛X),Y→ZY \to ZY→Z成立,则关系模式R∈3NFR \in 3NFR∈3NF。即当2NF2NF2NF消除了非主属性对码的传递函数依赖,就称为3NF3NF3NF;
如果不存在传递依赖,就达到了3NF;
-
BCNF(巴克斯范式):BCNF是修正的第三范式,规定了每个属性(包括主属性)都不传递依赖于码。即当3NF3NF3NF消除了主属性对码的部分函数依赖和传递函数依赖,就称为BCNFBCNFBCNF;
-
4NF(第四范式):4NF主要是消除了多值依赖;
-
练习:给定关系R(U,F)R(U,F)R(U,F),其中U={A,B,C,D,E,H}U = \{A,B,C,D,E,H\}U={A,B,C,D,E,H},F={A→B,B→DH,A→H,C→E}F = \{A→B,B→DH,A→H,C→E\}F={A→B,B→DH,A→H,C→E},关系有(),FFF中()。
- A.一个候选码AAA
- B.两个候选码AAA、BBB
- C.一个候选码ACACAC
- D.两个候选码AAA、CCC
- A.不存在传递依赖,但存在冗余函数依赖
- B.既不存在传递依赖,也不存在冗余函数依赖
- C.存在传递依赖A→DA→DA→D和A→HA→HA→H,但不存在冗余函数依赖
- D.存在传递依赖A→DA→DA→D和A→HA→HA→H,并且还存在冗余函数依赖
C D
通过一个(或一组)属性(即候选码)可以唯一地标识一个元组,根据题干给出的依赖关系,通过属性组ACACAC可以得到BBB、DDD、EEE、HHH这几个属性,即ACACAC可以唯一地标识题干中的元组,所以ACACAC是该关系模式的候选码;
属性DHDHDH是通过属性BBB间接得到的,而非候选码ACACAC直接推导的,属于传递依赖。同时属性BBB是通过候选码ACACAC中的主属性AAA得到的,这里又存在部分函数依赖,主属性CCC对于BBB来说是冗余信息;
-
练习:某高校人力资源管理系统的数据库中,教师关系模式为TTT(教师号,姓名,部门号,岗位,联系地址,薪资),函数依赖集F={教师号→(姓名,部门号,岗位,联系地址),岗位→薪资}F=\{教师号→(姓名,部门号,岗位,联系地址),岗位→薪资\}F={教师号→(姓名,部门号,岗位,联系地址),岗位→薪资}。关系模式TTT的主键为(),函数依赖集FFF()。
- A.教师号,TTT存在冗余以及插入异常和删除异常的问题
- B.教师号,TTT不存在冗余以及插入异常和删除异常的问题
- C.(教师号,岗位),TTT存在冗余以及插入异常和删除异常的问题
- D.(教师号,岗位),TTT不存在冗余以及插入异常和删除异常的问题
- A.存在传递依赖,故关系模式TTT最高达到1NF1NF1NF
- B.存在传递依赖,故关系模式TTT最高达到2NF2NF2NF
- C.不存在传递依赖,故关系模式TTT最高达到3NF3NF3NF
- D.不存在传递依赖,故关系模式TTT最高达到4NF4NF4NF
A B
TTT中的部门号、岗位、薪资可以独立出来,所以存在冗余;
FFF中的非主属性完全依赖于码教师号,但存在传递依赖教师号->薪资。
5.3 模式分解及分解应具有的特性
-
分解:
- 模式分解是将一个关系模式分解为多个子模式;
- 它是模式规范化的工具,使用无损连接和保持函数依赖来衡量分解后是否导致原有模式中部分信息丢失;
-
无损连接:
- 判定定理:关系模式R(U,F)R(U,F)R(U,F)的一个分解ρ={R1(U1,F1),R2(U2,F2),⋯ ,Rk(Uk,Fk)}\rho = \{R_{1}(U_{1},F_{1}),R_{2}(U_{2},F_{2}),\cdots,R_{k}(U_{k},F_{k})\}ρ={R1(U1,F1),R2(U2,F2),⋯,Rk(Uk,Fk)}具有无损连接的充分必要条件是U1∩U2→U1−U2∈F+U_{1}\cap U_{2}\to U_{1} - U_{2}\in F^{+}U1∩U2→U1−U2∈F+或U1∩U2→U2−U1∈F+U_{1}\cap U_{2}\to U_{2} - U_{1}\in F^{+}U1∩U2→U2−U1∈F+;
- 其中:
- U1−U2U_1 - U_2U1−U2即U1U_1U1中有而U2U_2U2中没有的元素;
- F+F^{+}F+是模式分解后子模式函数依赖集的并集,即F1F_1F1与F2F_2F2的并集;
-
保持函数依赖:
- 定义:关系模式R(U,F)R(U,F)R(U,F)的一个分解ρ={R1(U1,F1),R2(U2,F2),⋯ ,Rk(Uk,Fk)}\rho = \{R_{1}(U_{1},F_{1}),R_{2}(U_{2},F_{2}),\cdots,R_{k}(U_{k},F_{k})\}ρ={R1(U1,F1),R2(U2,F2),⋯,Rk(Uk,Fk)},如果F+=(⋃i=1kπRi(F+))F^{+}=(\bigcup_{i = 1}^{k}\pi_{R_{i}}(F^{+}))F+=(⋃i=1kπRi(F+)),则称分解ρ\rhoρ保持函数依赖(即分解后的子模式函数依赖集F+F^+F+的并集保持了原来的函数依赖集FFF,也就是F+=FF^{+}=FF+=F);
- 保持函数依赖是指模式分解后的F+F^{+}F+(各个子模式函数依赖集的并集)是否与FFF(原有的函数依赖集)等价。若F+F^{+}F+包含所有FFF中的函数依赖,可得出保持函数的依赖性(充分条件);若F+F^{+}F+不显式包含FFF中的函数依赖,还需进一步判断,判断方法有:
- 通过F+F^{+}F+中的属性闭包去求,看是否蕴含函数依赖(这种方法要求做函数投影时,不能缺项);
- 使用给定的算法去求,对投影要求简单,但过程特别麻烦;
-
练习:假设关系R(U,F)R(U,F)R(U,F),属性集U={A,B,C}U = \{A,B,C\}U={A,B,C},函数依赖集F={A→B,B→C}F = \{A→B,B→C\}F={A→B,B→C}。若将其分解为ρ={R1(U1,F1),R2(U2,F2)}\rho = \{R_{1}(U_{1},F_{1}),R_{2}(U_{2},F_{2})\}ρ={R1(U1,F1),R2(U2,F2)},其中U1={A,B}U_{1} = \{A,B\}U1={A,B},U2={A,C}U_{2} = \{A,C\}U2={A,C}。那么,关系模式RRR、R1R_{1}R1、R2R_{2}R2分别达到了();分解ρ\rhoρ()。
- A.1NF、2NF、3NF
- B.1NF、3NF、3NF
- C.2NF、2NF、3NF
- D.2NF、3NF、3NF
- A.有损连接但保持函数依赖
- B.既无损连接又保持函数依赖
- C.有损连接且不保持函数依赖
- D.无损连接但不保持函数依赖
D D
RRR有函数依赖集F={A→B,B→C}F = \{A→B,B→C\}F={A→B,B→C}。由于AAA可确定BBB和CCC,所以AAA为主键,单个属性的主键不可能有部分依赖关系,所以RRR已符合2NF2NF2NF。进一步分析是否为3NF3NF3NF时,需要识别RRR中是否存在传递依赖。A→B,B→CA→B,B→CA→B,B→C属于典型的传递依赖,所以RRR最高只到2NF2NF2NF。当RRR被分为R1R1R1与R2R2R2后,R1R1R1与R2R2R2分别只有两个属性,此时的关系模式不可能存在部分依赖,也没法传递依赖(至少3个属性才可能传递),所以都达到了3NF3NF3NF;
判断是否是无损连接:
- U1∩U2=AU1\cap U2 = AU1∩U2=A,U1−U2=BU1 - U2 = BU1−U2=B,U2−U1=CU2 - U1 = CU2−U1=C,F1={A→B}F_1=\{A→B\}F1={A→B},F2F_2F2为空,F+F^+F+等于F1F_1F1与F2F_2F2的并集 = {A→B}\{A→B\}{A→B};
- 因为U1∩U2→U1−U2∈F+U_{1}\cap U_{2}\to U_{1} - U_{2}\in F^{+}U1∩U2→U1−U2∈F+,而A→B∈F+A \to B \in F^+A→B∈F+,所以是无损连接;
判断是否保持函数依赖:F+={A→B}F^+=\{A→B\}F+={A→B}与F={A→B,B→C}F = \{A→B,B→C\}F={A→B,B→C}不相等,所以不保持函数依赖。
6 数据库的控制功能
6.1 事务管理
- 事务是数据库管理系统(DBMS)的基本工作单位,是由用户定义的一个操作序列;
- 事务的定义语句:
Begin Transaction
:表示事务开始Commit
:事务提交,表示事务成功地结束Rollback
:事务回滚,表示事务非成功地结束
- 事务的ACID性质:
- 原子性(Atomicity):事务是一个不可分割的工作单位,事务中的操作要么都做,要么都不做
- 一致性(Consistency):事务执行的结果必须使数据库从一个一致性状态转变到另一个一致性状态,事务执行过程中的中间状态对外不可见
- 隔离性(Isolation):多个事务并发执行时,一个事务的执行不能被其他事务干扰,事务之间相互隔离、互不干扰
- 持久性(Durability):一个事务一旦提交,它对数据库中数据的改变就应该是永久性的,接下来的其他操作或故障不应该对其执行结果有任何影响,即事务成功提交后,对数据库的更新操作是永久有效的
6.2 数据库的备份与恢复
- 数据库的故障类型
- 事务内部故障:如运算溢出、除零错误、并发事务发生死锁等
- 系统故障:也称为软故障,是指造成系统停运的事件,如CPU故障、OS故障、突然停电等
- 介质故障:也称为硬故障,如磁盘损坏等
- 计算机病毒
- 数据库的备份方法
- 静态转储(冷备份):在转储期间不允许对数据库进行任何存取、修改操作;
- 优点是非常快速、容易归档(直接物理复制操作)
- 缺点是只能提供到某一时间点上的恢复,不能做其他工作,不能按表或按用户恢复
- 动态转储(热备份):在转储期间允许对数据库进行存取、修改操作,转储和用户事务可以并发执行;
- 优点是可在表空间或数据库文件级备份,数据库仍可使用,可达到秒级恢复
- 缺点是不能出错,否则后果严重,若热备份不成功,所得结果几乎全部无效
- 海量转储(完全转储):每次转储全部数据库
- 增量转储:每次只转储上次转储后更新过的数据,用于数据库很大、事务处理频繁的场景
- 差量转储:对最近一次数据库完全备份以来发生的数据变化进行备份,优点是速度快,占用较小的时间和空间
- 日志文件:在事务处理过程中,DBMS把事务开始、事务结束以及对数据库的插入、删除和修改的每一次操作写入日志文件。一旦发生故障,DBMS的恢复子系统利用日志文件撤销事务对数据库的改变,回退到事务的初始状态
- 静态转储(冷备份):在转储期间不允许对数据库进行任何存取、修改操作;
6.3 并发控制
-
并发操作及数据不一致问题:在多用户系统中,多个事务可能同时操作同一数据,会导致3种数据不一致问题;
-
丢失修改(丢失更新):两个事务T1T_1T1和T2T_2T2读入同一数据做修改,并发执行时,T1T_1T1把T2T_2T2或T2T_2T2把T1T_1T1的修改结果覆盖掉,造成数据丢失更新,导致数据不一致;
T1 T2 Read(X) Read(X) X=X-10 Write(X) X=X-20 Write(X) -
不可重复读:事务T1T_1T1读取了数据RRR,事务T2T_2T2读取并更新了数据RRR,当事务T1T_1T1再读取数据RRR以进行核对时,得到的两次读取数据不一致;
T1 T2 Read(X=20) Read(Y=10) Add(X+Y=30) Read(X=20) X=X-10 Write(X=10) Read(X=10) Read(Y=10) Add(X+Y=20)(错误) -
读脏数据:事务T1T_1T1更新了数据RRR,事务T2T_2T2读取了更新后的数据RRR,事务T1T_1T1由于某种原因被撤销,进行了事务回滚,数据RRR恢复原值,事务T2T_2T2读取了脏数据;
T1 T2 Read(X) X=X-10 Write(X) Read(X) 对X的处理操作 Rollback
-
-
造成以上3种数据不一致的主要原因是事务的并发操作破坏了事务的隔离性;
-
并发控制技术:并发控制的主要技术是封锁(Lock)技术,基本封锁类型有两种
- 排他锁(X锁):
- 事务TTT对数据AAA加XXX锁时,只允许事务TTT读取、修改数据AAA;
- 只有等该锁解除之后,其他事务才能够对数据AAA加任何锁类型;
- 共享锁(S锁):
- 解决了XXX锁太严格,不允许其他事务并发读的问题;
- 事务TTT对数据AAA加SSS锁,则只允许事务TTT读取数据AAA但不能够修改;
- 可允许其他事务对其加SSS锁,但不允许加XXX锁。
- 排他锁(X锁):
7 数据仓库
-
数据仓库的定义:数据仓库是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合,用于支持管理决策;
-
数据仓库的体系结构:
- 数据源经过抽取、清理、装载、刷新等操作向数据仓库提供数据;
- 数据仓库可向下衍生出数据集市;
- 有OLAP(联机分析处理)服务器,能快速汇总大量数据并进行高效查询分析,为分析人员提供决策支持;
- 前端工具包括查询工具、报表工具、分析工具、数据挖掘工具等,用于对数据仓库中的数据进行各类分析和利用;
-
数据仓库与数据库的对比:
- 面向对象:数据仓库面向主题,数据库面向事务
- 数据结构:数据仓库数据结构是集成的,具有一致性;数据库数据结构更为复杂
- 数据变化:数据仓库是静态的历史数据,只能定期添加、刷新;数据库是动态变化的,业务发生,数据就更新
- 存储数据类型:数据仓库存储历史数据;数据库存储实时、在线数据
- 冗余设计:数据仓库设计需要引入冗余;数据库设计尽量避免冗余
8 分布式数据库
- 分布式数据库的构成:通常使用较小的计算机系统,每台计算机可单独放置在不同地方,每台计算机中可能有DBMS(数据库管理系统)的完整拷贝副本或部分拷贝副本,且具有自己局部的数据库。位于不同地点的多台计算机通过网络互相连接,共同组成一个完整的、全局逻辑上集中、物理上分布的大型数据库;
- 分布式数据库的核心
- 数据分片:突破中心化数据库单机的容量限制,将数据分散到多节点,以更灵活、高效的方式处理数据。分片方式包括:
- 水平分片:按行进行数据分割,数据被分割为一个个数据组,分散到不同节点上;
- 垂直分片:按列进行数据分割,一个数据表的模式被切割为多个子模式;
- 数据同步:由于数据库理论传统上建立在单机数据库基础上,引入分布式理论后,一致性原则被打破,因此需要引入数据库同步技术来帮助数据库恢复一致性;
- 数据分片:突破中心化数据库单机的容量限制,将数据分散到多节点,以更灵活、高效的方式处理数据。分片方式包括:
- 分布式数据库的特点:具有高可扩展性、高并发性、高可用性。