《数据库系统》复习要点

文章目录

《数据库系统》复习要点

一、基础知识

1.数据库系统的构成要素包括哪些?

1、硬件

构成计算机系统的各种物理设备,包括存储所需的外部设备。硬件的配置应满足整个数据库系统的需要。

2、软件

包括操作系统、数据库管理系统及应用程序。数据库管理系统(databasemanagementsystem,DBMS)是数据库系统的核心软件,是在操作系统的支持下工作,解决如何科学地组织和存储数据,如何高效获取和维护数据的系统软件。其主要功能包括:数据定义功能、数据操纵功能、数据库的运行管理和数据库的建立与维护。

数据库系统的组成要素

3、数据库

是指长期存储在计算机内的,有组织,可共享的数据的集合。数据库中的数据按一定的数学模型组织、描述和存储,具有较小的冗余,较高的数据独立性和易扩展性,并可为各种用户共享。

4、人员

第一类为系统分析员和数据库设计人员:系统分析员负责应用系统的需求分析和规范说明,他们和用户及数据库管理员一起确定系统的硬件配置,并参与数据库系统的概要设计。数据库设计人员负责数据库中数据的确定、数据库各级模式的设计。

第二类为应用程序员,负责编写使用数据库的应用程序。这些应用程序可对数据进行检索、建立、删除或修改。

第三类为最终用户,他们利用系统的接口或查询语言访问数据库。

第四类用户是数据库管理员(databaseadministrator,DBA),负责数据库的总体信息控制。DBA的具体职责包括:具体数据库中的信息内容和结构,决定数据库的存储结构和存取策略,定义数据库的安全性要求和完整性约束条件,监控数据库的使用和运行,负责数据库的性能改进、数据库的重组和重构,以提高系统的性能。

2.数据库系统的体系结构特点有哪些?

结构化

数据库系统实现了整体数据的结构化,这是数据库的最主要的特征之一。这里所说的“整体”结构化,是指在数据库中的数据不再仅针对某个应用,而是面向全组织;不仅数据内部是结构化,而且整体式结构化,数据之间有联系。

共享性

因为数据是面向整体的,所以数据可以被多个用户、多个应用程序共享使用,可以大大减少数据冗余,节约存储空间,避免数据之间的不相容性与不一致性。

独立性

1、数据独立性

数据独立性包括数据的物理独立性和逻辑独立性

物理独立性是指数据在磁盘上的数据库中如何存储是由DBMS管理的,用户程序不需要了解,应用程序要处理的只是数据的逻辑结构,这样一来当数据的物理存储结构改变时,用户的程序不用改变。

逻辑独立性是指用户的应用程序与数据库的逻辑结构是相互独立的,也就是说,数据的逻辑结构改变了,用户程序也可以不改变。

数据与程序的独立,把数据的定义从程序中分离出去,加上存取数据的由DBMS负责提供,从而简化了应用程序的编制,大大减少了应用程序的维护和修改。 [1]

2.数据由DBMS统一管理和控制

数据库的共享是并发的(concurrency)共享,即多个用户可以同时存取数据库中的数据,甚至可以同时存取数据库中的同一个数据。

DBMS必须提供以下几方面的数据控制功能:

数据的安全性保护(security)

数据的完整性检查(integrity)

数据库的并发访问控制(concurrency)

数据库的故障恢复(recovery)

3.数据库系统的体系结构特征是什么?

三级模式结构和两级映象,即:外模式、模式、内模式、外模式/模式映象、模式/内模式映象。

数据库系统的体系结构是指数据库系统的整个体系的结构。数据库系统的体系结构从不同的角度可有不同的划分方式。从数据库管理系统的角度可分为三层,从外到内依次为外模式、模式和内模式。 模式是所有数据库用户的公共数据视图,是数据库中全部数据的逻辑结构和特征的描述。模式(schema)又可细分为概念模式(conceptual schema)和逻辑模式(109ical schema)。

一、数据库的三级模式结构

数据库系统的三级模式结构是指模式、外模式、内模式。下面分别介绍:

模式

模式也称逻辑模式或概念模式,是数据库中全体数据的逻辑结构和特征的描述。是所有用户的公共数据视图。一个数据库只有一个模式。模式处于三级结构的中间层。定义模式时不仅要定义数据的逻辑结构、而且要定义数据之间的联系,定义与数据有关的安全性、完整性要求。

外模式

外模式也称用户模式、它是数据库用户(包括应用程序员和最终用户)能够看见和使用的局部数据的逻辑结构和特征的描述,是数据库用户的数据视图,是与某一应用有关的数据的逻辑表示。外模式是模式的子集,一个数据库可以有多个模式。

内模式

内模式也称存储模式、一个数据库只有一个内模式。它是数据物理结构和存储方式的描述,是数据在数据库内部的表示方式。

二、三级模式之间的映射

为了能在在内部实现数据库的三个抽象层次的联系和转换,数据库管理系统在三级模式之间提供了两层映射,分别是外模式/模式映射和模式/内模式映射,下面分别介绍:

外模式/模式映射

对于同一个模式可以有任意多个外模式,对于每一个外模式,数据库系统都有一个外模式/模式映射。当模式被改变时,数据库管理员对各个外模式/模式映射做出相应的改变,可以使外模式保持不变。这样,依据数据外模式边写的应用程序就不用修改,保证了数据与程序的逻辑独立性。

模式/内模式映射

数据库只有一个模式和一个内模式、所以模式/内模式的映射是唯一的,它定义了数据库的全局逻辑结构与存储结构之间的对应关系。当数据库的存储结构被改变时,数据库管理员对模式/内模式映射做相应的改变、可以使模式保持改变,应用程序相应地也不做变动。这样保证了数据与程序的独立性。

4.DBMS的主要功能有哪些?

(1)数据定义功能。DBMS提供相应数据语言来定义(DDL)数据库结构,它们是刻画数据库框架,并被保存在数据字典中。

(2)数据存取功能。DBMS提供数据操纵语言(DML),实现对数据库数据的基本存取操作:检索,插入,修改和删除。

(3)数据库运行管理功能。DBMS提供数据控制功能,即是数据的安全性、完整性和并发控制等对数据库运行进行有效地控制和管理,以确保数据正确有效。

(4)数据库的建立和维护功能。包括数据库初始数据的装入,数据库的转储、恢复、重组织,系统性能监视、分析等功能。

(5)数据库的传输。DBMS提供处理数据的传输,实现用户程序与DBMS之间的通信,通常与操作系统协调完成。

5.数据库系统的三级模式结构、二级映象功能与数据独立性

数据库系统的三级模式结构
三级模式:外模式、模式、内模式
模式

又称逻辑模式,DB的全局逻辑模式,即DB中全体数据的逻辑结构和特征的描述。
模式只涉及到型的描述,不涉及具体的值,反映的是数据的结构及其联系;模式承上启下,是DB设计的关键;DBS提供模式DDL来定义模式;一个数据库只有一个模式。
模式定义的任务:定义全局逻辑结构;定义有关的安全性、完整性的要求;定义记录间的联系。

外模式

又称子模式或用户模式。DB的局部逻辑结构
外模式是某个用于的数据视图,模式是所有用户的公共数据视图;独立于存储模式和存储设备;一个DB只能有一个模式,但可以有多个外模式外模式是模式的子集。
外模式的用途:保证数据库安全性的一个有力措施;每个用户只能看见和访问所对应的外模式中的数据。

内模式

又称存储模式。数据的物理结构和存储方式的描述,即DB中数据的内部表示方式。
一个数据库只有一个内模式,DBS提供内模式DDL;独立于具体的存储设备
内模式定义的任务:记录存储格式;索引组织方式;数据是否具有压缩、是否加密等。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CWbHnnwu-1610285858839)(file:///C:\Users\阿怪\AppData\Local\Temp\ksohtml16620\wps1.jpg)]

数据库的二级映像及其数据的独立性
二级映像在数据库管理系统内部实现这三个抽象层次的联系转换
外模式/模式 映像

对于同一个模式可以有任意多个外模式对于每一个外模式,数据库系统都有一个外模式/模式映像。
当模式改变时,由数据库管理员对各个外模式/模式的映像作相应的改变,可以使外模式保持不变。应用程序是一局数据的外模式编写的,从而应用程序不必修改,保证了数据与程序的独立性,简称数据的逻辑独立性

模式/内模式 映像

数据库中只有一个模式,也只有一个内模式,所以模式/内模式映像是唯一的。该映像定义通常包括在模式描述中,当数据库的存储机构改变了(即内模式发生改变),数据库管理员修改模式/内模式映像,使模式保持不变。应用程序不受影响,保证了数据与程序的物理独立性,简称数据的物理独立性

6.什么是数据库系统的逻辑独立性和物理独立性?DBMS是如何实现的?

数据与程序的的逻辑独立性:

当模式改变时(例如增加新的关系,新的属性,改变属性的数据类型等),由数据库管理员对各个外模式/模式的映像做相应的改变,可以使外模式保持不变。应用程序是依据数据的外模式编写的,从而应用程序不必修改,保证了数据与程序的逻辑独立性,简称数据的逻辑独立性。

数据于程序的物理独立性:

当数据库的存储结构改变了,由数据库管理员对模式/内模式映像做响应的改变,可以使模式保持不变,从而应用程序也不必改变,保证了数据与程序的物理独立性,简称数据的物理独立性。

数据库管理系统在三级模式之间提供的两层映像保证了数据库系统中的数据能够具有较高的逻辑独立性和物理独立性

7.掌握用关系代数表达式写查询

8. 常见的数据逻辑模型有哪些?

层次模型、网状模型、关系模型

1、层次模型:

①有且只有一个结点没有双亲结点(这个结点叫根结点)。

②除根结点外的其他结点有且只有一个双亲结点。

层次模型中的记录只能组织成树的集合而不能是任意图的集合。在层次模型中,记录的组织不再是一张杂乱无章的图,而是一棵"倒长"的树。

2、网状模型 :

①允许一个以上的结点没有双亲结点。

②一个结点可以有多个双亲结点。

网状模型中的数据用记录的集合来表示,数据间的联系用链接(可看作指针)来表示。数据库中的记录可被组织成任意图的集合。

3、关系模型:

①关系模型用表的集合来表示数据和数据间的联系。

②每个表有多个列,每列有唯一的列名。

在关系模型中,无论是从客观事物中抽象出的实体,还是实体之间的联系,都用单一的结构类型。

9.数据模型的构成要素有哪三个?

数据模型所描述的内容有3个部分,分别是数据结构、数据操作和数据约束。

1、数据结构

数据结构用于描述系统的静态特征,包括数据的类型、内容、性质及数据之间的联系等。它是数据模型的基础,也是刻画一个数据模型性质最重要的方面。在数据库系统中,人们通常按照其数据结构的类型来命名数据模型。例如,层次模型和关系模型的数据结构就分别是层次结构和关系结构。

2、数据操作

数据操作用于描述系统的动态特征,包括数据的插入、修改、删除和查询等。数据模型必须定义这些操作的确切含义、操作符号、操作规则及实现操作的语言。

3、数据约束

数据的约束条件实际上是一组完整性规则的集合。完整性规则是指给定数据模型中的数据及其联系所具有的制约和存储规则,用以限定符合数据模型的数据库及其状态的变化,以保证数据的正确性、有效性和相容性。例如,限制一个表中学号不能重复,或者年龄的取值不能为负,都属于完整性规则。

10.SQL语言有哪些功能和特点?

sql语言的功能

**1、sql数据定义功能:**能够定义数据库的三级模式结构,即外模式、全局模式和内模式结构。在sql中,外模式有叫做视图(View),全局模式简称模式( Schema),内模式由系统根据数据库模式自动实现,一般无需用户过问。

**2、sql数据操纵功能:**包括对基本表和视图的数据插入、删除和修改,特别是具有很强的数据查询功能。

**3、sql的数据控制功能:**主要是对用户的访问权限加以控制,以保证系统的安全性。

sql语言特点

1、sql风格统一

sql可以独立完成数据库生命周期中的全部活动,包括定义关系模式、录人数据、建立数据库、査询、更新、维护、数据库重构、数据库安全性控制等一系列操作

这为数据库应用系统开发提供了良好的环境,在数据库投入运行后,还可根据需要随时逐步修改模式,且不影响数据库的运行,从而使系统具有良好的可扩充性。

2、高度非过程化

非关系数据模型的数据操纵语言是面向过程的语言,用其完成用户请求时,必须指定存取路径。

sql进行数据操作,用户只需提出“做什么”,而不必指明“怎么做”,因此用户无须了解存取路径,存取路径的选择以及sql语句的操作过程由系统自动完成。这不但大大减轻了用户负担,而且有利于提高数据独立性。

3、面向集合的操作方式

sql采用集合操作方式,不仅查找结果可以是元组的集合,而且一次插入、删除、更新操作的对象也可以是元组的集合。

4、以同一种语法结构提供两种使用方式

sql既是自含式语言,又是嵌人式语言。

作为自含式语言,它能够独立地用于联机交互的使用方式,用户可以在终端键盘上直接输入sql命令对数据库进行操作。

作为嵌入式语言,sql语句能够嵌入到高级语言(如C、 C#、JAVA)程序中,供程序员设计程序时使用。而在两种不同的使用方式下,sql的语法结构基本上是一致的。

这种以统一的语法结构提供两种不同的操作方式,为用户提供了极大的灵活性与方便性。

5、语言简洁,易学易用

sql功能极强,但由于设计巧妙,语言十分简洁,完成数据定义、数据操纵、数据控制的核心功能只用了9个动词:

CREATE、 ALTER、DROP

SELECT、 INSERT、 UPDATE

DELETE、GRANT、 REVOKE

且sql语言语法简单,接近英语口语,因此容易学习,也容易使用。

11. 专门的关系运算有哪些?

1、选择运算

从关系中找出满足给定条件的那些元组称为选择。其中的条件是以逻辑表达式给出的,值为真的元组将被选取。这种运算是从水平方向抽取元组。 在FOXPRO中的短语FOR和WHILE均相当于选择运算。

如:LIST FOR 出版单位=‘高等教育出版社’ AND 单价<=20

2、投影运算

关系模式中挑选若干属性组成新的关系称为投影。这是从列的角度进行的运算,相当于对关系进行垂直分解。在FOXPRO中短语FIELDS相当于投影运算。 如: LIST FIELDS 单位,姓名

3、连接运算

连接运算是从两个关系的笛卡尔积中选择属性间满足一定条件的元组。

4、除法运算

在关系代数中,除法运算可理解为笛卡尔积的逆运算

设被除关系R为m元关系,除关系S为n元关系,那么它们的商为m-n元关系,记为R÷S。商的构成原则是:将被除关系R中的m-n列,按其值分成若干组,检查每一组的n列值的集合是否包含除关系S,若包含则取m-n列的值作为商的一个元组,否则不取。

5、外连接运算

运算:

选择和投影运算都是属于一目运算,它们的操作对象只是一个关系。联接运算是二目运算,需要两个关系作为操作对象。

1、联接

联接是将两个关系模式通过公共的属性名拼接成一个更宽的关系模式,生成的新关系中包含满足联接条件的元组。运算过程是通过联接条件来控制的,联接条件中将出现两个关系中的公共属性名,或者具有相同语义、可比的属性。联接是对关系的结合。在FOXPRO中有单独一条命令JOIN实现两个关系的联接运算。如:

SELE 1

USE 定单

SELE 2

USE 商品

JOIN WITH A TO XGX FOR A->货号=货 号 AND 库存量>=A->定购量

设关系R和S分别有m和n个元组,则R与S的联接过程要访问m×n个元组。由此可见,涉及到联接的查询应当考虑优化,以便提高查询效率。

2、自然联接

自然联接是去掉重复属性的等值联接。它属于联接运算的一个特例,是最常用的联接运算,在关系运算中起着重要作用。

如果需要两个以上的关系进行联接,应当两两进行。利用关系的这三种专门运算可以方便地构造新的关系。

3、外关键字

如果一个关系中的属性或属性组并非该关系的关键字,但它们是另外一个关系的关键字,则称为该关系的外关键字。

综上所述,关系数据库系统有如下特点:

(1)数据库中的全部数据及其相互联系都被组织成关系,即二维表的形式。

(2)关系数据库系统提供一种完备的高级关系运算,支持对数据库的各种操作。

(3)关系模型有严格的数学理论,使数据库的研究建立在比较坚实的数学基础上。

12. 关系的除法运算。

1、定义

给定关系R(X,Y)和S(Y,Z),其中X、Y、Z是属性组,做除运算的前提是两个关系具有相同的属性或属性组。可以看出关系R和关系S的相同属性组是Y。R中的Y与S中的可以有不同的属性名,但必须出自相同的域集(相同的数据类型)。

以下根据像集来定义:关系R除以关系S是一个新关系P(X),P是R中满足下列条件的元组:在X上分量值x的像集Yx包含S在Y上投影的集合。其中Yx为值x在R中的像集,有x=tr[x]。

R与S的除运算为:R÷S={tr[X]|tr∈RΛΠY(S)⊆Yx}

运算的结果是为了找出来tr[x],tr∈表示tr的条件是它本身属于R,πY(S)表示而且tr属于S关系对于Y属性组的投影,⊆Yx表示还要包含于分量值x的像集Yx。x=tr[x]表示运算后发现要找出来的关系组就是在X上的分量值x。

除操作是同时从行和列角度进行运算。 在进行除运算时,将被除关系R的属性分成两部分:与除关系相同的部分Y和不同的部分X。在被除关系中按X分组,即相同的X值的元组分为一组。出发的运算是求包括除关系中全部Y值的组,这些族中的X将做为除结果的元组。

2、像集

当t[X]=x时,x在R中的象集(Images Set)为:

Zx={ t[Z] | t ∈ R,t[X]=x }

它表示R中属性组为X上值为x的诸元组在Z上分量的集合,实际上就是所有值等于x的元组(或记录),然后在Z上的投影。

3、计算步骤

计算关系R除以关系S的步骤

  1. 将被除关系R的属性分像集属性和结果属性两部分:与除关系S相同的属性属于像集属性,不相同的属性属于结果属性。
  2. 求出被除关系R中X的各个分量的象集Yx(将被除关系分组,结果属性值X一样的元组分为一组。);
  3. 在除关系S中,求出与被除关系相同的属性(像集属性)Y的投影,得到除目标数据集合ΠY(S);
  4. 逐一考察每个组,比较像集Yx和除目标数据集合ΠY(S),选取满足ΠY(S)⊇Yx(像集属性值包括除目标属性集合),则对应的结果属性值应该属于该除法运算结果集。 [4]

4、性质

两个关系的除法运算可表示为:

R÷S=Πx®-Πx((Πx®×S)-R) [5]

5、示例

设关系R、S分别如下表所示。

ABC
a1b1c2
a2b3c7
a3b4c6
a1b2c3
a4b6c6
a2b2c3
a1b2c1

a1在R中的象集为{(b1,c2),(b2,c3),(b2,c1)}

a2在R中的象集为{(b3,c7), (b2,c3)}

a3在R中的象集为{(b4,c6)}

a4在R中的象集为{(b6,c6}

BCD
b1c2d1
b2c1d1
b2c3d2

S在(B,C)上的投影为{(b1,c2),(b2,c1),(b2,c3)},所以只有a1的像集(B,C)a1包含S在(B,C)属性组上的投影,即:R÷S={a1} [1]

A
a1

6、应用

学号Sno课程号Cno成绩Grade
201215121192
201215121285
201215121388
201215122290
201215122380

查询至少选修1号课程和3号课程的学生号码。

首先建立一个临时关系K,然后求ΠSno,Cno(SC)÷K。这里先求投影是为了简便运算书写,直接相除仍然包含K,有一样的结果。

课程号Cno
1
3

求解过程与示例类似,先对SC关系在(Sno,Cno)属性上投影,然后逐一求出每一学生(Sno)的像集,一次检查这些像集是否包含K。

结果为{201215121}

13. 关系的特点有哪些?

关系数据库的主要特点列举如下:

1、数据集中控制

在文件管理方法中,文件是分散的,这些文件之间一般是没有联系的,因此不能按照统一的方法来控制、维护和管理。而数据库则可以集中控制、维护和管理有关数据。

2、数据独立

数据库中的数据独立于应用程序,包括数据的物理独立性和逻辑独立性,给数据库的使用、调整、优化和进一步扩充提供了方便。

3、数据共享

数据库中的数据可以供多个用户使用,每个用户只与库中的一部分数据发生联系;用户数据可以重叠,用户可以同时存取数据而互不影响。

4、减少数据冗余

数据库中的数据不是面向应用,而是面向系统。数据统一定义、组织和存储,集中管理,避免了不必要的数据冗余。

5、数据结构化

整个数据库按一定的结构形式构成,数据在记录内部和记录类型之间相互关联,用户可通过不同的路径存取数据。

6、统一的数据保护功能

在多用户共享数据资源的情况下,对用户使用数据有严格的检查,对数据库规定密码或存取权限,以确保数据的安全性、并发控制。

扩展资料:

关系数据库,是建立在关系数据库模型基础上的数据库,借助于集合代数等概念和方法来处理数据库中的数据,同时也是一个被组织成一组拥有正式描述性的表格,这些表格中的数据能以许多不同的方式被存取或重新召集而不需要重新组织数据库表格。

关系数据库的定义造成元数据的一张表格或造成表格、列、范围和约束的正式描述。每个表格(有时被称为一个关系)包含用列表示的一个或更多的数据种类。 每行包含一个唯一的数据实体,这些数据是被列定义的种类。

14. 关系代数表达式与SQL语言转换。

15.数据库的完整性概念,各种完整性的定义。

一、完整性的概念

之所以要引入数据完整性是为了在数据的添加、删除、修改等操作中不出现数据的破坏或多个表数据不一致。数据完整性是指存储在数据库中的数据正确无误并且相关数据具有一致性。

二、完整性的类型

四类完整性约束:

  1. 域完整性约束:

  2. 实体完整性约束: PRIMARY KEY

  3. 引用完整性约束:FOREIGN KEY,REFERENCE

  4. 用户定义完整性约束: CHECK, DEFAULT, NOT NULL

1)实体完整性

**实体:**表中的记录,一个实体就是指表中的一条记录。

**实体完整性:**在表中不能存在完全相同的记录,且每条记录都要具有一个非空且不重复的主键值。

**实现实体完整性的方法:**设置主键、惟一索引、惟一约束。

2)域完整性

**域完整性:**向表中添加的数据必须与数据类型、格式及有效的数据长度相匹配。

**实现域完整性的方法:**CHECK约束、外键约束、默认约束、非空定义、规则以及在建表时设置的数据类型。

3)参照完整性

参照完整性:又称为引用完整性。是指通过主键与外键相联系的两个表或两个以上的表,相关字段的值要保持一致。

**实现实体完整性的方法:**外键约束。

4)用户定义的完整性

**用户定义的完整性:**是根据具体的应用领域所要遵循的约束条件由用户自己定义的特定的规则。

16. 什么是数据库的安全性?

数据库的安全性是指保护数据库以防止不合法使用所造成的数据泄露,更改和破坏。

17. 视图与表有什么区别?

区别:
1、视图是已经编译好的sql语句,而表不是。
2、视图没有实际的物理记录,而表有。
3、表bai是内容,视图是窗口。
4、表只用物理空间而视图不占用物理空间,视图只是逻辑概念的存在,表可以及时四对它进行修改,但视图只能有创建的语句来修改。
5、表是内模式,视图是外模式。
6、视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些SQL语句的集合。从安全的角度说,视图可以不给用户接触数据表,从而不知道表结构。
7、表属于全局模式中的表,是实表;视图属于局部模式的表,是虚表。
8、视图的建立和删除只影响视图本身,不影响对应的基本表。
联系:
1、视图(view)是在基本表之上建立的表,它的结构(即所定义的列)和内容(即所有数据行)都来自基本表,它依据基本表存在而存在。
2、一个视图可以对应一个基本表,也可以对应多个基本表,基于一个表也可以建立多个视图。视图是基本表的抽象和在逻辑意义上建立的新关系。
3、表可以建立各种触发器,可以建立索引,可以建立主健、约束等。但是视图不能建立这些对象(视图可以建立替代触发器)。表和视图可以更新,但是视图的更新受到约束。

18. 范式的定义以及各范式之间的关系。

关系数据库中的关系满足一定要求的,满足不同程度要求的为不同的范式。

满足最低要求的叫第一范式,简称1NF;

在第一范式的基础上满足进一步要求的称为第二范式,简称2NF,其余范式以此类推。

对于各种范式之间有如下关系:关系
如下图所示:
图

1. 第一范式 1NF

定义: 属于第一范式关系的所有属性都不可再分,即数据项不可分。

理解: 第一范式强调数据表的原子性,是其他范式的基础。如下图所示数据库就不符合第一范式:
错误

上表将商品这一数据项又划分为名称和数量两个数据项,故不符合第一范式关系。改正之后如下图所示:
正确

上表就符合第一范式关系。

但日常生活中仅用第一范式来规范表格是远远不够的,依然会存在数据冗余过大、删除异常、插入异常、修改异常的问题,此时就需要引入规范化概念,将其转化为更标准化的表格,减少数据依赖。

规范化: 一个低一级的关系模式通过模式分解可以转化为若干个高一级范式的关系模式的集合,这个过程叫做规范化。

2. 第二范式 2NF

定义: 若某关系R属于第一范式,且每一个非主属性完全函数依赖于任何一个候选码,则关系R属于第二范式。

此处我们需要理解非主属性、候选码和完全函数依赖的概念。

候选码: 若关系中的某一属性组的值能唯一地标识一个元组,而其子集不能,则称该属性组为候选码。若一个关系中有多个候选码,则选定其中一个为主码。

以下所有内容中,主码或候选码都简称为码。

例如下图所示的学生表中,学号和姓名都可以唯一标识一个元组,故该表的候选码为学号和姓名,主码我们可以随便选定其中一个,则选学号为主码。

学号姓名年龄性别
101刘晨19
102王琪21
103张宇20
104李琛19
105欧阳慧20

主属性: 所有候选码的属性称为主属性。不包含在任何候选码中的属性称为非主属性或非码属性。

在上面的学生表中,学号和姓名就是该关系的主属性,年龄和性别就是非主属性。

函数依赖: 设R(U)是属性集U上的关系模式,X、Y是U的子集。若对于R(U)的任意一个可能的关系r,r中不可能存在两个元组在X上的属性值相等,而在Y上的属性值不等,则称Y函数依赖于X或X函数确定Y。

完全函数依赖: 设R(U)是属性集U上的关系模式,X、Y是U的子集。如果Y函数依赖于X,且对于X的任何一个真子集X’,都有Y不函数依赖于X’,则称Y对X完全函数依赖。记作:如果Y函数依赖于X,但Y不完全函数依赖于X,则称Y对X部分函数依赖。
记号

理解: 第二范式是指每个表必须有一个(有且仅有一个)数据项作为关键字或主键(primary key),其他数据项与关键字或者主键一一对应,即其他数据项完全依赖于关键字或主键。由此可知单主属性的关系均属于第二范式。

判断一个关系是否属于第二范式:

  1. 找出数据表中的所有码;
  2. 找出所有主属性和非主属性;
  3. 判断所有的非主属性对码的部分函数依赖。

以上面的学生表为例,表中的码为学号(码可以为学号或者姓名,此处假定码为学号),非主属性为性别、年龄(其余都为主属性),当学号确定时,性别、年龄也都惟一的被确定为,故学生表的设计满足第二范式(学生表为单主属性的关系)。

下面举一个不满足第二范式的关系。
有关系模式S-L-C(Sno, Sdept, Sloc, Cno, Grade),其中Sno, Sdept, Sloc, Cno, Grade依次表示学生的学号、所在的系、住处、课程号、班级,并且每个系的学生住在同一个地方。可知S-L-C的码为(Sno, Cno),则存在以下函数依赖:

函数依赖关系

可以看到,非主属性Sloc、Sdept并不完全函数依赖于码,因此关系模式S-L-C(Sno, Sdept, Sloc, Cno, Grade)不符合第二范式。

3. 第三范式 3NF

定义: 非主属性既不传递依赖于码,也不部分依赖于码。

首先我们要理解传递函数依赖的概念。
传递依赖
理解: 第三范式要求在满足第二范式的基础上,任何非主属性不依赖于其他非主属性,即在第二范式的基础上,消除了传递依赖。

在下图S-L关系中,Sloc对Sno传递函数依赖,故该关系不属于第三范式。
在这里插入图片描述

4. BC范式 BCNF

定义: 关系模式R<U,F>中,若每一个决定因素都包含码,则R<U,F>属于BCFN。

理解: 根据定义我们可以得到结论,一个满足BC范式的关系模式有:

  1. 所有非主属性对每一个码都是完全函数依赖;
  2. 所有主属性对每一个不包含它的码也是完全函数依赖;
  3. 没有任何属性完全函数依赖于非码的任何一组属性。

例如有关系模式C(Cno, Cname, Pcno),Cno, Cname, Pcno依次表示课程号、课程名、先修课。可知关系C只有一个码Cno,且没有任何属性对Cno部分函数依赖或传递函数依赖,所以关系C属于第三范式,同时Cno是C中的唯一决定因素,所以C也属于BC范式。

5. 第四范式 4NF

定义: 限制关系模式的属性之间不允许有非平凡且非函数依赖的多值依赖。

理解: 显然一个关系模式是4NF,则必为BCNF。也就是说,当一个表中的非主属性互相独立时(3NF),这些非主属性不应该有多值,若有多值就违反了4NF。

6. 第五范式 5NF

第五范式有以下要求:
(1)必须满足第四范式;
(2)表必须可以分解为较小的表,除非那些表在逻辑上拥有与原始表相同的主键。

第五范式是在第四范式的基础上做的进一步规范化。第四范式处理的是相互独立的多值情况,而第五范式则处理相互依赖的多值情况。

19. 如何判断一个关系属于第几范式?

数据库范式1NF 2NF 3NF BCNF(实例)

设计范式(范式,数据库设计范式,数据库的设计范式)是符合某一种级别的关系模式的集合。构造数据库必须遵循一定的规则。在关系数据库中,这种规则就是范式。关系数据库中的关系必须满足一定的要求,即满足不同的范式。目前关系数据库有六种范式:

第一范式(1NF)

第二范式(2NF)

第三范式(3NF)

第四范式(4NF)

第五范式(5NF)

第六范式(6NF)

满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多要求的称为第二范式(2NF),其余范式以次类推。**一般说来,数据库只需满足第三范式(3NF)就行了。**下面我们举例介绍第一范式(1NF)、第二范式(2NF)和第三范式(3NF)。
在创建一个数据库的过程中,范化是将其转化为一些表的过程,这种方法可以使从数据库得到的结果更加明确。这样可能使数据库产生重复数据,从而导致创建多余的表。范化是在识别数据库中的数据元素、关系,以及定义所需的表和各表中的项目这些初始工作之后的一个细化的过程。
下面是范化的一个例子

Customer Item purchased Purchase price Thomas Shirt $40 Maria Tennis shoes $35 Evelyn Shirt $40 Pajaro Trousers $25

如果上面这个表用于保存物品的价格,而你想要删除其中的一个顾客,这时你就必须同时删除一个价格。范化就是要解决这个问题,你可以将这个表化为两个表,一个用于存储每个顾客和他所买物品的信息,另一个用于存储每件产品和其价格的信息,这样对其中一个表做添加或删除操作就不会影响另一个表。
关系数据库的几种设计范式介绍

1、第一范式(1NF)

在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。

所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。

在第一范式(1NF)中表的每一行只包含一个实例的信息。例如,对于图3-2 中的员工信息表,不能将员工信息都放在一列中显示,也不能将其中的两列或多列在一列中显示;员工信息表的每一行只表示一个员工的信息,一个员工的信息在表中只出现一次。简而言之,第一范式就是无重复的列。

2 、第二范式(2NF)

第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。如图3-2 员工信息表中加上了员工编号(emp_id)列,因为每个员工的员工编号是惟一的,因此每个员工可以被惟一区分。这个惟一属性列被称为主关键字或主键、主码。

**第二范式(2NF)要求实体的属性完全依赖于主关键字。**所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。简而言之,第二范式就是非主属性非部分依赖于主关键字。

3 、第三范式(3NF)

满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。例如,存在一个部门信息表,其中每个部门有部门编号(dept_id)、部门名称、部门简介等信息。那么在图3-2的员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有大量的数据冗余。简而言之,第三范式就是属性不依赖于其它非主属性。

数据库设计三大范式应用实例剖析

数据库的设计范式是数据库设计所需要满足的规范,满足这些规范的数据库是简洁的、结构明晰的,同时,不会发生插入(insert)、删除(delete)和更新(update)操作异常。反之则是乱七八糟,不仅给数据库的编程人员制造麻烦,而且面目可憎,可能存储了大量不需要的冗余信息。

范式说明:

**第一范式(1NF):**数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。
例如,如下的数据库表是符合第一范式的:
字段1 字段2 字段3 字段4
而这样的数据库表是不符合第一范式的:

​ 字段1 字段2 字段3 字段4
      字段3.1 字段3.2   
很显然,在当前的任何关系数据库管理系统(DBMS)中,傻瓜也不可能做出不符合第一范式的数据库,因为这些DBMS不允许你把数据库表的一列再分成二列或多列。因此,你想在现有的DBMS中设计出不符合第一范式的数据库都是不可能的。

**第二范式(2NF):**数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况),也即所有非关键字段都完全依赖于任意一组候选关键字。

假定选课关系表为SelectCourse(学号, 姓名, 年龄, 课程名称, 成绩, 学分),关键字为组合关键字(学号, 课程名称),因为存在如下决定关系:

(学号, 课程名称) → (姓名, 年龄, 成绩, 学分)

这个数据库表不满足第二范式,因为存在如下决定关系:

​ (课程名称) → (学分)
   (学号) → (姓名, 年龄)

即存在组合关键字中的字段决定非关键字的情况。
由于不符合2NF,这个选课关系表会存在如下问题:
(1) 数据冗余:
   同一门课程由n个学生选修,”学分”就重复n-1次;同一个学生选修了m门课程,姓名和年龄就重复了m-1次。
(2) 更新异常:
   若调整了某门课程的学分,数据表中所有行的”学分”值都要更新,否则会出现同一门课程学分不同的情况。
(3) 插入异常:
   假设要开设一门新的课程,暂时还没有人选修。这样,由于还没有”学号”关键字,课程名称和学分也无法记录入数据库。
(4) 删除异常:
   假设一批学生已经完成课程的选修,这些选修记录就应该从数据库表中删除。但是,与此同时,课程名称和学分信息也被删除了。很显然,这也会导致插入异常。

把选课关系表SelectCourse改为如下三个表:

​ 学生:Student(学号, 姓名, 年龄);
   课程:Course(课程名称, 学分);
   选课关系:SelectCourse(学号, 课程名称, 成绩)。

这样的数据库表是符合第二范式的, 消除了数据冗余、更新异常、插入异常和删除异常。
另外,所有单关键字的数据库表都符合第二范式,因为不可能存在组合关键字。

**第三范式(3NF):**在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。所谓传递函数依赖,指的是如果存在”A → B → C”的决定关系,则C传递函数依赖于A。因此,满足第三范式的数据库表应该不存在如下依赖关系:
   关键字段 → 非关键字段x → 非关键字段y
假定学生关系表为:

​ Student(学号, 姓名, 年龄, 所在学院, 学院地点, 学院电话)

关键字为单一关键字”学号”,因为存在如下决定关系:
   (学号) → (姓名, 年龄, 所在学院, 学院地点, 学院电话)
这个数据库是符合2NF的,但是不符合3NF,因为存在如下决定关系:
   (学号) → (所在学院) → (学院地点, 学院电话)
即存在非关键字段”学院地点”、”学院电话”对关键字段”学号”的传递函数依赖。
它也会存在数据冗余、更新异常、插入异常和删除异常的情况,读者可自行分析得知。
把学生关系表分为如下两个表:
   学生:(学号, 姓名, 年龄, 所在学院);
   学院:(学院, 地点, 电话)。
这样的数据库表是符合第三范式的,消除了数据冗余、更新异常、插入异常和删除异常。

**鲍依斯-科得范式(BCNF):**在第三范式的基础上,数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖则符合第三范式。
假设仓库管理关系表为StorehouseManage(仓库ID, 存储物品ID, 管理员ID, 数量),且有一个管理员只在一个仓库工作;一个仓库可以存储多种物品。这个数据库表中存在如下决定关系:
   (仓库ID, 存储物品ID) →(管理员ID, 数量)
   (管理员ID, 存储物品ID) → (仓库ID, 数量)
所以,(仓库ID, 存储物品ID)和(管理员ID, 存储物品ID)都是StorehouseManage的候选关键字,表中的唯一非关键字段为数量,它是符合第三范式的。但是,由于存在如下决定关系:
   (仓库ID) → (管理员ID)
   (管理员ID) → (仓库ID)
即存在关键字段决定关键字段的情况,所以其不符合BCNF范式。它会出现如下异常情况:
(1) 删除异常:
   当仓库被清空后,所有”存储物品ID”和”数量”信息被删除的同时,”仓库ID”和”管理员ID”信息也被删除了。
(2) 插入异常:
   当仓库没有存储任何物品时,无法给仓库分配管理员。
(3) 更新异常:
   如果仓库换了管理员,则表中所有行的管理员ID都要修改。
把仓库管理关系表分解为二个关系表:
   仓库管理:StorehouseManage(仓库ID, 管理员ID);
   仓库:Storehouse(仓库ID, 存储物品ID, 数量)。
这样的数据库表是符合BCNF范式的,消除了删除异常、插入异常和更新异常。

范式应用
我们来逐步搞定一个论坛的数据库,有如下信息:
   (1) 用户:用户名,email,主页,电话,联系地址
   (2) 帖子:发帖标题,发帖内容,回复标题,回复内容

第一次我们将数据库设计为仅仅存在表:
用户名 email 主页 电话 联系地址 发帖标题 发帖内容 回复标题 回复内容

这个数据库表符合第一范式,但是没有任何一组候选关键字能决定数据库表的整行,唯一的关键字段用户名也不能完全决定整个元组。我们需要增加”发帖ID”、”回复ID”字段,即将表修改为:
用户名 email 主页 电话 联系地址 发帖ID 发帖标题 发帖内容 回复ID 回复标题 回复内容

这样数据表中的关键字(用户名,发帖ID,回复ID)能决定整行:
   (用户名,发帖ID,回复ID) → (email,主页,电话,联系地址,发帖标题,发帖内容,回复标题,回复内容)

但是,这样的设计不符合第二范式,因为存在如下决定关系:
   (用户名) → (email,主页,电话,联系地址)
   (发帖ID) → (发帖标题,发帖内容)
   (回复ID) → (回复标题,回复内容)
即非关键字段部分函数依赖于候选关键字段,很明显,这个设计会导致大量的数据冗余和操作异常。

我们将数据库表分解为(带下划线的为关键字):
   (1) 用户信息:用户名,email,主页,电话,联系地址
   (2) 帖子信息:发帖ID,标题,内容
   (3) 回复信息:回复ID,标题,内容
   (4) 发贴:用户名,发帖ID
   (5) 回复:发帖ID,回复ID
这样的设计是满足第1、2、3范式和BCNF范式要求的,但是这样的设计是不是最好的呢?
   不一定。
观察可知,第4项”发帖”中的”用户名”和”发帖ID”之间是1:N的关系,因此我们可以把”发帖”合并到第2项的”帖子信息”中;第5项”回复”中的”发帖ID”和”回复ID”之间也是1:N的关系,因此我们可以把”回复”合并到第3项的”回复信息”中。这样可以一定量地减少数据冗余,新的设计为:

(1) 用户信息:用户名,email,主页,电话,联系地址
   (2) 帖子信息:用户名,发帖ID,标题,内容
   (3) 回复信息:发帖ID,回复ID,标题,内容

数据库表1显然满足所有范式的要求;

数据库表2中存在非关键字段”标题”、”内容”对关键字段”发帖ID”的部分函数依赖,即不满足第二范式的要求,但是这一设计并不会导致数据冗余和操作异常;

数据库表3中也存在非关键字段”标题”、”内容”对关键字段”回复ID”的部分函数依赖,也不满足第二范式的要求,但是与数据库表2相似,这一设计也不会导致数据冗余和操作异常。

由此可以看出,并不一定要强行满足范式的要求,对于1:N关系,当1的一边合并到N的那边后,N的那边就不再满足第二范式了,但是这种设计反而比较好!

对于M:N的关系,不能将M一边或N一边合并到另一边去,这样会导致不符合范式要求,同时导致操作异常和数据冗余。

对于1:1的关系,我们可以将左边的1或者右边的1合并到另一边去,设计导致不符合范式要求,但是并不会导致操作异常和数据冗余。

结论

满足范式要求的数据库设计是结构清晰的,同时可避免数据冗余和操作异常。这并意味着不符合范式要求的设计一定是错误的,在数据库表中存在1:1或1:N关系这种较特殊的情况下,合并导致的不符合范式要求反而是合理的。

20. 如何把一个不满足BCNF的关系分解为BCNF?

算法描述

输入:关系R0和其上的函数依赖集S0
输出:由R0分解出的关系集合,其中每个关系均属于BCNF

方法:下列步骤可以被递归地用于任意关系R和FD集合S。初始时,R=R0,S=S0。

检验R是否属于BCNF。如果是,不需要做任何事,返回{R}作为结果。

如果存在BCNF违例,假设为X→Y。计算X+。选择R1=X+作为一个关系模式,并使另一个关系模式R2包含属性X以及那些不在X+中的属性。

计算R1和R2的FD集,分别记为S1和S2。

递归地分解R1和R2。返回这些分解得到的结果集合。

举例

习题3.3.1 对于下列关系模式和FD集合:

a) R(A,B,C,D) FD{AB→C,C→D,D→A}
b) R(A,B,C,D) FD{B→C,B→D}
c) R(A,B,C,D) FD{AB→C,BC→D,CD→A,AD→B}
d) R(A,B,C,D) FD{A→B,B→C,C→D,D→A}
e) R(A,B,C,D,E) FD{AB→C,DE→C,B→D}
f) R(A,B,C,D,E) FD{AB→C,C→D,D→B,D→E}

做下列事情:
i) 指出所有违反BCNF的FD。不要忘记考虑那些不在上述集合中、但可以由它们推断出但FD。但是,没有必要给出右边含有不止一个属性但BCNF违例。
ii) 根据需要把关系分解为一系列属于BCNF的关系集合。

a) R(A,B,C,D) FD{AB→C,C→D,D→A}

非平凡FD(共14个):
C→A,C→D,D→A,AB→C,AB→D,
AC→D,BC→A,BC→D,BD→A,BD→C,
CD→A,ABC→D,ABD→C,BCD→A

键:AB、BC、BD

违反BCNF的FD(左侧不含键):C→A,C→D,D→A,AC→D,CD→A

可从C→D开始分解,C+=ACD
得到R1=C+=ACD,R2=BC

其中,BC是二元的,满足BCNF

对ACD,有C→A,C→D,D→A,AC→D,CD→A
C为键,D→A不符合BCNF,故仍需分解

D+=AD,分解为AD和CD,都满足BCNF

故分解结果为AD,CD,BC

b) R(A,B,C,D) FD{B→C,B→D}

键:AB
不满足BCNF
从B→C开始分解,B+=BCD,分解为BCD和AB,均满足BCNF

c) R(A,B,C,D) FD{AB→C,BC→D,CD→A,AD→B}

键:AB、BC、CD、AD
满足BCNF,不用分解

d) R(A,B,C,D) FD{A→B,B→C,C→D,D→A}

键:A、B、C、D
满足BCNF,不用分解

e) R(A,B,C,D,E) FD{AB→C,DE→C,B→D}

键:ABE
不满足BCNF

从AB→C开始分解,AB+=ABCD,分解为ABCD和ABE

对ABCD,键为AB,存在B→D不满足BCNF
分解B→D,B+=BD,分解为BD和ABC,均满足BCNF

对ABE,键为ABE,满足BCNF

故分解结果为ABC,BD,ABE

f) R(A,B,C,D,E) FD{AB→C,C→D,D→B,D→E}

键:AB、AC、AD
不满足BCNF

方式1:
从D→B开始分解,D+=BDE,分解为ABC,BDE

ABC的键是AB、AC,存在C→B不满足BCNF
分解C→B,C+=BC,分解为AC,BC,均满足BCNF

BDE的键是D,满足BCNF

故分解结果为AC,BC,BDE

方式2:
从C→D开始分解,C+=BCDE,分解为AC,BCDE

AC满足BCNF

BCDE的键为C,D→B不满足BCNF
分解D→B,D+=BDE,分解为CD,BDE

CD满足BCNF

BDE的键为D,满足BCNF

故分解结果为AC,CD,BDE

21. 实体联系转换成关系模式的方法。

1 、一个例子

E-R图如何转换为关系模型呢?我们先看一个例子。
在这里插入图片描述
图2.1是学生和班级的E-R图,学生与班级构成多对一的联系。根据实际应用,我们可以做出这个简单例子的关系模式:

学生(学号,姓名,班级)
班级(编号,名称)

“学生.班级”为外键,参照“班级.编号”取值。
这个例子我们是凭经验转换的,那么里面有什么规律呢?在2.2节,我们将这些经验总结成一些规则,以供转换使用。

2、 转换规则

(1) 一个实体型转换为一个关系模式
一般E-R图中的一个实体转换为一个关系模式,实体的属性就是关系的属性,实体的码就是关系的码。

(2) 一个1:1联系可以转换为一个独立的关系模式,也可以与任意一端对应的关系模式合并
在这里插入图片描述
图2.2是一个一对一联系的例子。根据规则(2),有三种转换方式:
(i)联系单独作为一个关系模式
此时联系本身的属性,以及与该联系相连的实体的码均作为关系的属性,可以选择与该联系相连的任一实体的码属性作为该关系的码。结果如下:

职工(工号,姓名)
产品(产品号,产品名)
负责(工号,产品号)

其中“负责”这个关系的码可以是工号,也可以是产品号。
(ii) 与职工端合并

职工(工号,姓名,产品号)
产品(产品号,产品名)

其中“职工.产品号”为外码。
(iii) 与产品端合并

职工(工号,姓名)
产品(产品号,产品名,负责人工号)

其中“产品.负责人工号”为外码。
(3) 一个1:n联系可以转换为一个独立的关系模式,也可以与n端对应的关系模式合并
在这里插入图片描述
(i) 若单独作为一个关系模式
此时该单独的关系模式的属性包括其自身的属性,以及与该联系相连的实体的码。该关系的码为n端实体的主属性。

顾客(顾客号,姓名)
订单(订单号,……)
订货(顾客号,订单号)

(ii) 与n端合并

顾客(顾客号,姓名)
订单(订单号,……,顾客号)

(4) 一个m:n联系可以转换为一个独立的关系模式
在这里插入图片描述
该关系的属性包括联系自身的属性,以及与联系相连的实体的属性。各实体的码组成关系码或关系码的一部分。

教师(教师号,姓名)
学生(学号,姓名)
教授(教师号,学号)

(5) 一个多元联系可以转换为一个独立的关系模式
与该多元联系相连的各实体的码,以及联系本身的属性均转换为关系的属性,各实体的码组成关系的码或关系码的一部分。

(6) 具有相同码的关系模式可以合并

(7) 有些1:n的联系,将属性合并到n端后,该属性也作为主码的一部分
这类问题多出现在聚集类的联系中,且部分实体的码只能在某一个整体中作为码,而在全部整体中不能作为码的情况下才出现(其它情况本人还没碰到,呵呵,欢迎指教)。
比如上篇文章介绍的管理信息系统中订单与订单细节的联系。
关于什么是聚集,2.3节介绍。

3、 数据抽象的分类

这部分本应在概念设计中介绍的,用到了才想起来,这里补充一下。
关于现实世界的抽象,一般分为三类:

**(1) 分类:**即对象值与型之间的联系,可以用“is member of”判定。如张英、王平都是学生,他们与“学生”之间构成分类关系。
**(2)聚集:**定义某一类型的组成成分,是“is part of”的联系。如学生与学号、姓名等属性的联系。
**(3)概括:**定义类型间的一种子集联系,是“is subset of”的联系。如研究生和本科生都是学生,而且都是集合,因此它们之间是概括的联系。

例:猫和动物之间是概括的联系,《Tom and Jerry》中那只名叫Tom的猫与猫之间是分类的联系,Tom的毛色和Tom之间是聚集的联系。
订单细节和订单之间,订单细节肯定不是一个订单,因此不是概括或分类。订单细节是订单的一部分,因此是聚集。

4、 数据模型的优化

有了关系模型,可以进一步优化,方法为:
(1) 确定数据依赖。
(2) 对数据依赖进行极小化处理,消除冗余联系(参看范式理论)。
(3) 确定范式级别,根据应用环境,对某些模式进行合并或分解。
以上工作理论性比较强,主要目的是设计一个数据冗余尽量少的关系模式。下面这步则是考虑效率问题了:
(4) 对关系模式进行必要的分解。
如果一个关系模式的属性特别多,就应该考虑是否可以对这个关系进行垂直分解。如果有些属性是经常访问的,而有些属性是很少访问的,则应该把它们分解为两个关系模式。
如果一个关系的数据量特别大,就应该考虑是否可以进行水平分解。如一个论坛中,如果设计时把会员发的主贴和跟贴设计为一个关系,则在帖子量非常大的情况下,这一步就应该考虑把它们分开了。因为显示的主贴是经常查询的,而跟贴则是在打开某个主贴的情况下才查询。又如手机号管理软件,可以考虑按省份或其它方式进行水平分解。

5、 设计用户子模式

这部分主要是考虑使用方便性和效率问题,主要借助视图手段实现,包括:
(1) 建立视图,使用更符合用户习惯的别名。
(2) 对不同级别的用户定义不同的视图,以保证系统的安全性。
(3) 对复杂的查询操作,可以定义视图,简化用户对系统的使用。
物理设计主要工作是选择存取方法(索引),以及确定数据库的存储结构,这里就不说明了。
好了,可以在你的DBMS上建表了。

22. 局部E-R图合并成全局E-R图时可能出现冲突有哪些?

合并分E-R图各个局部应用所面向的问题不同,**各个子系统的E-R图之间必定会存在许多不一致的地方,称之为冲突。**子系统E-R图之间的冲突主要有三类:
①属性冲突
②命名冲突
③结构冲突

①属性冲突
属性域冲突,即属性值的类型、取值范围或取值集合不同
例如零件号,有的部门把它定义为整数,有的部门把它定义为字符型。
年龄,某些部门以出生日期形式表示职工的年龄,而另一些部门用整数表示职工的年龄。
属性取值单位冲突
例如,零件的重量有的以公斤为单位,有的以斤为单位,有的以克为单位。

②命名冲突

  • 同名异义,即不同意义的对象在不同的局部应用中具有相同的名字
  • 异名同义(一义多名),即同一意义的对象在不同的局部应用中具有不同的名字
    如对科研项目,财务科称为项目,科研处称为课题,生产管理处称为工程。

命名冲突可能发生在实体、联系一级上,也可能发生在属性一级上。其中属性的命名冲突更为常见。
处理方式:通过讨论、协商等行政手段加以解决

③结构冲突

同一对象在不同应用中具有不同的抽象
例如,职工在某一局部应用中被当作实体,而在另一局部应用中则被当作属性。
解决方法:把属性变换为实体或把实体变换为属性,使同一对象具有相同的抽象。

同一实体在不同子系统的E-R图中所包含的属性个数和属性排列次序不完全相同。
解决方法:使该实体的属性取各子系统的E-R图中属性的并集,再适当调整属性的次序。

体间的联系在不同的E-R图中为不同的类型。

实体E1与E2在一个E-R图中是多对多联系,在另一个E-R图中是一对多联系
解决方法是根据应用的语义对实体联系的类型进行综合或调整。

23. 数据库设计包括哪几个阶段,各阶段主要任务是什么?

按照结构化系统设计的方法,考虑数据库及其应用系统开发的全过程,将数据库设计分为六个阶段:

1、需求分析

了解与分析用户需求(包括数据与处理、功能和性能需求)

2、概念结构设计

通过对用户需求进行综合、归纳与抽象,形成一个独立于具体数据库管理系统的概念模型。

主要采用E-R模型进行设计,包括画E-R图。

3、逻辑结构设计

将概念结构转化为某个数据库管理系统所支持的数据模型,并对其进行优化。

通过将E-R图转换成表,实现从E-R模型到关系模型的转换。

4、物理结构设计

为逻辑数据模型选取一个最适合应用环境的物理结构(包括存取结构和存取方法)。

5、数据库实施

设计人员运用数据库管理系统提供数据库语言以及其宿主语言,根据逻辑设计和物理设计的结果建立数据库,编写与调试应用程序,组织数据入库,并进行试运行。

6、数据库运行和维护

数据库应用系统经过试运行后即可投入正式运行。在数据库系统运行过程中必须不断的对其进行评估、调整与修改。

需求分析和概念结构设计可以独立于任何数据库管理系统进行;逻辑结构设计和物理结构设计与选用的数据库管理系统密切相关。

24. 事务的概念和特点,事务与程序的区别是什么?

1、概念

例如:在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序。

2、特性

事务是恢复和并发控制的基本单位。

事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性

**原子性(atomicity)。**一个事务是一个不可分割的工作单位,事务中包括的操作要么都做,要么都不做。

**一致性(consistency)。**事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。

**隔离性(isolation)。**一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

**持久性(durability)。**持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

3、与程序的区别

一个程序中包含多个事务。在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序。

25. 数据库恢复有哪些技术?

1、数据库恢复概述

数据库管理系统必须具有把数据库从某一错误状态恢复到某一已知的正确状态的功能,这就是数据库的恢复。恢复子系统是数据库管理系统的一个重要组成部分,而且还相当庞大,常常占整个系统代码的百分之十以上。数据库系统采用的恢复技术是否行之有效,不仅对系统的可靠程度起着决定性作用,而且对系统的运行效率也有很大影响,是衡量系统性能优劣的重要指标。

2、恢复的实现技术

恢复机制涉及两个关键问题:1.如何建立冗余数据;2.如何利用这些冗余数据实施数据库恢复。
建立冗余数据最常用的技术是数据转储和登陆日志文件。通常在一个数据库系统中,这两种方法是一起使用的。

2.1 数据转储

数据转储是数据库恢复中采用的基本技术。所谓转储即DBA定期将整个数据库复制到磁带或另一个磁盘上保存起来的过程。这些备用的数据成为后备副本或后援副本。

转储可以分为静态转储和动态转储。

静态转储是在系统中无运行事务时进行的转储操作。即转储操作开始的时刻,数据库处于一致性状态,而转储期间不允许对数据库的任何存取、 修改活动。显然,静态转储得到的一定是一个数据一致性的副本。

动态转储是指转储期间允许对数据库进行存取或修改。但是,转储结束时后援副本上的数据并不能保证正确有效。为此,必须把转储期间各事务对数据库的修改活动登记下来,建立日志文件,这样,后援副本加上日志文件就能把数据库恢复到某一时刻的正确状态。

转储可以分为海量转储和增量转储两种方式。

海量转储是指每次转储全部数据库。

增量转储则指每次只转储上一次转储后更新过的数据。

从恢复角度看,使用海量转储得到的后备副本进行恢复一般来说更方便一些。

数据转储方法可以分为四类:动态增量转储、动态海量转储、静态增量转储、静态海量转储。

2.2 登记日志文件

2.2.1 日志文件的格式和内容

日志文件是用来记录事务对数据库的更新操作的文件。日志文件主要有两种格式:以记录为单位的日志文件和以数据块为单位的日志文件。
以记录为单位的日志文件,需要登记的内容包括:

1.各个事务的开始标记
2.各个事务的结束标记
3.各个事务的所有更新操作

每个日志记录的内容包括:

1.事务标识(标明是哪个事务)
2.操作的类型(插入、删除或修改)
3.操作对象(记录内部标识)
4.更新前数据的旧值
5.更新后数据的新值

2.2.2 日志文件的作用

日志文件在数据恢复中起着非常重要的作用。可以用来进行事务故障恢复和系统故障恢复,并协助后备副本进行介质故障恢复。具体作用是:

1.事务故障恢复和系统故障恢复必须用日志文件
2.在动态转储方式必须建立日志文件,后备副本和日志文件结合起来才能有效地恢复数据库。
3.在静态转储方式中,也可以建立日志文件。

2.2.3 登记日志文件

为保证数据库是可恢复的,登记日志文件时必须遵循两条原则:

1.登记的次序严格按并发事务执行的时间次序
2.必须先些日志文件,后写数据库。

3、恢复策略

3.1 事务故障的恢复

事务故障的恢复是由系统自动完成的,对用户是透明的。系统的恢复步骤是:

1.反向扫描日志文件(即从最后向前扫描日志文件),查找该事务的更新操作。
2.对该事务的更新操作执行逆操作。即将日志记录中“更新前的值”写入数据库。这样如果记录中是插入操作,则相当于做删除操作;若记录中是删除操作,则做插入操作;若是修改操作,则相当于修改求前值代替修改后值。
3.继续反向扫描日志文件,查找该事务的其他更新操作,并做同样处理。
4.如此处理下去,直至读到此事务的开始标记,事务故障恢复就完成了。

3.2 系统故障的恢复

事务故障的恢复是由系统自动完成的,对用户是透明的。系统的恢复步骤是:

1.正向扫描日志文件,找出在故障发生前已经提交的事务,将其事务标识记入重做队列。同时找出故障发生时尚未完成的事务,将其事务表示计入撤销队列。
2.对撤销(UNDO)队列中的各个事务进行撤销处理。
进行UNDO处理的方法是,反向扫描日志文件,对每个UNDO事务的更新操作执行逆操作,即将日志记录中“更新前的值”写入数据库。
3.对重做队列中的各个事务进行重做REDO处理
进行REDO处理的方法是:正向扫描日志文件,对每个REDO事务重新执行日志文件登记的操作。即将日志记录中“更新后的值”写入数据库。

3.3 介质故障的恢复

恢复故障的方法是重装数据库,然后重做已完成的事务。

1.装入最新的数据库后备副本,是数据库恢复到最近一次转储时的一致性状态。
2.装入相应的日志文件副本,重做已完成的事务。即首先扫描日志文件,找出故障发生时已提交的事务的标识,将其计入重做队列。然后正向扫描日志文件,对重做队列中的所有事务进行重做处理。即将日志记录中“更新后的值”写入数据库。

介质故障的恢复需要DBA介入。但DBA只需要重装最近转储的数据库副本和有关的各日志文件副本,然后秩序系统提供的恢复命令即可,具体的恢复操作仍有DBMS完成。

4、具有检查点的恢复技术

日志技术进行数据库恢复有两个问题:

1.搜索整个日志将耗费大量的时间
2.很多需要REDO处理的事务实际上已经将它们的更新操作结果写到数据库中了,然而恢复子系统又重新执行了这些操作,浪费了大量时间。

为了解决这些问题,又发展了具有检查的的恢复技术。这种技术在日志文件中增加一类新的记录——检查点记录,增加一个重新开始文件,并让恢复子系统在登陆日志文件期间动态地维护日志。
检查点记录的内容包括:

1.建立检查点时刻所有正在执行的事务清单
2.这些事务最近一个日志记录的地址。

动态维护日志文件的方法是,周期性地执行如下操作:建立检查点,保存数据库状态。具体步骤是:

1.将当期日志缓冲区中的所有日志记录写入磁盘的日志文件上
2.在日志文件中写入一个检查点记录
3.将当期数据缓冲区的所有数据记录写入磁盘的数据库中
4.把检查点记录在日志文件中的地址写入一个重新开始文件。

使用检查点方法可以改善恢复效率。当事务T在一个检查点之前提交,T对数据库的所有修改都一定写入数据库,写入时间是在这个检查点建立之前或者建立之时。这样进行恢复处理时,没有必要对事务T进行REDO操作。
系统使用检查点方法进行恢复的步骤是:

1.从重新开始文件中找到最后一个检查点记录在日志文件中的地址,由该地址在日志文件中找到最后一个检查点记录。
2.由该检查点记录得到检查点建立时刻所有正在执行的事务清单AVTIVE-LIST
这里建立两个事务队列:
UNDO-LIST:需要执行undo操作的事务集合
REDO-LIST:需要执行redo操作的事务集合。
3.从检查点开始正向扫描日志文件
如有新开始的事务Ti,把Ti暂时放入UNDO-LIST队列
如有提交的事务Tj,把Tj从UNDO-LIST队列移到REDO-LIST队列;直到日志文件结束。
4.对UNDO-LIST中的每个事务执行UNDO操作,对REDO-LIST中的每个事务执行REDO操作。

26. 什么是数据库镜像?它有什么用途?

随着磁盘容量越来越大,价格越来越便宜,为避免磁盘介质出现故障影响数据库的可用性,许多数据库管理系统提供了数据经销功能用于数据库恢复。根据DBA的要求,自动把整个数据库或其中 的关键数据复制到另一个磁盘上。

由于数据库镜像是通过复制数据实现的,频繁地复制数据自然会降低系统运行效率,因此在时间应用中用户往往只选择对关键数据和日志文件镜像,而不是对整个数据库进行镜像。

27. 数据库故障产生的因素有哪些,数据库故障分为哪几种?

1、事务内部的故障

事务内部的故障有的是可以通过事务本身发现的,有的是非预期的,不能由事务程序处理。

事务故障意味着事务没有达到预期的终点,因此,数据库可能处于不正确状态。恢复程序要在不影响其他事务运行的情况下,强行回滚该事务,即撤销该事务已经做出的任何对数据库的修改,使得该事务好像根本没有启动一样。这类恢复操作称为事务撤销。

2、系统故障

系统故障是指造成系统停止运转的任何事件,使得系统要重新启动。例如,特定类型的硬件错误,操作系统故障,DBMS代码错误,系统断电等。这类故障影响正在运行的所有事务,但不破坏数据库。

恢复子系统必须在系统重新启动时让所有非正常终止的事务回滚,强行撤销所有未完成事务。有些已完成事务可能有一部分甚至全部留在缓冲区,尚未写回到磁盘上的物理数据库中,系统故障使得这些事务对数据库的修改部分丢失或者全部丢失,这也会使数据库处于不一致状态,因此应将这些事务已提交的结果重新写入数据库。

3、介质故障

系统故障称为软故障,介质故障称为硬故障。硬故障指外存故障,如磁盘损坏、磁头碰撞、瞬时强磁场干扰等。这类故障将破坏数据库或部分数据库,并影响正在存取这部分数据的所有事务。

4、计算机病毒

总结各类故障,对数据库的影响有两种可能性。一是数据库本身被破坏。二是数据库没有被破坏,但数据可能不正确,这时由于事务的运行被非正常终止造成的。

28. 什么是两段锁协议?

两段锁协议是指每个事务的执行可以分为两个阶段:生长阶段(加锁阶段)和衰退阶段(解锁阶段)。

**加锁阶段:**在该阶段可以进行加锁操作。在对任何数据进行读操作之前要申请并获得S锁,在进行写操作之前要申请并获得X锁。加锁不成功,则事务进入等待状态,直到加锁成功才继续执行。

**解锁阶段:**当事务释放了一个封锁以后,事务进入解锁阶段,在该阶段只能进行解锁操作不能再进行加锁操作。

两段封锁法可以这样来实现:事务开始后就处于加锁阶段,一直到执行ROLLBACK和COMMIT之前都是加锁阶段。ROLLBACK和COMMIT使事务进入解锁阶段,即在ROLLBACK和COMMIT模块中DBMS释放所有封锁。

29. 什么是死锁?如何检测死锁的发生?

1、死锁的原理

死锁是指两个或者多个事务在同一资源上的相互占用,并请求锁定对方占用的资源,从而导致恶性循环的现象。

从两个方面理解:

1.当多个事务试图以不同的顺序锁定资源时,就可能会产生死锁。

在这里插入图片描述

图一中,有两个事务A与B,事务A与B同时执行sql1,则事务A会锁住记录B;事务B会锁住记录A,两条记录同时被锁住。接下来事务A执行sql2,发现记录A被事务B锁住,事务B执行sql2发现记录B被事务A锁住,陷入死循环,产生死锁。

2.多个事务同时锁定同一个资源时,也会产生死锁。

在这里插入图片描述

图二中,事务A与事务B同时操作同一条记录A,产生死锁。

2、死锁的定位方法
通过检查数据库表,能够检查出是哪一条语句被死锁,产生死锁的机器是哪一台。
1)用dba用户执行以下语句
select username,lockwait,status,machine,program from v s e s s i o n w h e r e s i d i n ( s e l e c t s e s s i o n i d f r o m v session where sid in (select session_id from v sessionwheresidin(selectsessionidfromvlocked_object)
如果有输出的结果,则说明有死锁,且能看到死锁的机器是哪一台。字段说明:

Username:死锁语句所用的数据库用户;
Lockwait:死锁的状态,如果有内容表示被死锁。
Status: 状态,active表示被死锁
Machine: 死锁语句所在的机器。
Program: 产生死锁的语句主要来自哪个应用程序。

2)用dba用户执行以下语句,可以查看到被死锁的语句。
select sql_text from v s q l w h e r e h a s h v a l u e i n ( s e l e c t s q l h a s h v a l u e f r o m v sql where hash_value in (select sql_hash_value from v sqlwherehashvaluein(selectsqlhashvaluefromvsession where sid in
(select session_id from v$locked_object))

3、 死锁的解决方法

一般情况下,只要将产生死锁的语句提交就可以了,但是在实际的执行过程中。用户可能不知道产生死锁的语句是哪一句。可以将程序关闭并重新启动就可以了。

1)查找死锁的进程:

sqlplus “/as sysdba” (sys/change_on_install)
SELECT s.username,l.OBJECT_ID,l.SESSION_ID,s.SERIAL#,
l.ORACLE_USERNAME,l.OS_USER_NAME,l.PROCESS
FROM V L O C K E D O B J E C T l , V LOCKED_OBJECT l,V LOCKEDOBJECTl,VSESSION S WHERE l.SESSION_ID=S.SID;

2)kill掉这个死锁的进程:

alter system kill session ‘sid,serial#’; (其中sid=l.session_id)

3)如果还不能解决:

select pro.spid from v s e s s i o n s e s , v session ses, v sessionses,vprocess pro where ses.sid=XX and
ses.paddr=pro.addr;

其中sid用死锁的sid替换:

exit
ps -ef|grep spid

其中spid是这个进程的进程号,kill掉这个Oracle进程。

30. 什么是并行调度的可串行化?

1、可串行化调度

多个事务的并发度执行是正确,当且仅当其结果与按某一次序串行地执行这些事务时的结果相同,称这种调度策略为可串行化调度。

可串行性是并发事务正确调度的准则。

2、冲突可串行化调度

冲突操作是指不同的事务对同一个数据的读写操作和写写操作。

不同事务的冲突操作和同一事物的冲突操作是不能交换的

一个调度Sc在保证冲突操作的次序不变的情况下,通过交换两个事务不冲突的操作次序得到另一个调度Sc‘,如果Sc‘是串行的,称调度Sc为冲突可串行化调度。

若一个调度是冲突可串行化,则一定是可串行化的调度。

冲突可串行化调度是可串行化调度的充分条件,不是必要条件。

31. 并发操作会带来哪些问题,如何避免?

数据库中常见的并发操作所带来的一致性问题包括:丢失的修改、不可重复读、读脏数据、幻影读(幻影读在一些资料中往往与不可重复读归为一类)。
1、丢失修改

下面我们先来看一个例子,说明并发操作带来的数据的不一致性问题。

考虑飞机订票系统中的一个活动序列:
甲售票点(甲事务)读出某航班的机票余额A,设A=16.
乙售票点(乙事务)读出同一航班的机票余额A,也为16.
甲售票点卖出一张机票,修改余额A←A-1.所以A为15,把A写回数据库.
乙售票点也卖出一张机票,修改余额A←A-1.所以A为15,把A写回数据库.

结果明明卖出两张机票,数据库中机票余额只减少1。

归纳起来就是:两个事务T1和T2读入同一数据并修改,T2提交的结果破坏了T1提交的结果,导致T1的修改被丢失。

2、不可重复读

不可重复读是指事务T1读取数据后,事务T2执行更新操作,使T1无法再现前一次读取结果。具体地讲,不可重复读包括三种情况:
事务T1读取某一数据后,事务T2对其做了修改,当事务1再次读该数据时,得到与前一次不同的值。例如,T1读取B=100进行运算,T2读取同一数据B,对其进行修改后将B=200写回数据库。T1为了对读取值校对重读B,B已为200,与第一次读取值不一致。
事务T1按一定条件从数据库中读取了某些数据记录后,事务T2删除了其中部分记录,当T1再次按相同条件读取数据时,发现某些记录神密地消失了。
事务T1按一定条件从数据库中读取某些数据记录后,事务T2插入了一些记录,当T1再次按相同条件读取数据时,发现多了一些记录。(这也叫做幻影读)

3、读"脏"数据

读"脏"数据是指事务T1修改某一数据,并将其写回磁盘,事务T2读取同一数据后,T1由于某种原因被撤消,这时T1已修改过的数据恢复原值,T2读到的数据就与数据库中的数据不一致,则T2读到的数据就为"脏"数据,即不正确的数据。

产生上述三类数据不一致性的主要原因是并发操作破坏了事务的隔离性。并发控制就是要用正确的方式调度并发操作,使一个用户事务的执行不受其它事务的干扰,从而避免造成数据的不一致性。

并发一致性问题的解决办法

1、封锁(Locking)

封锁是实现并发控制的一个非常重要的技术。所谓封锁就是事务T在对某个数据对象例如表、记录等操作之前,先向系统发出请求,对其加锁。加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其它的事务不能更新此数据对象。

基本的封锁类型有两种:排它锁(Exclusive locks 简记为X锁)和共享锁(Share locks 简记为S锁)。

排它锁又称为写锁。若事务T对数据对象A加上X锁,则只允许T读取和修改A,其它任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。这就保证了其它事务在T释放A上的锁之前不能再读取和修改A。

共享锁又称为读锁。若事务T对数据对象A加上S锁,则其它事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这就保证了其它事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。

2、封锁协议

在运用X锁和S锁这两种基本封锁,对数据对象加锁时,还需要约定一些规则,例如应何时申请X锁或S锁、持锁时间、何时释放等。我们称这些规则为封锁协议(Locking Protocol)。对封锁方式规定不同的规则,就形成了各种不同的封锁协议。下面介绍三级封锁协议。三级封锁协议分别在不同程度上解决了丢失的修改、不可重复读和读"脏"数据等不一致性问题,为并发操作的正确调度提供一定的保证。下面只给出三级封锁协议的定义,不再做过多探讨。

1级封锁协议:事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。事务结束包括正常结束(COMMIT)和非正常结束(ROLLBACK)。1级封锁协议可防止丢失修改,并保证事务T是可恢复的。在1级封锁协议中,如果仅仅是读数据不对其进行修改,是不需要加锁的,所以它不能保证可重复读和不读"脏"数据。

2级封锁协议:1级封锁协议加上事务T在读取数据R之前必须先对其加S锁读完后即可释放S锁。2级封锁协议除防止了丢失修改,还可进一步防止读"脏"数据。

3级封锁协议:1级封锁协议加上事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放。3级封锁协议除防止了丢失修改和不读’脏’数据外,还进一步防止了不可重复读。
事务隔离级别

尽管数据库理论对并发一致性问题提供了完善的解决机制,但让程序员自己去控制如何加锁以及加锁、解锁的时机显然是很困难的事情。索性绝大多数数据库以及开发工具都提供了事务隔离级别,让用户以一种更轻松的方式处理并发一致性问题。常见的事务隔离级别包括:ReadUnCommitted、ReadCommitted、RepeatableRead和Serializable四种。不同的隔离级别下对数据库的访问方式以及数据库的返回结果有可能是不同的。我们将通过几个实验深入了解事务隔离级别以及SQL Server在后台是如何将它们转换成锁的。

Serializable

Serializable隔离级别是最高的事务隔离级别,在此隔离级别下,不会出现读脏数据、不可重复读和幻影读的问题。在详细说明为什么之前首先让我们看看什么是幻影读。

所谓幻影读是指:事务1按一定条件从数据库中读取某些数据记录后,事务2插入了一些符合事务1检索条件的新记录,当事务1再次按相同条件读取数据时,发现多了一些记录。

repeatable read

1:所有的select在第一次一致读以后在事务中都会使用一样的数据状态快照。

2:update,delete都会使用间隙锁来保证数据的安全。防止phantom。

3:这是采用最广的事务隔离级别,也是mysql默认的事务隔离级别。

read commited

1:每一个select都会使用各自的数据状态的快照。

2:如果当前的数据状态已更新到最新,但是当单个select的时候仍然会产生不一致的数据状态。

3:更少的间隙锁意味着更少的死锁。

4:唯一key的检查在第二索引和其它外键检查的时候也会产生间隙所。(gap必须被锁定以防止在parent row被删除后仍在child row中插入相关数据)。

5:这种隔离级别也是使用的非常普遍的隔离级别尤其是在5.1以后的版本中。

6:征对在5.0更早的版本中,可以通过innodb_locks_unsafe_for_binlog移除gap locking。(In V5.1, most gap-locking is removed w/ this level, but you MUST use row-based logging/replication。)

read uncommitted

1:这种隔离级别几乎不被使用,在select将会看到各种奇怪的数据现象,当然包括其它事务还未提交的数据。

2:强烈不推荐,不能保证数据的一致性。

32. 并发操作带来的数据不一致性有哪些?各表示什么意思?

事务是并发控制的基本单位,保证事务的ACID特性是事务处理的重要任务,而事务ACID特性可能遭到破坏的原因之一就是多个事务对数据库的并发操作造成的。

并发操作带来的数据不一致性重要有丢失修改,不可重复读,读“脏”数据。

1、丢失修改

两个事务T1和T2读入同一个数据并修改,T2提交的结果破坏了T1提交的结果,导致了T1的修改被丢失。典型例子:买飞机票或者火车票的例子。

2、不可重复读

不可重复读指的是事务T1读取数据后,事务T2执行更新操作,使T1无法再现前一次读取的结果。

分为以下三种情况:

(1)事务T1读取了某一数据后,事务T2对其做了修改,当事务T1再次读数据时,得到了与前一次不同的值。

(2)事务T1读取了某一数据后,事务T2删除了其中的记录,当事务T1再次读数据时,发现某些记录神秘消失了。

(3)事务T1读取了某一数据后,事务T2插入了一些新的记录,当事务T1再次读数据时,发现多了一些记录。

后两种操作叫做幻影现象。

3、读“脏”数据

读“脏”数据只得是事务T1修改了某一数据,并将其写回磁盘,事务T2读取某一数据后,T1由于某种原因撤销了操作,恢复原值,这时T2读到的数据就和数据库中的数据不一致,称为读“脏”数据。

产生以上三种现象的原因是并发操作破坏了事务的隔离性。为了应对这些数据不一致性,主要技术主要有:封锁,时间戳,乐观控制法。

33. 什么是笛卡尔积、自然联接、等值联接、左联接、右联接?

假设存在两张表 c 和 p,这里使用的是MySQL数据库。

数据表 c

course_idtitledept_namecredits
BIO-301GeneticsBiology4
CS-190Game DesignComp.sci4
CS-315RoboticsComp.sci3

数据表 p

course_idprereq_id
BIO-301BIO-101
CS-190CS-101
CS-347CS-101
1、 笛卡儿积(显示相同属性)

两个表的列无条件已笛卡尔积的形式匹配 即使表字段重复 也会重命名进行显示(两表各字段全显示)。可以是毫无联系的对应匹配,应尽量避免

SQL语句如下

select * from c,p;

select * from c cross join p;

结果如下
在这里插入图片描述

2、 自然连接(不显示相同属性)

”natrual join 自然连接”的处理方式:先进行笛卡儿积操作,然后重复的属性只保留一份。

自然连接的步骤是将第一张表的第一条记录和第二张表的每一条记录匹配,如果符合条件就组成一条记录,然后第一张表的第二条记录再和第二张表的每一条记录匹配,这步骤一直循环到第一张表的最后一条记录。

SQL语句如下

select c.course_id, c.title, c.dept_name, c.credits, p.prereq_id from c,p where c.course_id = p.course_id;

select * from c natural join p;

结果如下:
在这里插入图片描述

3、 内连接

“inner join 内连接”的处理方式:虽然重复,但两份都保留。

内连接的结果和自然连接的结果是一样的,只不过是显示的属性不一样而已。内连接会将两张表的重复属性都分别列出来。

SQL语句如下

select * from c,p where c.course_id = p.course_id;

select * from c inner join p on c.course_id = p.course_id;

结果如下
在这里插入图片描述

4、等值连接

从集合论角度看:等值连接是内连接的子集。

本质上是内连接的子集 因为除了where 关联关系之外还在and后面加了一个条件
•语法格式: select 字段信息 from A,B where 关联关系 and 其它条件

5、外连接
(1)左连接

left join 是left outer join的简写,它的全称是左外连接,是外连接中的一种。

左(外)连接,左表的记录将会全部表示出来,而右表只会显示符合搜索条件的记录。右表记录不足的地方均为NULL。其实就是将右边的表的第一项根据条件分别和左边的每一行数据进行对比,如果符合条件,就拼成一条记录。

SQL语句如下

select * from c left join p on c.course_id = p.course_id;

结果如下
在这里插入图片描述

SQL语句如下

select * from c natural left join p;

结果如下
在这里插入图片描述

(2)右连接

right join是right outer join的简写,它的全称是右外连接,是外连接中的一种。与左(外)连接相反,右(外)连接,左表只会显示符合搜索条件的记录,而右表的记录将会全部表示出来。左表记录不足的地方均为NULL。

右连接的匹配步骤是先将左边的表的第一项根据条件分别和右边的每一行数据进行对比,如果符合条件,就拼成一条记录。

SQL语句如下

select * from c right join p on c.course_id = p.course_id;

结果如下
在这里插入图片描述

SQL语句如下

select * from c natural right join p;

结果如下
在这里插入图片描述

(3)全连接

全连接也是属于外连接的一种。但是MySQL里没有全连接的关键字。但是可以通过union来实现。

注意:

UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。

默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。

UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。

SQL语句如下

(select * from c left join p on c.course_id = p.course_id) union (select * from c right join p on c.course_id = p.course_id);

结果如下
在这里插入图片描述

二、综合应用

1. 给定一个关系,确定其码,满足第几范式,说明理由,分解为BC范式。

2. 用SQL语言完成数据库及数据库表的定义,实现各种查询操作。

3. 用关系代数语言写出常见的查询。

4. 给定一个项目,设计该系统数据库的概念模型,绘制E—R图,将E-R模型转换为关系模式

说明:综合应用题结合了理论、实验和课程设计,请同学们全面复习。

三、试题结构:

题型单题分值数量总分
判断题11010
选择题22040
填空题21020
综合应用题10330

以上内容都从各个博主以及课本上扒下来的(不是原创,虽然标的是),还没来得及细看,如果有错,欢迎大家指正。
还有就是有一些图看不了,但是其实不影响整体效果。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值