软考:软件设计师 — 3.数据库系统

三. 数据库系统

1. 数据库的基本概念

(1)数据库系统的体系结构

  • 集中式数据库系统

数据是集中的,数据管理也是集中的,数据库系统的素有功能都集中在 DBMS 所在的计算机。

  • C/S 结构

即客户端和系统端,客户端负责数据表示服务,服务器负责数据库服务,数据库系统分为前端和后端。如 ODBC、JDBC。

  • 分布式数据库

物理上分布、逻辑上集中;物理上分布,逻辑上分布;特点;透明性。

  • 并行数据库

共享内存式和无共享式。

分布式数据库特点:

  • 数据独立性:除了数据的逻辑独立性与物理独立性外,还有数据分布独立性。
  • 集中与自治共享结合的控制结构:各局部的 DBMS 可以独立地管理局部数据库,具有自治的功能。同时,系统又设有集中控制机制,协调各局部 DBMS 的工作,执行全局应用。
  • 适当增加数据冗余度:在不同的场地存储同一数据的多个副本,可以提高系统的可靠性和可用性,同时也能提高系统性能。

(提高系统的可用性是指,当系统中某个节点发生故障时,因为数据有其它副本在非故障场地上,对其它所有场地来说,数据仍然是可用的,从而保证数据的完备性。)

  • 全局的一致性、可串行性和可恢复性。

分布式数据库透明性:

  • 分片(分块)透明:用户不必关心数据是如何分片的,它们对数据的操作在全局关系上进行。
  • 复制透明:用户不用关心数据库在网络中各个节点的复制情况,被复制的数据的更新都由系统自动完成。
  • 位置透明:用户不必知道所操作的数据放在何处,即数据分配到哪个或哪些站点存储。
  • 局部映像透明性(逻辑透明):最低层次的透明性,该透明性提供数据到局部数据库的映像,即用户不必关心局部 DBMS 支持哪种数据模型、使用哪种数据操纵语言,数据模型和操纵语言的转换是由系统完成的。因此,局部映像透明性对异构型和同构异质的分布式数据库系统是非常重要的。

例题1:

在分布式数据库中有分片透明、复制透明、位置透明和逻辑透明等基本概念,其中:()是指局部数据模型透明,即用户或应用程序无需知道局部使用的是哪种数据模型;()是指用户或应用程序不需要知道逻辑上访问的表具体是如何分块存储的。

A.分片透明  B.复制透明  C.位置透明  D.逻辑透明

A.分片透明  B.复制透明  C.位置透明  D.逻辑透明

解析1:

根据数据库透明性的定义可知,局部数据模型透明是指逻辑透明,选 D。用户无需知道逻辑上访问的表具体是如何分块存储的,这是指分片透明。选 A。

例题2:

当某一场地故障时,系统可以使用其他场地上的副本而不至于使整个系统瘫痪。这称为分布式数据库的()。

A.共享性  B.自治性  C.可用性  D.分布性

解析2:

由分布式数据库特点可知,这是分布式数据库的可用性,选 C。共享性是指数据库系统所有数据都是共享的,没有完全分隔;自治性指的是各局部的 DBMS 可以独立地管理局部数据库;分布性指的是物理节点上的分布。

(2)三级模式和两级映像

外模式也称为用户模式,概念模式也称为模式,内模式也称为存储模式。

逻辑独立性:数据的逻辑结构发生变化后,用户程序不用修改。但是为了保证应用程序能够正确执行,需要修改外模式和概念模式之间的映射。

物理独立性:数据的物理结构发生变化后,应用程序不用修改。但是为了保证应用程序能够正确执行,需要修改内模式和概念模式之间的映射。

例题1:

数据库系统通常采用三级模式结构:外模式、模式和内模式。这三级模式分别对应数据库的()。

A.基本表、存储文件和视图。

B.视图、基本表和存储文件。

C.基本表、视图和存储文件。

D.视图、存储文件和基本表。

解析1:

由图示可知,外模式对应视图,模式对应基本表,内模式对应文件,选 B。

例题2:

以下关于数据库两级映像的叙述中,正确的是()。

A.模式/内模式映像实现了外模式到内模式之间的相互转换。

B.模式/内模式映像实现了概念模式到内模式之间的相互转换。

C.外模式/模式映像实现了概念模式到内模式之间的相互转换。

D.外模式/内模式映像实现了外模式到内模式之间的相互转换。

解析2:

由两种映像的定义可知,B 选项正确。其中,没有 D 选项这种映射关系。

例题3:

数据的物理独立性和逻辑独立性分别是通过修改()来完成的。

A.外模式与内模式之间的映像、模式与内模式之间的映像。

B.外模式与内模式之间的映像、外模式与模式之间的映像。

C.外模式与模式之间的映像、模式与内模式之间的映像。

D.模式与内模式之间的映像、外模式与模式之间的映像。

解析3:

由物理独立性和逻辑独立性的定义可知,D 选项正确。

(3)数据仓库

数据仓库的范围通常比数据库大得多。

数据仓库的特点:

  • 面向主题:数据按主题组织。
  • 集成的:消除了源数据中的不一致性,提供整个企业的一致性全局信息。
  • 相对稳定的(非易失的):主要进行查询操作,只有少量的修改和删除操作。
  • 反映历史变化(随着时间变化):记录了企业从过去某一时刻到当前各个阶段的信息,可对发展历程和未来趋势做定量分析和预测。

OLAP:联机分析

OLTP:联机事务

例题:

某集团公司下属有多个超市,每个超市的所有销售数据最终要存入公司的数据仓库中。假设该公司高管需要从时间、地区和商品种类三个维度来分析某家电商品的销售数据,那么最适合采用()来完成。

A.Data Extraction  B.OLAP  C.OLTP  D.ETL

解析:

从三个维度去分析商品的销售数据,采用 OLAP 联机分析更合适,它侧重于数据后期的处理过程。A 项数据提取是在数据预处理阶段,D 项就是数据预处理,C 项 OLTP 联机事务就是我们常用的数据库的数据处理方式,从数据的记录到增删改查等操作,侧重于事务。因此选 B。

2. 数据库设计过程

记住需求分析、概念结构设计、逻辑结构设计三个阶段的产物,以及规范化理论的应用是在逻辑结构设计阶段。

在物理设计阶段,聚簇索引会涉及到物理特性的修改。 

例题:

关系规范化在数据库设计的()。

A.需求分析  B.概念设计  C.逻辑设计  D.物理设计

解析:

根据数据库设计过程图示可知,关系规范化的应用是在数据库设计的逻辑设计阶段,选 C。

3. 概念结构设计

(1)概念设计过程

合并(集成) 局部模型的方法:

  • 多个局部 E-R 图一次集成。
  • 逐步集成,用累加的方式一次集成两个局部 E-R。

合并产生的冲突:(针对同一对象)

  • 属性冲突:包括属性域冲突和属性取值冲突。
  • 命名冲突:包括同名异义和异名同义。
  • 结构冲突:包括同一对象在不同应用中具有不同的抽象,以及同一实体在不同局部 E-R 图中所包含的属性个数和属性排列次序不完全相同。

(2)E-R 图

实体:实体是现实世界中可以区别于其它对象的事件或事物。(实体集是实体的集合)

属性:属性是实体某方面的特性。

联系:实体的联系分为实体内部的联系和实体与实体间的联系。实体间的联系类型有:1:1, *:1, *:*

属性的分类:

  • 简单属性和复合属性

简单属性是原子的,不可再分的;复合属性可以细分为更小的部分(即划分为别的属性)。

  • 单值属性和多值属性

定义的属性对于一个特定的实体都只有单独的一个值,称为单值属性;

在某些特定情况下,一个属性可能对应一组值,称为多值属性。

  • NULL 属性:表示无意义或不知道。
  • 派生属性:可以从其他属性得来。

联系的类型:

一对一(1:1);一对多(1:n);多对一(n:1);多对多(m:n)

一对多和多对一有方向性,应注意区分两个实体之间谁是一谁是多。

三元联系:

两个以上不同实体集之间的联系(三元联系);多重度的确定(可根据语义直接转换)

以三元关系中的一个实体作为中心,假设另两个实体都只有一个实例:

  • 若中心实体只有一个实例能与另两个实体的一个实例进行关联,则中心实体的连通数为 "一"。

 一个病房有多个病人和多名医生,一名医生只负责一个病房,一个病人只属于一个病房。

  • 若中心实体有多于一个实例能与另两个实体的实例进行关联,则中心实体的连通数为 "多"。

供应商为多个项目供应多种零件,每个项目可用多个供应商的零件,每种零件可由不同的供应商供应。

同一个实体集内的二元联系:

扩充的 E-R 模型: 

弱实体:在现实世界中有一种特殊的依赖联系,该联系是指某实体是否存在对于另一些实体具有很强的依赖关系,即一个实体的存在必须以另一个实体为前提,而将这类实体称为弱实体,如家属与职工的联系,附件与邮件。

特殊化:在现实世界中,某些实体一方面具有一些共性,另一方面还具有各自的特性,一个实体集可以按照某些特征区分为几个子实体。

聚集:一个联系作为另一个联系的一端。

4. 逻辑结构设计

(1)关系模式相关概念 

从概念结构设计到逻辑结构设计实则就是转换为数据模型。

数据模型三要素:数据结构、数据操作、数据的约束条件。

常见的数据模型:层次模型;网状模型;关系模型;面向对象模型等

关系模型的结构:关系模式名称(属性 1,属性 2,……)

关系模型相关概念:

  • 目或度:关系模式中属性的个数。
  • 候选码(候选键):唯一标识元组,且无冗余。它可以有一个,也可以有多个,可以是单属性,也可以是多属性集合。
  • 主码(主键):任选一个候选码。
  • 主属性与非主属性:组成候选码的属性就是主属性,其它的就是非主属性。
  • 外码(外键):其它关系的主键。
  • 全码:关系模式的所有属性组是这个关系的候选码。

例如,学校中有关系模型:学生(学号,姓名,身份证号),成绩(学号,课程号,成绩)。

那么学生关系模型的目是 3,成绩关系模型的目是 3;学生关系模型的候选码有两个,学号和身份证号,为了减少冗余,任选其一即可,例如选学号。成绩关系模型的候选码是(学号,课程号)的组合键(注意:多个候选键和多个属性的组合候选键不同);那么学生关系模型中的主键就是学号,成绩关系模型的主键就是(学号,课程号);学生关系模型中,学号和身份证号是主属性,姓名是非主属性,成绩关系模型中,学号和课程号是主属性,成绩是非主属性;成绩中的学号是学生关系模型中的主键,是自己的外键;全码应当是所有属性组都是候选码。

关系的三种类型:

基本关系;查询表;视图表

完整性约束:

  • 实体完整性约束:主键唯一,非空。
  • 参照完整性约束:外键要么是其它关系的主键,要么为空(还未分配)。
  • 用户自定义完整性约束:不同用户有不同的定义,例如男女性别表示、年龄段等。

触发器可以完成复杂的完整性约束条件的设定。

(2)E-R 图转关系模式

一个实体型必须转换为一个关系模式。

联系转关系模式:

  • 一对一联系的转换

独立的关系模式:并入两端主键及联系自身属性。(主键:任一端主键)

归并(任意一端):并入另一端主键及联系自身属性。(主键:保持不变)

例如:

实体型必须转换为一个关系模式:(下划线表示主键)

校长(姓名,性别,职称,年龄)

学校(校名,地址,电话)

任职(任职时间,姓名,校名):联系转换为独立的关系模式,自身属性和两端主键,主键任选其一即可。

归并:两种归并方式

校长(姓名,性别,职称,年龄,任职时间,校名)

学校(校名,地址,电话)/

校长(姓名,性别,职称,年龄)

学校(校名,地址,电话,任职时间,姓名)

  • 一对多联系的转换

独立的关系模式:并入两端主键及联系自身属性。(主键:多端主键)

归并(多端):并入另一端主键及联系自身属性。(主键:保持不变)

例如:

实体型转关系模式:

客户(客户名,身份证号,地址,电话)

账户(账户号,余额)

存款者(开户时间,身份证号,账户号) :主键为多端的主键。

归并:一种方式,向多端归并

客户(客户名,身份证号,地址,电话)

账户(账户号,余额,开户时间,身份证号)

  • 多对多联系的转换

独立的关系模式:并入两端主键及联系自身属性。(主键:两端主键的组合键)

例如:

实体型转关系模式:

学生(学号,姓名,性别,年龄)

课程(课程号,课程名,老师)

考试(成绩,学号,课程号):主键为两端主键的组合键

无法进行归并。

总结:

联系类型

实体(独立关系模式)

联系(独立关系模式)联系(归并关系模式)归并特点
一对一并入任一端  
一对多并入多端
多对多×无法归并

 5. 关系代数

关系 S1
SnoSnameSdept
No0001MaryIS
No0003CandyIS
No0004JamIS
关系 S2
SnoSnameSdept
No0001MaryIS
No0008KatterIS
No0021TomIS

简单的关系代数运算:交集、并集、差集 

并集: 

S1 ∪ S2(并)
SnoSname

Sdept

No0001MaryIS
No0003CandyIS
No0004JamIS
No0008KatterIS
No0021TomIS

交集: 

S1 ∩ S2 (交)
SnoSname

Sdept

No0001MaryIS

差集:(有方向)

S1 - S2(差)
SnoSname

Sdept

No0003CandyIS
No0004JamIS
S2 - S1(差)
SnoSname

Sdept

No0008KatterIS
No0021TomIS

复杂的关系代数运算:笛卡尔积、投影、选择

笛卡尔积:

S1 × S2(笛卡尔积)
SnoSname

Sdept

SnoSname

Sdept

No0001MaryISNo0001MaryIS
No0001MaryISNo0008KatterIS
No0001MaryISNo0021TomIS
No0003CandyISNo0001MaryIS
No0003CandyISNo0008KatterIS
No0003CandyISNo0021TomIS
No0004JamISNo0001MaryIS
No0004JamISNo0008KatterIS
No0004JamISNo0021TomIS

投影: 

\pi _{Sno,Sname}(S1)(投影)
SnoSname
No0001Mary
No0003Candy
No0004Jam

选择:

\sigma _{Sno=No0008}(S2)(选择)
SnoSname

Sdept

No0008KatterIS

关于列名称的表达:S1.1 = S2.1 等价于 S1.No0001 = S2.No0001,如果要表达第一列的取值,使用 S1 = '1' 表达,加引号。

关系代数运算之自然连接:

关系 S1
SnoSnameSdept
No0001MaryIS
No0003CandyIS
No0004JamIS
关系 S2
SnoAge
No000123
No000821
No002122
S1\bowtie S2
SnoSname

Sdept

Age
No0001MaryIS23

属性列数:二者之和减去重复列数。3 + 2 - 1 = 4(重复的是 Sno 列)

元组行:同名属性列取值相等。(Sno 列的 No0001)

S1\bowtie S2 等价于 \pi _{1,2,3,5}(\sigma_{1=4} (S1\times S2))

S1 × S2(笛卡尔积)
SnoSnameSdeptSnoAge
No0001MaryISNo000123
No0001MaryISNo000821
No0001MaryISNo002122
No0003CandyISNo000123
No0003CandyISNo000821
No0003CandyISNo002122
No0004JamISNo000123
No0004JamISNo000821
No0004JamISNo002122

先进行笛卡尔积运算,得到的结果进行选择,第 1 列等于第 4 列(元组行),然后对第 1、2、3、5 列进行投影(属性列数),即可得到结果。

二者的性能对比:S1\bowtie S2 与 S1 × S2

前者自然连接的性能要更优。

在实际运算过程中,两侧的表格要尽量先进行压缩,再运算。即如果有筛选过程,就先进行筛选,然后再进行自然连接或笛卡尔积运算。

所以如果考虑性能,两侧运算表格要尽可能小。

在 SQL 语句中的表示:

SELECT(某属性列)FROM(某表)WHERE(判断条件)

选择的属性列是投影的结果;对应的表格如果有多个,则是笛卡尔积的结果;判断条件是选择。

如果 WHERE 有多个,可以用 AND 或 \wedge 表示,如果满足一个即可,可以用 OR 或 \vee 表示。

例题1:

给定关系R(A,B,C,D)和关系S(A,C,E,F),对其进行自然连接运算 R\bowtie S 后的属性列为()个;与 \sigma R.B> S.E(R\bowtie S) 等价的关系代数表达式为()。

A.4  B.5  C.6  D.8

A.\sigma _{2> 7}(R\times S)

B.\pi _{1,2,3,4,7,8}(\sigma _{1=5\wedge 2> 7\wedge 3=6}(R\times S))

C.\sigma _{2> '7'}(R\times S)

D.\pi _{1,2,3,4,7,8}(\sigma _{1=5\wedge 2> '7'\wedge 3=6}(R\times S))

解析1:

自然连接运算后属性列为二者之和减去重复列,即 4 + 4 - 2 = 6,所以第一个空选 C。自然连接运算等价于经过筛选的笛卡尔积运算,所以首先进行笛卡尔积 R × S,然后看题目给出的条件是,选择关系R中的B列大于关系S中的E列,也就是笛卡尔积结果表中第 2 列大于第 7列,2>7,但不要忘记同名列取值相等,即对元组行的选择,也就是第 1 列等于第 5 列(R.A = S.A),第 3 列等于第 6 列(R.C = S.C),1=5 和 3=6,最后进行投影,即二者之和减去重复列,投影第 1、2、3、4、7、8 列。这些条件需同时满足,所以用 AND 连接,或 \wedge,选项 B 正确。选项 A 没有考虑自然连接到笛卡尔积转换的条件,选项 CD 中 '7' 代表取值为 7,不是第 7 列。或者直接根据之前例子中自然连接与笛卡尔积之间的等价换算,快速排除 AC 项,D 项加引号的 7 代表取值,所以选 B。

例题2:

下列查询 B = "大数据"且 F = "开发平台",结果集属性列为 A、B、C、F 的关系代数表达式中,查询效率最高的是()。

A.\pi _{1,2,3,8}(\sigma 2='bigdata'\wedge 1=5\wedge3=6\wedge8='DP'(R\times S))

B.\pi _{1,2,3,8}(\sigma1=5\wedge3=6\wedge8='DP'(\sigma 2='bigdata'(R)\times S))

C.\pi _{1,2,3,8}(\sigma 2='bigdata'\wedge 1=5\wedge3=6(R\times \sigma4='DP' (S)))

D.\pi _{1,2,3,8}(\sigma1=5\wedge3=6(\sigma 2='bigdata'(R)\times \sigma4='DP'(S)))

解析2:

如果考虑性能,两侧运算表格要尽可能小。所以将关系R和S都经过筛选后再进行运算,表格会比只筛选一个关系或者不筛选要小得多,所以选项 D 正确。

6. 规范化理论

(1)规范化理论基本概念

函数依赖:

设 R(U) 是属性 U 上的一个关系模式,X 和 Y 是 U 的子集,r 为 R 的任一关系,如果对于 r 中的任意两个元组 u,v,只要有 u[X] = v[X],就有 u[Y] = v[Y],则称 X 函数决定 Y,或 Y 函数依赖于 X,记为 X→Y。

关系模式:R(A,B,C)

依赖集1:{AB -> C,A -> C},称为部分函数依赖。

依赖集2:{A -> B,B -> C},可得出 A -> C,称为传递函数依赖。通常情况下,将 A -> C 称为冗余依赖,因为无需声明,可推导得到。

Amstrong 公理体系:

关系模式 R<U,F> 有以下的推理规则,

  • A1.自反律:若 Y\subseteq X\subseteq U,则 X → Y 成立。
  • A2.增广律:若 Z\subseteq U 且 X → Y,则 XZ → YZ 成立。
  • A3.传递律:若 X → Y 且 Y → Z,则 X → Z 成立。

根据 A1,A2,A3 三条推理规则可以得出以下三条推论,

  • 合并规则:由 X → Y,X → Z,有 X → YZ。(A2,A3)
  • 伪传递规则:由 X → Y,WY → Z,有 WX → Z。(A2,A3)
  • 分解规则:由 X → Y 且 Z\subseteq Y,有 X → Z。(A1,A3)

图示法求候选键:

  • 将关系的函数依赖关系,用有向图的方式表示。
  • 找出入度为 0 的属性,并以该属性集合为起点,尝试遍历有向图,若能正常遍历图中所有结点,则该属性集即为关系模式的候选键。
  • 若入度为 0 的属性集不能遍历图中所有结点,则需要尝试性的将一些中间结点(既有入度,也有出度的结点)并入入度为 0 的属性集中,直至该集合能遍历所有结点,集合为候选键。

例题1:

给定关系 R(A1,A2,A3,A4)上的函数依赖集 F = {A1 -> A2,A3 -> A2,A2 -> A3,A2 -> A4} ,R 的候选键为()。

A.A1  B.A1A3  C.A1A3A4  D.A1A2A3

解析1:

可根据函数依赖画出有向图,

有图可知,A1 出入度分别是 1/0,A2 是 2/2,A3 是 1/1,A4 是 0/4。所以根据图示法求候选键的步骤,找出入度为 0 的结点,即 A1 结点,并且通过 A1 能够遍历其它所有结点,所以候选键是 A1,选 A。

例题2:

 关系模式 P(A,B,C,D,E,F,G,H,I,J)满足下列函数依赖:FD = {ABD -> E,AB -> G,B -> F,C -> J,CJ -> I,G -> H},求候选码。

解析2:

如果也画有向图的话会比较麻烦,而且可能出错,因为涉及到的结点较多,相对复杂。所以直接看依赖关系,E、F、G、H、I、J 入度都是 1,入度为 0 的属性是 ABCD 集合,通过集合 ABCD 能够遍历全图,通过 ABD 遍历 E,AB 遍历 G,B 遍历 F,C 遍历 J,CJ 遍历 I,G 遍历 H,所以集合(ABCD)就是候选键。

例题3:

关系 R(A,B,C)满足下列函数依赖:F {B -> C,B -> A,A -> BC},关系 R 的候选键为()。

A.AB  B.A和B  C.A和BC  D.AC和AB

解析3:

首先看出入度情况,A 出入度为 1/1,B 为 2/1,C 为 0/2,所有结点既有入度也有出度,所以找中间结点(既有出度也有入度),中间结点为 A和B。通过 A 能够找到 BC,通过 B 能够找到 A 和 C,所以 A 和 B都能遍历全图,它们都是候选键,所以选 B。

例题4:

关系模式 CSZ(CITY,ST,ZIP),其属性组上的函数依赖集为:F = {(CITY,ST)-> ZIP,ZIP -> CITY},问关系 CSZ 的候选键。

解析4:

函数依赖集用有向图表示如下所示,

其中,CITY 的出入度为 1/1,ST 的为 1/0,ZIP 的为 1/1,所以尝试将入度为 0 的 ST 遍历全图,但并不能,因为(CITY,ST)-> ZIP,所以候选键包含 ST,应该为(ST,CITY),以及(ST,ZIP)两个。因此所有属性都是主属性,无非主属性,是全码。

例题5:

若给定的关系模式为 R,U = {A,B,C},F = {AB -> C,C -> B},则关系 R()。

A.有两个候选键 AC 和 BC,并且有三个主属性。

B.有两个候选键 AC 和 AB,并且有三个主属性。

C.只有一个候选键 AC,并且有一个非主属性和两个主属性。

D.只有一个候选键 AB,并且有一个非主属性和两个主属性。

解析5:

先看各属性的出入度,A 为 1/0,B 为 1/1,C 为 1/1,入度为 0 的 A 无法独立遍历全图,所以候选键是包含 A 的集合,AB 能够遍历全图,AC 也能遍历全图,所以 AB 和 AC 是候选键,因此有三个主属性,选 B。

例题6:

给定关系模式 R(U,F),其中:U 为关系模式 R 中的属性集,F 是 U 上的一组函数依赖。假设 U = {A1,A2,A3,A4},F = {A1 -> A2,A1A2 -> A3,A1 -> A4,A2 -> A4},那么关系 R 的主键为()。函数依赖集 F 中的()是冗余的。

A.A1  B.A1A2  C.A1A3  D.A1A2A3

A.A1 -> A2  B.A1A1 -> A3  C.A1 -> A4  D.A2 -> A4

解析6:

首先看各属性的出入度,入度为 0 的是 A1,并且发现通过 A1 能够遍历全图,所以 A1 是主键,第一个空选 A。然后进一步推理发现,通过 A1 能遍历到 A2,然后 A2 又能遍历到 A4,A1A2 又能遍历到 A3,通过 A1 -> A2 和 A2 -> A4,能够推导得到 A1 -> A4,所以 A1 -> A4 依赖是冗余的,第二个空选 C。

例题7:

给定关系模式 R<U,F>,其中 U 为属性集,F 是 U 上的一组函数依赖,那么 Amstrong 公理系统的伪传递律是指()。

A.若 X -> Y,X -> Z,则 X -> YZ 为 F 所蕴含。

B.若 X -> Y,WY -> Z,则 XW -> Z 为 F 所蕴含。

C.若 X -> Y,Y -> Z 为 F 所蕴含,则 X -> Z 为 F 所蕴含。

D.若 X -> Y 为 F 所蕴含,且Z\subseteq U,则 XZ -> YZ 为 F 所蕴含。

解析7:

考察 Amstrong 6 条规则的定义。C 为传递律,D 为增广律,由二者可得出 B,伪传递律,选 B。A 为合并律。

(2)范式判断

在一些关系模式中可能会存在数据冗余、修改异常、插入异常、删除异常等问题,为了解决这些问题需要将关系进行分解。

第一范式(1NF):在关系模式 R 中,当且仅当所有域只包含原子值,即每个属性都是不可再分的数据项,则称关系模式 R 是第一范式。

例如,关系模式 R(系名称,高级职称人数)不满足 1NF,因为高级职称人数不是原子属性,仍然可以再分为教授、副教授等职称人数。

系名称高级职称人数
教授副教授
计算机系810
电子系65

第二范式(2NF):当且仅当关系模式 R 是第一范式,且每一个非主属性完全依赖候选键(没有不完全依赖)时,则称关系模式 R 是第二范式。

例如,关系模式 SC(学号,课程号,成绩,学分),其中:(学号,课程号)-> 成绩,课程号 -> 学分。 

候选键是(学号,课程号),非主属性是成绩和学分,存在非主属性学分不完全依赖于候选键,而是依赖于课程号,所以不满足第二范式。要解决这个问题,需要对关系进行拆分,即如果拆分成SC1(课程号,学分)和 SC2(学号,课程号,成绩),则满足第二范式。关系模式 SC1,候选键是课程号,非主属性学分完全依赖于课程号,关系模式 SC2,候选键是(学号,课程号),非主属性成绩完全依赖于候选键,都属于 2NF。

第三范式(3NF):当且仅当关系模式 R 是第二范式,且 R 中没有非主属性传递依赖于候选键时,则称关系模式 R 是第三范式。

例如,学生关系(学号,姓名,系号,系名,系位置),其中:学号 -> 姓名,学号 -> 系号,系号 -> 系名,系号 -> 系位置。

候选键是学号,只有一个,所以一定满足第二范式,因为不存在部分函数依赖(单属性候选键至少是 2NF)。但是有学号 -> 系号,系号 -> 系名,系号 -> 系位置的非主属性传递依赖于候选键,所以不满足第三范式。因此进行拆分,哪里不满足就拆哪里,即学生关系1(学号,姓名,系号)和学生关系2(系号,系名,系位置),两个关系均满足 3NF。

BC范式(BCNF):设 R 是一个关系模式,F 是它的依赖集,R 属于 BCNF 当且仅当其 F 中每个依赖的决定因素必定包含 R 的某个候选键。

例如,关系模式 STJ(S,T,J),分别表示学生,老师和课程。其中,每一名老师只教一门课程,每门课程有若干老师,某一学生选定某门课,就对应一个固定老师。其依赖关系为:T -> J,(S,J)-> T。候选键为(S,J)和(S,T),并且没有非主属性,所以满足第二三范式(没有非主属性,至少满足 3NF)。根据定义,F 中每个依赖的决定因素必定包含 R 的某个候选键,(S,J)包含(S,J),但 T 不包含(S,T),所以不满足 BC范式。

逐步优化,以解决插入异常、删除异常、数据冗余等问题。

1NF\supset 2NF\supset3NF\supset BCNF

范式属性不可再分非主属性部分函数依赖于候选键非主属性传递函数依赖于候选键函数依赖左侧决定因素包含候选键
1NF存在
2NF不存在存在
3NF不存在不存在不满足
BCNF不存在不存在满足

例题:

某公司数据库中的元件关系模式为 P(元件号,元件名称,供应商,供应商所在地,库存量),函数依赖集 F 如下所示:F = {元件号 -> 元件名称,(元件号,供应商)-> 库存量,供应商 -> 供应商所在地} 。元件关系模式的主键为(),该关系存在冗余及插入删除异常等问题,为了解决这一问题需要将元件关系分解为(),分解后的关系模式可以达到()。

A.元件号,元件名称  B.元件号,供应商  C.元件号,供应商所在地  D.供应商,供应商所在地

A.元件1(元件号,元件名称,库存量);元件2(供应商,供应商所在地)

B.元件1(元件号,元件名称);元件2(供应商,供应商所在地,库存量)

C.元件1(元件号,元件名称);元件2(元件号,供应商,库存量);元件3(供应商,供应商所在地)

D.元件1(元件号,元件名称);元件2(元件号,库存量);元件3(供应商,供应商所在地);元件4(供应商所在地,库存量)

A.1NF  B.2NF  C.3NF  D.4NF

解析:

首先找候选键,入度为 0 的属性,即(元件号,供应商)的集合,第一个空选 B。第二个空是拆分元件关系,但没有告诉是需要满足什么范式,首先看到题目中给出的依赖关系存在非主属性部分函数依赖于候选键,元件号 -> 元件名称,供应商 -> 供应商所在地,所以不满足 2NF。所以先将这部分进行拆分,得到(元件号,元件名称)和(供应商,供应商所在地),因此可以排除 AB 选项。A 选项中非主属性库存量完全依赖于(元件号,供应商),不完全依赖于元件号,所以不符合,B 选项同理。又由于存在依赖(元件号,供应商)-> 库存量,所以另一个拆分出的关系应该是(元件号,供应商,库存量),D 项是将(元件号,供应商)-> 库存量 依赖进行了拆分,这样就无法满足依赖条件,因为元件号自身无法决定库存量,同理供应商所在地也是,使得无法还原为最初的依赖关系,因此第二个空选 C。C 选项中,三个依赖关系,元件1 满足 3NF,元件2 满足 3NF,元件3 满足 3NF,所以分解后的关系模式可以达到 3NF。也是满足 BCNF 的。

(3)模式分解

保持函数依赖:

设数据库模型 ρ = {R1,R2,……,Rk} 是关系模式 R 的一个分解,F 是 R 上的函数依赖集,ρ 中每个模式 Ri 上的 FD 集是 Fi。如果 {F1,F2,……,Fk} 与 F 是等价的(即相互逻辑蕴含),那么称分解 ρ 保持 FD。

例如,设关系模式 R(U,F),其中 U = {A,B,C,D,E},F = {A -> BC,C -> D,BC -> E,E -> A},则分解 ρ1 = {R1(ABCE),R2(CD)}是否保持函数依赖?而分解 ρ2 = {R1(ABE),R2(CD)}是否保持函数依赖?

一个特性是,属性保留下来,那么响应的函数依赖也会随之保留下来。如 ρ1,R1 函数依赖是 ABCE,那么就存在依赖关系 A -> BC,BC -> E,E -> A,R2 函数依赖是 CD,那么就存在依赖关系 C -> D,所以分解的两个关系中函数依赖与原依赖是等价的,所以 ρ1 保持函数依赖。同理,ρ2的两个关系中函数依赖与原依赖不等价,缺少 A -> BC,BC -> E的依赖关系,所以 ρ2 不保持函数依赖。

但需要注意,冗余函数依赖不需要保留

例如,关系模式 R(U,F),其中 U = {A,B,C},F = {A -> B,B -> C,A -> C},则分解 ρ = {R1(AB),R2(BC)}是否保持函数依赖?

由 ρ 的两个函数依赖可得,A -> B 和 B -> C 两个依赖关系,但可以根据传递律推导出依赖 A -> C,所以 A -> C 属于冗余函数依赖,不需要保留。因此 ρ 也是保持函数依赖的。

无损分解:

所谓无损分解就是可以还原,有损分解就是无法还原。

无损连接分解是指将一个关系模式分解成若干个关系模式后,通过自然连接等运算仍能还原到原来的关系模式。

例如,有关系模式:成绩(学号,姓名,课程号,课程名,分数),函数依赖:学号 -> 姓名,课程号 -> 课程名,(学号,课程号)-> 分数。

将其分解为:成绩(学号,课程号,分数);学生(学号,姓名);课程(课程号,课程名)。

能够进行分解并还原的条件是:

  • 存在同名属性列
  • 该属性列为左侧决定因素的函数依赖保留下来

也就是说,首先看是否有同名属性列,是学号,并且以学号为左侧决定因素的函数依赖,学生(学号,姓名),学号 -> 姓名,保留下来了,所以可以还原为,成绩(学号,课程号,分数,姓名);继续看同名属性列,是课程号,并且以课程号为左侧决定因素的函数依赖,课程(课程号,课程名),课程号 -> 课程名,也保留下来了,所以可以继续还原,成绩(学号,课程号,分数,姓名,课程名)。因此是无损分解。

无损分解(表格法):(通用)

还是上述的关系模式,画出初始表如下,

学号姓名课程号课程名分数
成绩
学生
课程

依然是先找同名属性列,找到学号,存在以学号为左侧决定因素的依赖关系且保留,学号 -> 姓名,所以可以还原成绩关系中的姓名属性;再继续找同名属性列,下一个是姓名,但没有以姓名为左侧决定因素的依赖关系,所以跳过,下一个是课程号,存在依赖关系并且保留,课程号 -> 课程名,所以可以继续还原成绩关系中的课程名属性。这样就还原了所有初始的依赖关系,因此是无损分解。

下面再举一个保持函数依赖但是是有损分解的例子,

设 R = ABC,F = {A -> B},则分解 ρ = {R1(AB),R2(BC)},是否是无损分解?

依然是图示法,如下图:

ABC
R1(AB)
R2(BC)

首先看是否保持函数依赖,F = {A -> B},R1(AB),所以保持函数依赖。再来看是否是无损分解,先找到同名属性列 B,然后看是否存在以 B 为左侧决定因素的函数依赖并且保留(F 中只有 A -> B),发现并没有,所以无法继续还原,因此是有损的

如果分解 ρ = {R1(A),R2(BC)},那么 ρ 就是不保持函数依赖且有损

如果存在 R = ABCD,F = {A -> B,B -> C,C -> D},ρ = {R1(ABD),R2(BC)},那么 ρ 就是不保持函数依赖且无损

因此是否保持函数依赖和是否无损两个维度是独立的,可以形成四种情况。

无损分解(公式法):(仅限于分解只有两个子模式)

如果 R 的分解为 ρ = {R1,R2},F 为 R 所满足的函数依赖集合,分解 ρ 具有无损连接性的充分必要条件是:

R1\cap R2 \rightarrow (R1-R2) 或者 R1\cap R2 \rightarrow (R2-R1)

如果 R1 和 R2 的公共属性能够函数决定 R1 或 R2 中的其它属性,分解就具有无损连接性。

例如,设 R = ABC,F = {A -> B},则分解 ρ1 = {R1(AB),R2(AC)}与分解 ρ2 ={R1(AB),R2(BC)}是否都为无损分解?

先看 ρ1,R1\cap R2 = A,R1 - R2 = B,R2 - R1 = C,并且有 R1\cap R2 决定(R1 - R2),即 A -> B,也有 R1\cap R2 决定(R2 - R1),即 A -> C,所以 ρ1 是无损连接。再看 ρ2,R1\cap R2 = B,R1 - R2 = A,R2 - R1 = C,并不存在 R1\cap R2 决定(R1 - R2)和(R2 - R1),即 B -> A 和 B -> C,所以 ρ2 是有损分解。

例题:

设关系模式 R(U,F),其中:U = {A,B,C,D,E},F = {A -> B,DE -> B,CB -> E,E -> A,B -> D}。()为关系模式 R 的候选键,分解()是无损连接,并保持函数依赖。

A.AB  B.DE  C.DB  D.CE

A.ρ = {R1(AC),R2(ED),R3(B)}

B.ρ = {R1(AC),R2(E),R3(DB)}

C.ρ = {R1(AC),R2(ED),R3(AB)}

D.ρ = {R1(ABC),R2(ED),R3(ACE)}

解析:

求候选键的话先找入度为 0 的属性,是 C,因此没有 C 的选项都可以排除,第一个空选 D。第二个空答案都错误,但可以找一个相对接近的。ABCD 四个选项都是不保持函数依赖的,并且看到 AB 选项中不存在同名属性列,所以一定是有损的,先排除 AB。再看 CD 选项,由于分解有三个子模式,所以无法使用公式法,需要用图示法,如下图所示,

选项CABCDE
R1(AC)
R2(ED)
R3(AB)

先找同名属性列 A,存在并且保留以 A 为左侧决定因素的依赖关系,A -> B,所以可以还原 R1 中的 B 属性,下一个同名属性列是 B,但不存在以 B 为左侧决定因素的依赖关系 B -> D,所以无法继续还原,C 项为有损分解。

选项DABCDE
R1(ABC)
R2(ED)
R3(ACE)

先找同名属性列 A,存在且保留了 A -> B,所以可以还原 R3 中的 B 属性,下一个同名属性列是 B,不存在 B -> D 的依赖关系,所以继续看下一个 C,存在 BC -> E 的依赖关系且在 R3 中保留,所以可以还原 R1 中的 E 属性,继续看 E,存在 E -> A 的依赖关系,并且 R1 和 R3 中均保留了下来,所以可以继续还原 R2 中的 A 属性,然后在 R2 中可以继续利用之前的存在关系还原 B 属性,然后存在关系 DE -> B,且在 R2 中保留,因此可以还原 R1 和 R3 中的 D 属性,这样 R1 和 R3 都全部还原,所以选项 D 是无损连接。选择 D 更好。

7. SQL 语言

分类动词
数据查询SELECT
数据定义

CREATE、DROP、ALTER

数据操纵INSERT、UPDATE、DELETE
数据控制GRANT、REVOKE

(1)普通查询

SELECT [ALL | DISTINCT] <目标列表达式> [,<目标列表达式>] …

FROM <表名>[,<表名>]…

[WHERE<条件表达式>]

[GROUP BY<列名1> [HAVING<条件表达式>]]

[ORDER BY<列名2>[ASC | DESC]…]

其中,SELECT 语句对应关系代数中的投影运算 \pi;FROM 语句对应笛卡尔积;WHERE 语句对应选择运算 \sigma

例如,一个典型的 SQL 查询具有以下形式:

SELECT A1,A2,…,An

FROM R1,R2,…,Rm

WHERE P

对应关系代数表达式为 \prod _{A1,A2,...,An}(\sigma _{P}(R1\times R2\times ...\times Rm))

例题:

给定关系 R(A,B,C,D,E)与 S(B,C,F,G),那么与表达式\prod _{2,4,6,7}(\sigma _{2< 7}(R\bowtie S))等价的 SQL 语句如下:

SELECT()FROM R,S WHERE();

A.R.B,D,F,G 

B.R.B,E,S.C,F,G

C.R.B,R.D,S.C,F

D.R.B,R.C,S.C,F

A.R.B = S.B OR R.C = S.C OR R.B<S.G

B.R.B = S.B OR R.C = S.C OR R.B<S.C

C.R.B = S.B AND R.C = S.C AND R.B<S.G

D.R.B = S.B AND R.C = S.C AND R.B<S.C

解析:

根据 查询 SQL 语句与关系代数表达式的对应关系,SELECT 子句对应投影,投影第 2、4、6、7 列,即 R.B,R.D,S.F,S.G,不要忘记排除重复的 S.B 和 S.C,那么在投影时就是 R.B,D,F,G,因为 B 列有重复,所以需要标识所在关系,其它列不重复,无需标记。因此第一个空选 A。WHERE 子句对应选择,第 2 列小于第 7 列,即 R.B <S.G,但需注意表达式中使用了连接运算,所以不要忘记连接运算与笛卡尔积之间的转换条件,同名属性列取值相等,所以 R.B = S.B 和 R.C = S.C,同时满足以上条件,用 AND 连接,所以第二个空选 C。

(2)分组查询

[GROUP BY<列名1> [HAVING<条件表达式>]]

HAVING 条件子句只能与 GROUP BY 搭配使用。

处理类型处理子类语法
结果排序升序或降序ORDER BY  字段名  ASC | DESC
集函数统计COUNT([DISTINCT | ALL] <列名>)
计算一列值的总和SUM([DISTINCT | ALL] <列名>)
计算一列值的平均值AVG([DISTINCT | ALL] <列名>)
求一列值的最大值MAX([DISTINCT | ALL] <列名>)
求一列值的最小值MIN([DISTINCT | ALL] <列名>)
对结果分组将查询结果按列值分组GROUP BY <列名>
对分组结果筛选对分组结果筛选HAVING <条件表达式>

其中,DISTINCT 代表统计不重复的记录,只使用 COUNT 则是对全部记录的统计。 

例题:

某企业的工程项目管理系统的数据库中供应商关系 Supp、项目关系 Proj 和零件关系 Part 的 E-R 模型和关系模式如下:

Supp(供应商号,供应商名,地址,电话)

Proj(项目号,项目名,负责人,电话)

Part(零件号,零件名)

其中,每个供应商可以为多个项目供应多种零件,每个项目可由多个供应商供应多种零件。SP_P 需要生成一个独立的关系模式,其联系类型为()。给定关系模式 SP_P(供应商号,项目号,零件号,数量)查询至少供应了 3 个项目的供应商,输出其供应商号和供应零件数量的总和,并按供应商号降序排列。

SELECT 供应商号,SUM(数量)FROM()

GROUP BY供应商号

()

ORDER BY 供应商号 DESC; 

A.*:*:*  B.1:*:*  C.1:1:*  D.1:1:1

A.Supp  B.Proj  C.Part  D.SP_P

A.HAVING COUNT(项目号)>2

B.HAVING COUNT(DISTINCT(项目号))>2

C.WHERE COUNT(项目号)>2

D.WHERE COUNT(DISTINCT(项目号))>2

解析:

由每个供应商可以为多个项目供应多种零件,每个项目可由多个供应商供应多种零件可得,该关系模式的联系类型为多对多对多,选 A。SQL 语句的填写,要查供应商号和数量,所以只查一个表是不够的,因此查给定的新关系模式 SP_P,选 D;要查询至少供应了 3 个项目的供应商,因为有可能存在一个供应商供应了 2 个项目但是给其中一个项目供应了 2 次,所以如果只用 COUNT 查出来的结果仍是 3,但此处需要查到供应了至少 3 个项目,所以需要 DISTINCT 避免统计重复项,并且 GROUP BY 与 HAVING 搭配使用,所以选 B。

(3)权限控制

授权:

GRANT <权限 >[, …n]

ON <对象类型><对象名>

TO <用户>[, …n]

WITH GRANT OPTION(指定了该语句,代表获得了权限的用户还可以将权限赋给其它用户。)

收回权限:

REVOKE <权限 >[, …n]

ON <对象类型><对象名>

FROM <用户>[, …n]

[RESTRICT | CASCADE]

CASCADE 代表级联收回,即将被赋予权限的用户又赋予给其它对象的权限收回。

8. 并发控制

 关于数据库的并发控制部分,可以参考之前的文章:Java知识点整理 3 — 数据库

(1)事务的特性

事务是逻辑上的一组操作,要么都执行,要么都不执行。

四个特性:(ACID)

  • 原子性(Atomicity):事务是最小的执行单位,不允许分隔,要么都做,要么都不做。
  • 一致性(Consistency):事务执行的结果必须保证数据库从一个一致性状态变成另一个一致性状态。如转账,转帐前两个账户都有1000元,转账100元后,应该为一个900一个1100。
  • 隔离性(Isolation):多个事务并发执行时,任一事务的更新操作直到其成功提交的整个过程,对其它事务是不可见的。
  • 持久性(Durability):一旦事务成功提交,即使数据库崩溃,其对数据库的更新操作也永久有效。

事务在执行过程中的四种状态:BEGIN、END、COMMIT、ROLLBACK。

数据库中写数据时是先写入日志,然后再写入数据库,有 COMMIT 标志代表已经将数据成功写入数据库。如果在这个过程中数据库发生崩溃,重启后数据库管理系统会去扫描日志,会将有 COMMIT 提交标志的事务放到 REDO 队列中,进行重新执行。

例题:

事务的()是指,当某个事务提交(COMMIT)后,对数据库的更新操作可能还停留在服务器磁盘缓冲区而未写入到磁盘时,即使系统发生故障,事务的执行结果仍不会丢失。

A.原子性  B.一致性  C.隔离性  D.持久性

解析:

根据事务四大特性的定义可知,此处应为持久性,选 D。

(2)并发问题

并发事务可能产生的问题有:

  • 脏读

事务 A 读取数据并对数据进行了修改,这个修改对其他事务来说是可见的,即使当前事务没有提交。这时事务 B 读取了这个还未提交的数据,但事务A突然回滚,导致数据没有提交到数据库,那事务 B 读到的就是脏数据。

例如:事务 A 读取数据 X = 20,并执行修改操作,X = X - 1,即现在 X = 19,此时事务 B 读取了数据 A,并读到 X = 19,但此时事务 A 还未提交,并进行 ROLLBACK,恢复为 20,导致事务 B 读到的就是脏数据 19。

  • 丢失修改

事务 A 读取一个数据时,事务 B 也读取了该数据,在事务 A 修改了这个数据后,事务 B 也随之修改了这个数据。这样事务 A 的修改结果就被覆盖(丢失)。

例如:事务 A 读取表中的数据 X = 20,事务 B 也读取 X = 20,事务 A 先修改 X= X - 2,事务 B 后来也修改 X = X - 1,最终结果 X = 18,事务 A 的修改被丢失。

  • 不可重复读

事务 A 多次读同一数据。在这个事务还没结束时,事务 B 也访问该数据。那么,在事务 A 中的两次读数据之间,由于事务 B 的修改导致事务 A 两次读取的数据不一样。

例如:事务 A 读取表中的数据 A = 20,事务 B 也读取 X = 20,事务 B 修改 X = X - 1,事务 A 再次读取 X = 19,此时读取的结果和第一次读取的结果不同。

这其中还涉及到并发事务的控制方式与 SQL 的隔离级别等内容,详情可以参考文章:Java知识点整理 3 — 数据库

(3)封锁协议

针对并发过程中产生的问题,可以对数据进行加锁来处理。

  • 共享锁(S 锁):又称读锁,事务在读取记录的时候获取共享锁,允许多个事务同时获取(锁兼容),也就是一个事务对数据添加了 S 锁后,其它事务也能继续添加 S 锁。
  • 排他锁(X 锁):又称写锁/独占锁,事务在修改记录的时候获取排他锁,不允许多个事务同时获取。如果一个记录已经被加了排他锁,那其它事务不能再对这条记录加任何类型的锁(锁不兼容)。

两段封锁协议,是指所有事务必须分两个阶段对数据项加锁和解锁。第一阶段是获得封锁,事务可以获得任何数据项上的任何类型的锁,但不能释放;第二阶段是释放封锁,事务可以释放任何数据项上的任何类型的锁,但不能申请。

数据库部分的内容至此结束,后续如果有补充或修改会直接添加。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Phoenixxxxxxxxxxxxx

感谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值