一、关系数据库模型
关系模型是一种基于表的数据模型,以下为关系学生信息,该表有很多不足之处,本文研究内容就是如何改进它:
下面是一些重要术语:
1.属性(attribute):列的名字,上图有学号、姓名、班级、兴趣爱好、班主任、课程、授课主任、分数。
2.依赖(relation):列属性间存在的某种联系。
3.元组(tuple):每一个行,如第二行 (1301,小明,13班,篮球,王老师,英语,赵英,70) 就是一个元组
4.表(table):由多个属性,以及众多元组所表示的各个实例组成。
5.模式(schema):这里我们指逻辑结构,如 学生信息(学号,姓名,班级,兴趣爱好,班主任,课程,授课主任,分数) 的笼统表述。
6.域(domain):数据类型,如string、integer等,上图中每一个属性都有它的数据类型(即域)。
7.键(key):由关系的一个或多个属性组成,任意两个键相同的元组,所有属性都相同。需要保证表示键的属性最少。一个关系可以存在好几种键,工程中一般从这些候选键中选出一个作为主键(primary key)。
8.候选键(prime attribute):由关系的一个或多个属性组成,候选键都具备键的特征,都有资格成为主键。
9.超键(super key):包含键的属性集合,无需保证属性集的最小化。每个键也是超键。可以认为是键的超集。
10.外键(foreign key):如果某一个关系A中的一个(组)属性是另一个关系B的键,则该(组)属性在A中称为外键。
11.主属性(prime attribute):所有候选键所包含的属性都是主属性。
12.投影(projection):选取特定的列,如将关系学生信息投影为学号、姓名即得到上表中仅包含学号、姓名的列
13.选择(selection):按照一定条件选取特定元组,如选择上表中分数>80的元组。
14.笛卡儿积(交叉连接Cross join):如下图,第一个关系每一行分别与第二个关系的每一行组合。
X=
15.自然连接(natural join):如下图,第一个关系中每一行与第二个关系的每一行进行匹配,如果得到有交叉部分则合并,若无交叉部分则舍弃。
⋈=
16.θ连接(theta join):即加上约束条件的笛卡儿积,先得到笛卡儿积,然后根据约束条件删除不满足的元组。
17.外连接(outer join):执行自然连接后,将舍弃的部分也加入,并且匹配失败处的属性用NULL代替。
外连接=
18.除法运算(division):关系R除以关系S的结果为T,则T包含所有在R但不在S中的属性,且T的元组与S的元组的所有组合在R中。下例足以说明,为了得到所有选了数学、英语并且是二年级的学生,我们用到除法运算。
除以=
二、函数依赖
1.函数依赖(functional dependency,FD)定义:
在一个关系中,任意元组,若属性A1,A2....An一样,则属性B1,B2...Bm必一样,那么称A1,A2...An函数决定B1,B2...Bm。
记号为 A1,A2...An → B1,B2...Bm (Ai与Bi有函数依赖)
上图中,若 学号 相同,则 姓名、班级、班主任 也必然相同,用这个道理我们可以粗略得出如下函数依赖:
学号 → 姓名,班级 (每一个学号对应一个姓名和班级,但由于可能重名,一个姓名不一定只对应一个学号)
班级 → 班主任 (一个班级对应一个班主任,但我们不排除一个老师任两个班的班主任,即一个班主任可能对应多个班级)
学号,课程 → 分数 (一个学号一个课程对应一个唯一的分数)
课程 → 授课主任 (一个课程对应一个授课主任)
授课主任 → 课程 (一个授课主任只能负责一门课程)
2.Armstrong aximos规则:
传递律(Transitivity):R(A,B,C) 其中R为关系,ABC均为属性。若A → B 和 B → C 则 A → C 。
增长律(Augmentation):如果 A → B,则AC → BC,延长函数依赖不变。
自反律(Reflexivity):如果 属性集合B 属于 属性集合A,那么 A → B,这个又称为平凡函数依赖(见3)。
3.平凡函数依赖:
这里的平凡(trivial)又有无价值、琐碎的意思,理解上就是说了等于白说。
如 学号,姓名 → 学号 就是一个平凡函数依赖,因为右边的属于左边的,属于无价值信息。
4.分解/结合规则:
A1,A2...An → B1,B2...Bm 等效于 A1,A2...An → B1 ; A1,A2...An → B2 ; ..... A1,A2...An → Bm 。右边是可以拆开、合并的。
5.属性的闭包(closure):
用一个例子来说明
已知关系的所有属性集合{A,B,C,D,E,F}。
已知函数依赖 AB → C , BC → AD , D → E , CF → B 。
求{A,B}的闭包 (我们用 {A,B}+ 来表示)。
解:
<1>——分解函数依赖,使右边只有一个属性。 AB → C ; BC → A ; BC → D ; D → E ; CF → B 。
<2>——用{A,B}集合与这些函数依赖推导出新的属性加入集合,直到这个集合不再增长,此时该集合就是{A,B}+(闭包)。
容易发现 {A,B}+ = {A,B,C,D,E}。
实际上,求集合C的闭包C+,就是由全部函数依赖以及C,推导出所有能够推导的属性集合 与 C的 并集。
闭包算法能找到所有正确的函数依赖————反过来,已知 {A,B},{A,B}+,我们就能列出所有能用{A,B}推导出的函数依赖。
6.判定、计算键:
(1)运用闭包算法判断是否够是键:
要验证{A1,A2...An}是否是关系的键,可以先检查“{A1,A2...An}+是否包含了关系的全部属性”,再检查“不存在从{A1,A2...An}中移出一个属性后的集合C,使得C+包含关系的全部属性”。
(2)图解计算键:
用一个例子来说明
已知 {A,B,C,D,E} : AB → C , B → D , C → E , CE → B
<1>——根据依赖关系画出关系图,入度为0的必在键中,出度为0的必不在键中,如下图
现在可知,键中必有A,必无D。
<2>——将入度或出度为0结点删去,化简依赖图,如下图
<3>——选择所有不能相互推导的属性集合,逐一检查能否遍历上面的图(注意,依赖图中只有入度全满足才算可推导)
上图中不能相互推导的集合有:{B}能遍历全图,{C}能遍历全图,{E}不能遍历全图(单个E不能满足B的全部入度)
(这里,考虑一下{B,E},因为从B出发能遍历到E,连通,所以不检查)
<4>——把上一步算出的集合分别与第1步中入度为0的点组合,最终得到候选键。
本例中候选键为 {A,B}、{A,C} 。
7.函数依赖的基本集:
(1)相关定义:
基本集:对于一个给定的函数依赖集合S,存在多个等效的函数依赖集合,任何与S等效的函数依赖集合都被称为S的基本集。
最小化基本集(minimal basis):需要满足以下条件
(1)所有函数依赖的右边均为单一属性。(右边最简)
(2)删除其中任何之一就不再是基本集。(数量最少)
(3)对于任意一个函数依赖,若其左边删除一个或多个属性,则不再是基本集。(左边最简)
(2)计算最小化基本集:
用一个例子来说明
已知 {A,B,C,D,E} : AB → CD , B → D , C → E , CE