您的位置:首页 > 数据库

关系数据库基础

2016-11-26 15:38 155 查看

数据库

数据库是按照数据结构来组织、存储和管理数据的仓库(图书馆),数据库技术产生于20世纪60年代末70年代初,其发展阶段为:人工管理阶段,文件系统阶段,数据库系统阶段。

人工管理阶段

20世纪50年代中期之前,计算机硬件不够完善。硬件存储设备只有磁带,卡片和纸条,没有磁盘等直接存取的存储设备,软件方面没有操作系统,没有专门的数据管理软件。
这个阶段由于还没有软件系统对数据进行管理,程序员在程序中不仅要规定数据的逻辑结构,还要设计其物理结构,包括存储结构、存取方法、输入输出方式等。当数据的物理组织或存储设备改变时,用户程序就必须重新编制。由于数据的组织面向应用,不同的计算程序之间不能共享数据,使得不同的应用之间存在大量的重复数据,很难维护应用程序之间数据的一致性。其特点如下:

1、数据不保存,因为计算机主要是用于科学计算,一般不将数据长期保存。
2、数据需要由应用程序自己进行管理。应用程序不仅要规定数据的逻辑结构,而且还要设计物理结构,包括存储结构,存取方法,输入输出等。因此程序员负担很重。
3、数据不共享,数据是面向应用程序的,一组数据只能对应一个程序。
4、数据缺乏独立性。数据的逻辑结构或物理结构发生变化是后,必须对应程序做出相应修改,数据完全依赖应用程序,所以数据缺乏独立性。

文件系统阶段

到了20世纪50年代中期至60年代中期,由于计算机大容量存储设备(如硬盘)的出现,并且在这一阶段的是计算机中有了专门管理数据库的软件——操作系统(文件系统)。
在这个阶段,数据以文件为单位存储在外存中,并由操作系统统一管理。在这一阶段的特点如下:
1、由于大容量存储的出现,数据可以长期保存,并且可以反复进行查询,修改,插入和删除等操作。
2、由文件系统的出现方便了对数据的访问,但文件系统仍有缺点:(1)数据共享性差,冗余度大,在文件系统中,一个(或一组文件)基本上对应一个应用程序,即文件对应应用程序。当不同的应用程序具有部分相同的数据时,也必须建立各自的文件,而不能共享相同的数据,因此数据的冗余度大,浪费存储的空间。(2)数据独立性差,由于一个(或一组文件)基本上对应一个应用程序,若应用程序需要修改时对应的文件结构的定义结构也必须修改,数据依赖于应用程序,缺乏独立性。



数据库阶段

20世纪60年代后期,随着计算机在数据管理领域的普遍应用,人们对数据管理技术提出了更高的要求:希望面向企业或部门,以数据为中心组织数据,减少数据的冗余,提供更高的数据共享能力,同时要求程序和数据具有较高的独立性,当数据的逻辑结构改变时,不涉及数据的物理结构,也不影响应用程序,以降低应用程序研制与维护的费用。数据库技术正是在这样一个应用需求的基础上发展起来的。归纳一下数据库系统阶段的几个特点:
1、数据结构化。
2、数据共享性高,数据冗余小,易修改,易扩充。
3、数据独立性高,数据的逻辑结构与物理结构之间的差别可以很大,用户以简单的逻辑结构操作数据而无须考虑数据的物理结构。
4、数据由数据库管理系统统一管理和控制。

数据模型

数据模型是数据库系统的核心和基础,是对现实世界数据特征的抽象,是用来描述数据,组织数据和对数据进行操作的。
常用的数据模型有:层次模型,网状模型,关系模型,面向对象数据模型等等。
重点介绍关系模型,关系模型是1970年,IBM的一位博士发表论文,提出关系模型的概念,奠定了关系模型的理论基础。
我们通常说关系就是一张二维表,那为什么关系就是一张二维表呢?
在数学中关系是指笛卡儿积D1x D2x…x Dn的子集叫做在域 D1,D2,…, Dn上的n元关系。用R(D1,D2,…, Dn)表示,R是关系名。关系中的每个元素是关系中的元组,通常用t表示。
举个例子:
姓名域D1 = {朱某,张三}
性别域D2 = {男,女}
专业域D3 = {计科系,信工系,物联网}
笛卡儿积 D1XD2XD3 = {
(朱某,男,计科系),
(朱某,女,计科系),
(朱某,男,信工系),
(朱某,女,信工系),
(朱某,男,物联网),
(朱某,男,物联网),
(张三,男,计科系),
(张三,女,计科系),
(张三,男,信工系),
(张三,女,信工系),
(张三,男,物联网),
(张三,男,物联网),
}


将笛卡儿积列成一个二维表,如下所示:



我们可以发现:表中的笛卡儿积中好些元祖是没有实际意义的。例如:朱某人不可能既是男生又是女生吧。因此,有意义的集合必然是笛卡儿积的子集(关系)。

关系的完整性约束

关系的完整性约束是为了保证数据库中的正确性和相容性,对关系模型提出的某种约束条件或规则。完整性通常包括域完整性,实体完整性、参照完整性和用户定义完整性,其中域完整性,实体完整性和参照完整性,是关系模型必须满足的完整性约束条件。

1、域完整性是保证数据库字段取值的合理性,属性值应是域中的值。在上面的实例中,笛卡儿积的运算结果都是从姓名域D1,性别域D2,专业域D3中选取出来的。如有一个姓名“李四”并不在姓名域中,所以不可以出现在笛卡儿积中。
2、实体完整性约束是指关系的主关键字不能重复也不能取“空值",唯一标识,区分关系中的每个元祖。一个关系对应现实世界中一个实体集。现实世界中的实体是可以相互区分、识别的,也即它们应具有某种惟一性标识。在关系模式中,以主关键字作为唯一性标识,而主关键字中的属性(称为主属性)不能取空值,否则,表明关系模式中存在着不可标识的实体(因空值是“不确定\"的),这与现实世界的实际情况相矛盾,这样的实体就不是一个完整实体。按实体完整性规则要求,主属性不得取空值,如主关键字是多个属性的组合,则所有主属性均不得取空值。
3、参照完整性是定义建立关系之间联系的主关键字与外部关键字引用的约束条件。
学生(学号,姓名,性别,专业号,年龄)
专业(专业号,专业名)
学生关系中的专业号引用专业关系中的专业号,也就是说学生关系中的专业号必须是在专业关系中真实存在专业号或者取空值,其中学生关系称为参照关系,专业关系称为被参照关系。

4、用户定义完整性则是根据应用环境的要求和实际的需要,对某一具体应用所涉及的数据提出约束性条件。

函数依赖

函数依赖是指某个属性集决定另一个属性集时,称另一属性集依赖于该属性集。例如:在学生关系中,如果知道一个学生的学号,就可以知道学生的姓名,学生的学号决定学生的姓名,也可以称为姓名属性依赖于学号,这就是函数(函数指一个量随着另一个量的变化而变化,或者说一个量中包含另一个量)依赖(各个事物或现象互为条件而不可分离)。函数依赖又分为非平凡依赖,平凡依赖;从性质上还可以分为完全函数依赖、部分函数依赖和传递函数依赖。

1、函数依赖是指关系模式R的某个或某些关系实例满足的约束条件,而是指R的所有关系实例均要满足的约束条件。
2、函数依赖是语义范畴的概念。只能根据数据的语义来确定函数依赖。例如“姓名→年龄”这个函数依赖只有在不允许有同名人的条件下成立。

函数依赖与属性关系:

属性之间有三种关系,但并不是每一种关系都存在函数依赖。设R(U)是属性集U上的关系模式,X、Y是U的子集:

● 如果X和Y之间是1:1关系(一对一关系),如学校和校长之间就是1:1关系,则存在函数依赖X → Y和Y →X。

● 如果X和Y之间是1:n关系(一对多关系),如年龄和姓名之间就是1:n关系,则存在函数依赖Y → X。

● 如果X和Y之间是m:n关系(多对多关系),如学生和课程之间就是m:n关系,我们知道多对多是不能构成函数关系的,所以多对多之间不存在函数依赖。

平凡函数依赖:若X->Y,并且Y属于X,则称X->Y是平凡函数依赖。
例如:(学号,姓名)->姓名,姓名属于(学号,姓名),所以(学号,姓名)->姓名是平凡函数依赖。对于任一关系模式,平凡函数依赖都是必然成立的。

非平凡函数依赖:若X->Y,并且Y不属于X,则称X->Y是非平凡函数依赖。
例如:学号->班级,但班级不属于学号。

完全函数依赖:设X,Y是关系R中的两个属性集合,X’是X的真子集,存在X->Y,但对于每一个X’都有X‘!->Y,则称Y完全函数依赖于X。
例如:成绩(学号,课程号,成绩),(学号,课程号)->成绩,但是单一的学号或课程号都不可以推出某个学生的成绩。像这样的依赖关系就是完全函数依赖。

部分函数依赖:设X,Y是关系R的两个属性集合,存在X→Y,若X’是X的真子集,存在X’→Y,则称Y部分函数依赖于X。
例:学生(学号,姓名,性别,班级),(学号,姓名)->性别,并且学号->性别,所以(学号,姓名)->性别是部分函数依赖。

传递函数依赖:设X,Y,Z是关系R中互不相同的属性集合,存在X→Y(Y !→X),Y→Z,则称Z传递函数依赖于X。
例:R(学号,系名,系主任)。学号->系名(系名!->学号),系名->系主任,所以学号->系主任是传递函数依赖。

为什么要介绍这么多函数依赖呢?这是为了范式做准备,范式就是消除函数依赖达到规范化要求的标准。



范式

范式是指符合某种规范标准的关系模式的集合,是为了在设计中更好的解决数据冗余,数据有效性检查,提高存储效率。
看一个不符合范式的例子:



在上图中课程号和课程名重复出现,数据冗余。若只想删除张三的数学成绩,必须删除整条记录等等。不便于操作。
第一范式:设 R 是一个关系模式,如果 R 中的每一个属性 A 的值域中的每个值都是不可分解的,则称 R 是属于第一范式的,记作 R ∈ 1NF。
例如:R(姓名,联系方式,家庭住址)中,联系方式再分为:座机,手机,QQ等,这就违背了第一范式中元祖的属性是不可再分的原则,所以不满足第一范式。
将非第一范式的关系转换为第一范式的关系非常简单,只需要将所有数据项都分解成不可再分的最小数据项就可以了。
例如:可将上例修改为R(姓名,座机,手机,QQ,家庭住址)。

第二范式:如果关系 R ∈ 1NF,并且 R 中每一个非主属性完全函数依赖于任一个候选码,则 R ∈ 2NF。
例如:



在上图中满足第一范式,但是不满足第二范式。所有的属性并不完全依赖于主键(学号,课程号),例如 (学号,课程号)->课程名,但是课程号也可以->课程名,同样的 (学号,课程号)->姓名|性别|家庭住址,也可以学号->姓名|性别|家庭住址。所以不是完全依赖于主键。
要想让这个表满足第二范式,就需要把完全依赖学号的属性放在一个表中,完全依赖课程号的属性放在一表中,完全依赖(学号,课程号)的属性放一个表中。如下:
学生(学号,姓名,性别,居住地,邮编)
课程(课程号,课程名)
成绩(学号,课程号,成绩)
这样就把一个表拆分成三个表。



第三范式:在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。

上图中满足第二范式,但是满足第三范式吗?

学号->居住地(居住地!->学号),居住地->邮编,呜,存在传递函数依赖,不满足第三范式,将居住地,邮编提出形成一个表,即可消除传递函数依赖。



三范式图

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息