数据库2、关系数据库
一、关系数据结构
1、关系
关系、就是表。一张扁平的二维表
- 单一的数据结构——关系
显示时间的实体以及实体之间的各种联系军用关系来标识
- 逻辑结构——二维表
从用户角度来说,关系模型中数据的逻辑结构是一张二维表
1): 域 domain
域是一组具有相同数据类型的值的集合
自然数、证书、实数、男女性别、指定长度的字符串集合……都是域
2): 笛卡尔积 cartesian product
给一组域$D_1 D_2 … D_n$,每个D就是一个集合。
- 所有域的所有取值的一个组合
- 不能重复
这些域的笛卡尔积可以列成一张二维表,其数学语言如下:
$$
D_1\times D_2\times \cdots \times D_n\
={(d_1,d_2,\cdots,d_n)|d_i\in D_i,i=1,2,\cdots,n}
$$
其中,每一个元素$(d_1,d_2,\cdots,d_n)$叫做一个n元组(n tuple),可以简称为元组
元素中每一个值di叫做一个分量(component)
一个域允许的不同取值个数称为这个域的基数(Cardinal number)
如果$D_i (i=1,2,\cdots,n)$为有限集,基数$m_i (i=1,2,\cdots,n)$,则$D_1\times D_2\times \cdots \times D_n$的基数M为:
$$
M = \sum^{n}_{i=1}m_i
$$
是不是有点看晕了?举个例子🌰 就能看懂了:
这里列三个域
D1=导师={老刘,老陈}
D2=专业={人工智能,软件工程}
D3=学生={小刘,小陈}
D1xD2xD3的笛卡尔积就可以列为一张表:
导师 | 专业 | |
---|---|---|
老刘 | 人工智能 | 小刘 |
老刘 | 人工智能 | 小陈 |
老刘 | 软件工程 | 小刘 |
老刘 | 软件工程 | 小陈 |
老陈 | 人工智能 | 小刘宝 |
老陈 | 人工智能 | 小陈 |
老陈 | 软件工程 | 小刘 |
老陈 | 软件工程 | 小陈 |
该笛卡尔积的基数为2x2x2=8,也就是说,这个笛卡尔积一共有8个元组。
老陈、人工智能、软件工程、小刘……就是分量
3): 关系 relation
(1) 关系
$D_1\times D_2\times \cdots \times D_n$的子集叫做在域D1,D2,…,Dn上的关系,表示为 R(D1,D2,…,Dn)
这里R表示关系的名字,n是关系的目或度(degree)
(2) 元组
关系中的每个元素是关系中的元组,通常用t表示
- n=1时,该关系为一元关系或单元关系(unary relation)
- n=2时,该关系为二元关系(binary relation)
关系是笛卡尔积的有限子集,所以关系也是一张二维表
- 表的每一行对应一个元组
- 表的每一列对应一个域
(3) 属性
因为域可以相同,为了区分,给列起个新名字:属性(attribute)
n目关系必有n个属性
(4) 码
-
候选码 Candidate key
若关系中的某一属性组的值能唯一的表示一个元组(其子集不能),就称该属性为那个组的候选码
- 简单的情况:候选码只包含一个属性
-
全码 ALL-key
最极端的情况:关系模式的所有属性组是这个关系模式的候选码,称为全码
-
主码
若一个关系有多个候选码,则选定其中一个为主码(Primary key)
候选码的诸属性称为主属性(prime attribute)
不包含在任何候选码中的属性称为非主属性(Non-Prime attribute)
D1,D2,…,Dn的笛卡尔积的某个自己才有实际含义
eg: 笛卡尔积介绍部分的表格,并没有实际的意义,取出有实际意义的元组来构造关系
设关系SAP(supervisor,speciality,postgraduate),
supervisor speciality postgraduate 老刘 人工智能 小刘 老陈 软件工程 小陈 由于这里的程序我们假定人名为不会重名,所以postgraduate属性的每一个值都唯一标识了一个元组,因此可以作为SAP关系的主码。
(5) 三类关系
-
基本关系(基本表或基表)
实际存在的表,是实际存储的逻辑表示
-
查询表
查询对应结果的表
-
视图表
有基本表或其他试图表导出的表,是虚表,不对应实际存储的数据
由于第二部分我们对笛卡尔积的定义,关系可以是一个无限集合。且由于组成笛卡尔积的域不满足交换律,当关系作为关系数据模型的数据结构时,需要给予如下的限定与扩充:
- 无限关系在数据库系统中是没有意义的,现拟定的关系数据模型中的关系必须是有限集合
- 通过为关系的每一个列附加一个属性名的方法,取消关系属性的有序性。
通过上述说明,基本关系有以下六条性质:
-
列是同质的(homogeneous)
每一列的分量是同一类型的数据,来自同个域
-
不同的列可出自同一个域
- 其中的每一列为一个属性
- 不同的属性要给与不同的属性名
-
任意两个元组的候选码不能取同个值
也就是元组不能重复
-
列的顺序无所谓,列的次序可以任意交换
-
行的顺序无所谓,行的次序可以任意交换
-
分量必须取原子值
也就是每个分量都必须是不可分的数据项,是最基本的一条
2、关系模式
数据库中要区分型和值。关系数据库中,关系模式是型,关系是值。关系模式是对关系的描述。
关系是元组的集合,因此:
-
关系模式是这个元组集合的结构,包括:
- 哪些属性构成
- 属性来自于哪些域
- 属性与域之间的映像关系。
-
需要完整的约束条件
关系模式可以形式化地表示为:
R( U , D , DOM , F )
-
R 关系名
-
U 组成该关系的属性名集合
-
D U中属性所来自的域
-
DOM 属性向域的映像集合
-
F 属性间数据的依赖关系的集合
举个栗子🌰
-
导师和研究生出自同一个域——人
-
取不同的属性名,并在模式中说明他们分别出自哪个域(定义属性向域的映像)
DOM(SUPERVISOR-PERSON)
= DOM(POSTGRADUATE-PERSON)
= PERSON
关系模式通常可以简单记为:
R(U) 或 R(A1,A2,…,An)
- R 还是指关系名
- A1,A2,…,An 属性名
- 域名及属性向域的映像常常直接说嘛为属性的类型、长度
关系模式与关系
-
关系模式:
- 对关系的描述
- 静态的、稳定的
-
关系
- 关系模式在某一时刻的状态或内容
- 动态的、随时间不短变化的
-
关系模式和关系往往统称为关系
通常通过上下文加以区别
3、关系数据库
在一个给定的应用领域中,所有关系的集合构成一个关系数据库
-
型
关系数据库模式,是对应关系数据库的描述
-
值
关系模式在某一时刻对应的关系的集合,通常称为关系数据库
4、关系模型的存储结构
关系数据库的物理组织
- 有的关系数据库管理系统中一个表对应一个操作系统文件,将物理数据组织交给操作系统完成。
- 有的关系数据库管理系统从操作系统那申请若干个大的文件,自己划分文件空间、组织表、索引等存储结构,并进行存储管理
二、关系操作
常见的关系操作
- 查询操作:选择、投影、连接、除、并、交、差、笛卡尔积
- 数据更新:插入、删除、修改
关系操作的特点
- 集合操作方式:操作的对象和结果都是结合,以此一集合的方式
关系代数语言
- 用对关系的运算来表达查询要求
- 代表:ISBL
关系演算语言:用谓词来表达查询要求
- 元组关系演算语言
- 谓词变元的基本对象是元组变量
- 代表:APLHA、QUEL
- 域关系演算语言
- 谓词边关的基本对象是域变量
- 代表:QBE
具有关系代数和关系演算双重特点的语言
- 代表:SQL (Structured Query Language)
三、关系的完整性
实体完整性、参照完整性、用户定义的完整性都都必须满足才行
关系的三类完整性约束
- 实体完整性和参照完整性
- 关系模型必须满足的完整性约束条件称为关系的两个不变性,应该由关系系统自动支持
- 用户定义的完整性
- 应用领域需要遵循的约束条件,体现了具体领域中的语义约束
1、实体完整性
简单来说,就是主属性不能取空值
规则:实体完整性规则 Entity Integrity
-
若属性A是基本关系R的主属性,则属性A不能取空值
-
空值就是“不知道”,“不存在”或“无意义”的值
-
说明:
-
实体完整性规则是针对基本关系而言的。
一个基本表通常对应现实时间的一个实体集
-
现实世界中的实体是可以区分的,即他们具有某种唯一性标识。
-
关系模型中以主码作为唯一性标识
-
主码中的属性即主属性不能取空值
主属性取空值,就说明存在某个不可标识的实体,即存在不可区分的实体,与第2点相矛盾,,因此这个规则称为实体完整性
-
2、参照完整性
1): 关系间的引用
在关系模型中实体及实体之间的联系都是用关系来描述的,自然存在着关系与关系间的引用。
举个栗子🌰:
对于学生来说,学号就是唯一标识符,是主码
在班级中,班长对于学生是“外码”,引用了本关系的“学号”,且班长必须是确实存在的学生的学号
2): 外码
设F是基本关系R的一个或一组属性,但不是关系R的码,若F与基本关系S的主码Ks相对应,则称F是R的外码
说人话就是,数据库中如果一个关系中的一个属性是另一个关系中的主码,这个属性就是外码。
基本关系R称为参照关系
基本关系S称为被参照关系或目标关系
举个栗子🌰:
学生关系的“专业号”与专业关系的主码“专业号”相对应
-
“专业号”属性是学生的外码
-
专业关系是被参照关系,学生关系是参照关系
graph LR a(学生关系) -->|专业号|b(专业关系)
3): 参照完整性规则
规则:若属性/属性组F是基本关系R的外码,它与基本关系S的主码Ks相对应(R和S可能是相同的),则对于R中每个元组在F上的值必须为以下其中之一:
- 空值(F的每个属性值都为空值)
- 等于S中某个元组的主码值
举个栗子🌰:
学生关系中每个元组的 “专业号” 属性只取两类值
- 空值,还没给这个学生分配专业
- 非空值,这个值得是专业关系中某个“专业号”值,毕竟不可能给学生分配一个根本不存在的专业
3、用户定义的完整性
针对某一具体关系数据库的约束条件,它反映某一具体应用所涉及的数据 必须满足的语义要求。
例如要求某个属性必须去取唯一值,某个非主属性也不能取空值,某个属性的取值范围在0-100之间……
关系模型应提供定义和检验这类完整性的机制,以便用统一的、系统的方法来处理它们,而不需用程序来承担这个功能。
四、关系代数
关系代数是一种抽象的查询语言,它用对关系的运算来表达查询
关系代数
- 运算对象是关系
- 运算结果也为关系
- 关系代数的运算符有两类
- 集合运算符
- 专门的关系运算符
传统的集合运算是从关系的 “水平” 方向(行的角度)进行的
专门的关系运算不仅涉及行、还涉及列
类别 | 运算符 | 含义 |
---|---|---|
集合运算符 | ∩ | 交 |
- | 差 | |
∪ | 并 | |
x | 笛卡尔积 | |
专门的关系运算符 | σ | 选择 |
π | 投影 | |
▷◁ | 连接 | |
÷ | 除 |
1、传统的集合运算
先规定R和S两个表:
- 具有相同的目n(即两个关系都有n个属性)
- 相应的属性取自同一个域
R | A | B | C | S | A | B | C |
---|---|---|---|---|---|---|---|
a1 | b1 | c1 | a1 | b2 | c2 | ||
a1 | b2 | c2 | a1 | b3 | c2 | ||
a2 | b2 | c1 | a2 | b2 | c1 |
R∪S
仍为n目关系
$$
R\cup S={t|t\in R\vee t\in S}
$$
R∪S | A | B | C |
---|---|---|---|
a1 | b1 | c1 | |
a1 | b2 | c2 | |
a2 | b2 | c1 | |
a1 | b3 | c2 |
R - S
R-S | A | B | C |
---|---|---|---|
a1 | b1 | c1 |
R∩S
R∩S | A | B | C |
---|---|---|---|
a1 | b2 | c2 | |
a2 | b2 | c1 |
RxS
严格来说应该是广义的笛卡尔积
R:n目关系,k1个元组
S:m目关系,k2个元组
RxS
-
列 (n+m)列元组的集合
- 元组的前n列是关系R的一个元组
- 后m列是关系S的一个元组
-
行:k1 x k2个元组
- $$
R \times S = {\stackrel\frown{t_rt_s}|t_r\in R\wedge t_s\in S}
$$
- $$
2、专门的关系运算
引入的记号:
-
(1) R,t∈R,t[Ai]
设关系模式为R(A1,A2,…,An)
关系设为R
t∈R表示t是R的一个元组
t[Ai]表示元组T中相应于属性Ai的一个分量
-
(2) A , t[A] , $\overline{A}$
若$A={A_{1k},A_{2k},…,A_{ik}}$,其中$A_{1k},A_{2k},…,A_{ik}$是A1,A2,…,An中的一部分,则A称为属性列或属性组。
$t[A]=(t[A_{i1}],t[A_{i2}],\cdots ,t[A_{ik}])$表示元组t在属性列上各个分量的集合
$\overline{A}$表示A1,A2,…,An中去掉$A_{1k},A_{2k},…,A_{ik}$后剩下的属性组。
-
(3) $\stackrel\frown{t_rt_s}$
R为n目关系,S为m目关系
tr∈R,ts∈S, $\stackrel\frown{t_rt_s}$称为元组的连接
$\stackrel\frown{t_rt_s}$是一个n+m列的元组,前n个分量为R中的一个n元组,后m个分量为S中的一个m元组
-
(4) 象集Zx
给定一个关系R(X,Z),X和Z为属性组
当t[X]=x时,x在R中的象集(Images Set)为:
$$
Z_x={t[Z]|t\in,t[X]=x}
$$
它表示R中属性组X上值为x的各个元组在Z上分量的集合举个栗子🌰、有个表R:
x1 Z1 x1 Z2 x1 Z3 x2 Z2 x2 Z3 x3 Z1 x3 Z3 -
x1在R中的象集
Zx1={Z1,Z2,Z3}
-
x2在R中的象集
Zx2={Z2,Z3}
-
x3在R中的象集
Zx3={Z1,Z3}
-
1): 选择
选择又称为限制(Restriction)
选择运算符的含义
-
在关系R中选择满足给定条件的各个元组
$$
\sigma_F®={t|t\in R\wedge F(t)=‘True’}
$$ -
F: 选择条件,是一个逻辑表达式,取值为 True 或 False
- 基本形式是:X1 θ Y1
- θ 表示比较运算符,可以是>、≥、<、≤、= ……
-
选择运算是从行的角度进行运算
2): 投影
从R中选出若干属性列组成新的关系
$$
\Pi_A®={t[A]|t\in R}
$$
投影操作主要是从列的角度进行运算
投影后不仅取消了原关系中的某些列,而且还可能取消某些元组(避免重复行)
可以看到,象集的本质是一次选择运算和一次投影运算。
3): 连接
连接也称为θ连接
连接运算中
- 从两个关系的笛卡尔积中选取属性见满足一定条件的元组
$$
R \underset{A\theta B}{\Join}S={\stackrel\frown{t_rt_s}|t_r\in R \wedge t_S \in S\wedge t_r[A]\theta t_s[B]}
$$
(1) 两种常用的连接运算
-
等值连接(equijoin)
-
θ为 “=” 的连接运算,就称为等值运算
-
从关系R和S的广义笛卡尔积中选取A、B属性相等的那些元组,表示方式为:
$$
R \underset{A\theta B}{\Join}S={\stackrel\frown{t_rt_s}|t_r\in R \wedge t_S \in S\wedge t_r[A]= t_s[B]}
$$
-
-
自然连接(Natureal join)
-
自然连接是一种特殊的等值连接
- 两个关系中进行比较的分量必须是相同的属性组
- 在结果中重复的属性列要去掉
-
自然连接的含义
- R和S具有相同的属性组B
$$
R {\Join}S={\stackrel\frown{t_rt_s}[U-B]|t_r\in R \wedge t_S \in S\wedge t_r[B]= t_s[B]}
$$
- R和S具有相同的属性组B
-
一般的连接操作是从行的角度进行运算
自然连接还需要取消重复列,所以是同时从行和列的角度进行运算
举个栗子🌰
话说我们举了好多个栗子,希望能够便于理解吧
首先有两个表格,用Markdown画这种有点太麻烦了,直接用图吧
一般的连接$R \underset{C<E}{\Join}S$的结果如下,满足C<E即可连接:
等值连接$R \underset{R.B=S.B}{\Join}S$的结果如下,可以看到R表B值和S表B值相同才能连接
自然连接,重复的属性列就没有了。 上面的等值连接进行比较的都是B属性, 但还可以进行R.B = S.E等值连接, 而自然连接只能是同名属性组
最后总结一下:
-
等值连接必须要有等值的条件,当条件不同时连接的结果也不相同,两个关系可以没有相同的属性列
-
自然连接必须要有相同的属性列才能进行,即等值连接之后要去除相同的属性列
(2) 悬浮元组(Dangling tuple)
两个关系R和S在做自然连接时,关系R中某些元组有可能在S中不存在公共属性上值相等的元组,从而造成R中这些元组在操作时被舍弃了,这些被舍弃的元组称为悬浮元组。
(3) 外连接(Outer Join)
- 如果把悬浮元组也保存在结果关系中,而在其他属性上填 空值(NULL),就叫做外连接
- 左外连接:只保留左边关系R中的悬浮元组
- 右外连接:只保留右边关系S中的悬浮元组
上面R和S生成的外连接表为:
左外连接与右外连接就分别如下(空缺元素就用NULL补上):
4): 除运算
给定关系R(X,Y)和S(Y,Z),其中X Y Z为属性组
-
R中的Y & S中的Y可以由不同的属性名,但是要出自相同的域集
-
R与S的除法运算得到一个新的关系P(X)
-
P是R中满足下列条件的元组在X属性列上的投影
-
元组在X上分量x的象集Yx包含S在Y上投影的集合,记作:
$$
R \div S={t_r[X] | t_r\in R \wedge \Pi_Y(S)\subseteq Y_X}
$$
Yx: x在R中的象集,$x=t_r[X]$。
除运算是同时从行和列进行运算的
除法具体计算步骤:
- 计算$\Pi_Y(S)$,将结果记为Sy
- 计算$\Pi_X®$,将结果记为Rx
- 遍历Rx中每一个元素a,计算a在关系R中的象集,得到Ya
- 判断Sy是否为Ya的子集
- 是:将a加入到结果中
- 不是:遍历下一个元素