6年前曾经学过一本国产的数据库教材,但是当时脑子还没有开化,或者对于教材的内容缺少感性认识,因此学习之后没有任何效果。最近因为要做一个带CMS的系统,需要把数据库理论重新学习一遍,因此买了本数据库系统基础教程来看,这一系列文章作为对本次学习的一个总结和概括。
1.1 数据库系统
数据库指由DBMS管理的数据和集合。
DBMS需要具有如下功能:(1) 支持用户使用DDL来定义数据的逻辑结构。(2) 支持用户使用DQL和DML来查询和更新存储的数据。(3) 支持海量数据高效处理。 (4) 具有持久性容可恢复性。 (5) 并发控制性或原子性。文件系统不满足上述五点。
数据库经历了几代的发展,从早期的层次型、网状到现代的关系型。关系型数据库起源于Ted Codd的著名论文《大型共享数据库的关系模型》,目前数据向面对对象领域进行新的发展。在超大型与小型两极都取得了许多发展,在面向信息集成中,数据仓库用来整合多个数据库。
1.2 DBMS概述
此处介绍DBMS的基本模块单元。
对于上面这张图的解释如下。在最上端,有两类数据库用户。一类为DBA,他们创建数据库模式。另一类为用户和应用程序,他们查询或修改数据。在图的最下面是物理存储器,数据存储在磁盘上并由存储管理器来写入和读入缓存。缓冲区管理用来管理可用内存,并提供块数据的高速存储。记录管理器用来管理数据文件、索引文件、数据格式等,管理这些信息有助于快速从数据文件中取出所需数据。查询处理器包括查询编译器和执行引擎,查询编译器把查询转换成查询序列,包括 查询分析、预处理、查询优化器。事务管理需要日志与并发控制,执行引擎用于执行上层编译的命令序列并获取数据,它通常与缓冲获取数据。事务处理包含日志和并发控制,并发控制需要锁表的支持。
2 关系数据模型
在介绍了数据库的基本概念后,我们下面来学习关系数据库的基础概念。
2.1 数据模型
一种数据模型包括三方面的内容,物理数据结构、数据上的操作、数据上的约束。典型的数据模型有关系模型、头结构化数据模型XML、OO数据模型
2.2 关系模型基础
直观来看,关系模型可以看作二维的表。关系的列称为属性。
关系名和属性的组合称为关系的模式,记作R(A,B,C,...),关系的属性可以任意排列。
关系中的行称为元组。
关系的每个属性都有一个类型,称为域,在关系模式中可以进行体现,如R(A:string,B:int...)。
一个关系中元组的集合称为关系的实例,关系中元组可以任意排列。
键是由一个或多个属性组成,键约束保证关系实例上,任何两个元组都不可能有相同的键。键的表示为属性加下划线。如R(ID,A ,B)。
2.3 在SQL中定义关系
SQL中有三种类型的关系:持久存储的关系,即表。临时存储的关系,即View。而由DBMS自己临时生成的关系称为临时表。
数据类型:这里只介绍日期和时间。SQL中的日期表示为DATE '-01-24' 时间表示为 TIME '21:00:00.250',即在类型后以单引号括起来字符串值。
下面我们用SQL创建一个简单的关系:
create table Country(idint auto_increment,name char(32) unique default "",primary key(id));
删除关系需要用drop table Country; 修改关系使用alter table Country add location char(16) /drop name; 主键用primary key来声明,单个属性的键可以在属性后说明,若多个属性组成的主键,则必须采用上面的方式来说明。primary key的属性必须不能相同且不能为NULL,而unique只要求不能相同,但可以为NULL。注意NULL不能和NULL作比较,unique的属性如果未声明为NOT NULL,则可以有多个NULL值。
2.4 关系代数
2.4.1 关系代数概述
传统的关系代数操作主要有以下四类:(1) 关系操作并、交、差。 (2) 选择操作,除去某些列的操作。(3) 组合操作,包括笛卡儿积运算以及连接运算。 (4) 重命名操作。通常把关系代数表达式称为查询。
2.4.2 关系上的集合操作
最常用的集合操作为并 R U S 、交 R ∩ S、差 R - S。这三个运算比较简单,即是把关系实例当作集合来进行运算,不在此过多说明。需要注意的是R和S必须具有同样的属性集合,且各个属性的类型也必须匹配。
2.4.3 投影π
投影用来从关系R中生成只含部分列的新关系。
表达式πA1A2,...An(R)表示一个关系,它只包含关系R的属性A1,A2,....,An所代表的列,即新关系可以表示为:S(A1,A2,....An)。
2.4.4 选择σ
选择用于产生一个只包含R部分元组的子集合,新关系的元组必须满足某个基于R属性的条件C。选择用表达式σc(R)表示。[σ音为sigma]。例如对于一个成绩单的表,可以从中选择成绩在90分以上的学生:σgrade>90(R)。
2.4.5 笛卡儿积χ
关系R(Ai) X S(Bi)是一个有序对的集合,有序对的第一个元素为R中的任意元组Ai,有序对的第二个元素为S中的任意元组Bi。积的元组个数为两个关系的元组个数的积。
积的关系模式是R和S关系模式的并,如果二者有相同的属性,需要把一个关系中相应的属性名更改成不同的名称。当然为了清楚期间,若属性A同时是R和S的属性,则在积中可以分别记为R.A和S.A。
2.4.6 自然连接⋈
关系也可以按照条件来进行连接。若R和S具有共同属性A1,A2,...,An,r和s分别为两个关系的元组,若当且仅当r和s在公共属性A1,A2,...,An上相同时,元组r和s方可进行连接,称为自然连接,记作R⋈S。例如对于关系Student(id,name)与成绩Grade(id,grade),为了寻找学生姓名和成绩,就可以将Student和Grade进行基于id的自然连接。
在连接中,若一个元组不能和另外关系中的任何元组连接配对的话,称其为悬浮元组。
2.4.7 θ连接
θ连接是自然连接的扩展,其不必基于相等的属性,而可以基础任意条件C来进行连接,记作R⋈cS。可以通过先构造RXS的结果,再结果中寻找满足条件C的元组。例如对于关系Student(id,name,age)和关系Teacher(id,name,age),我们希望找到比老师年龄还大的学生就可以,采用R⋈s.age>t.ageS来实现。
2.4.8 重命名ρ
ρs(R)表示把关系重命名为S,若在改名的同时还老需要重命名列,则表示为ρs(A1,A2,...,An)(R),即R的各列名称为Ai。
2.4.9 操作之间的关系
上面介绍的一些操作,可以被其他操作组合来进行等价表示。其中的6个操作,并,差,选择,投影,积,重命名构成一个独立的集合,每个操作都不能被集合中其他操作来实现。
2.5 关系上的约束
2.5.1 约束表示
前提是R和S是关系。若R=∅表示R中没有元组。R⊆S表示R的元组均在S中出现。
2.5.2 引用完整性约束
关系R中的属性A,若其引用了关系S的属性B,则R的任一元组在属性A的分量,必然应该包括在关系S的元组在属性B的分量中,表示为πA(R)⊆πB(S) 。
2.5.3 键约束
关系R(A1,A2,...,An),假设A1为关系的键属性,则对于A1相同两个元组,其A2-An也必然相同。记S为R的重命名关系,则σR.A1=S.A1 and R.ai != S.ai(R*S) =∅。
2.5.4 其他约束举例
以关系的属性的取值约束为例,规定R(A)的A只能取[0-5],则有σA<0 and A>5(R) =∅。
3 基于包的代数与逻辑查询语言
3.1 包上的关系代数操作
商业DBMS实现的关系都是基于包而不集合。把关系看作包而不是集合,可以使一些关系操作实现效率更好。例如包的并可以简单组合两个关系,而不需要排重。对于投影操作仅需要选择所在列的数据即可,也不需要排重。
3.1.1 包的并、交、差
假定R和S是包,其中元r在R中出现n次,在S中出现m次,则有
包R U S中,元组 r 出现n+m次
包R∩ S中,元组 r 出现min(m,n)次,
包R-S中,元组 r 出现max(0,n-m)次
3.1.2 包的投影操作
在包的投影操作过程中,如果产生了多个同样的元组,则重复不会被从包投影结果中消除。
3.1.3 包上的选择操作
在包上选择操作时,结果中也不去掉重复元组。
3.1.4 包的笛卡儿积
一个关系中的每个元组跟另外一个关系中的每个元组配对,而不问这个元是不是重复出现。
3.1.5 包的连接
首先对比两个关系中的元组,看是否可配对,如果可以,则配对起来的元组就是结果中的一员。结果中不需要消除重复元组。
3.2 扩展的关系代数操作
3.2.1 消除重复
δ(R)表示返回一个没有重复元组的关系R。这个算子把包转换为集合。
3.2.2 聚集操作符
聚集操作符用来汇总关系某一列中出现的值。标准算子有以下几个
1) SUM 产生一列的和
2) AVG 产生一列的均值
3) MIN&MAX 分别产生一列中最小值和最大值
4) COUNT 产生一列中的值的数目,包括重复的元组。
3.2.3 分组操作符
有时人们不仅能对列来计算聚集,还需要按某个或多个属性值来分组,然后考虑分组内元的聚集操作。
这里定义分组算子γL(R),其返回的关系的计算过程是:先把关系R的元组分组。每一组由L中分组属性为特定值的所有元组。然后对于每一组产生一个新元组,这个元组的内容为一个分组属性值,本组所有元组聚集操作的结果。
δ操作是γ操作的冗余。去重相当在每一列上进行分组。
3.2.4 扩展的投影操作
前面我们看到投影操作πA1A2,...An(R),扩展这个操作,使它支持在元的组成分量上或选择分量上的计算。投影列表可以是以下所列元素之一:R的属性,x->y的重命名,E->z,其中E是一个涉及R的属性、常量、算术运算符或串运算符的表达式。z是命名后的新名字。
3.2.5 排序操作符
表达式τL(R),表示按L排序的关系R本身。L可以是一个属性列表,R的元组先按A1的值排序,对于A1属性相等的再按A2排序,依此类推。
3.2.6 外连接
外连接是连接的一个变种。其先执行自然连接,然后再把来自R或者S中的悬浮元组加入其中。加入的元组在对应属性上若不存在分量,则用NULL表示。
自然外连接有几种不同变体,左外自然连接只加入械变量R的悬浮元组。右外连接只把右变量S的悬浮元组加入结果。
针对θ连接也有对应的外θ连接,左外θ连接,右外θ连接。
3.3 Datalog逻辑查询语言
关系运算还可以基于Datalog逻辑查询语言,暂时不在此说明。
3.4 关系代数与Datalog
同上,略
参考文献
维基百科-关系代数 /wiki/%E5%85%B3%E7%B3%BB%E4%BB%A3%E6%95%B0_%28%E6%95%B0%E6%8D%AE%E5%BA%93%29#.E8.87.AA.E7.84.B6.E8.BF.9E.E6.8E.A5_.28.E2.8B.88.29
数据库系统基础教程 原书第三版 Jeffrey D.Ullman , Jenifer Widom著 机械工作出版社