在开始学习MySQL之前,感觉还是应该先了解一些数据库的基本原理,于是稍微涉猎了一点点数据库系统方面的内容,整理的笔记大概是课程里前四讲的内容,缺了关系演算,等之后有机会再补充上。
课程链接:数据库系统(上):模型与语言_哈尔滨工业大学_中国大学MOOC(慕课)
word版笔记
链接:https://pan.baidu.com/s/1UIoMYgf5doB-YWjYVBFTJQ
提取码:7ysx
ER图的使用方法
正方形代表实体,在最后实现数据库时会成为表,椭圆形代表属性,也就是实体需要记录的数据的一些具体的方面,一般会体现在表的列。实体关系图中的每一个属性至少要连接到某一个实体,且同一实体对应的属性应当相同。
每一条收集到的某一个实体的数据称为该实体的实例(entity instance)实体的实例可以看成是数据表中的行,实体中的属性,在每一个实例中均有对应的值,这个值被称为唯一属性(unique attribute)
每个实体必须具有一个唯一属性,在实体中,可以把唯一属性划线进行标识,如下图
如果一个实体中有多个唯一属性,那么其中的任何一个都可以被用作唯一键
每个实体或者类比必须与数据库中的至少一个其他实体相关,可以使用菱形和线条来表述这些关系,两个实体之间的关系的这些限制称为基数约束,在实体关系图中可以用在实体矩形旁边的符号表示,如果实体旁边是直线,则表示一,如果分叉,则表示很多,例如,在下图中就表示一所大学至少要录取一名学生,但可以被很多学生加入;而反向阅读的结果是,一名学生最少进入一所大学,且不能超过一所大学。
数据库的基本概念
数据库是按照某一特定的数据结构来组织、存储和管理数据的仓库。
数据库的主要功能
1、定义功能,DBMS提供了数据定义语言(DDL),用户通过它可以方便的对数据库中的数据对象进行定义
2、操纵功能,DBMS还提供了数据操纵语言(DML),用户可以用DML操纵数据,实现对数据库的基本操作,如查询、插入、删除和修改等。
3、运行管理,数据库在建立、运行和维护时由DBMS统一管理、统一控制、以保证数据安全性和完整性、多用户对数据的并发使用及发生故障后的系统恢复。
数据库系统的标准结构(三层模式+两层映像)
1、数据库系统的分层抽象
第一层:外部/用户层次 指代某一用户能够看到和处理的数据库
第二层: 概念/逻辑层次 指从全局角度理解/管理的数据,含有相应的关联约束
第三层:内部层次 存储在介质上的数据,包含存储路径、存储方式,索引方式等等
模式(Schema):对于数据库中数据所进行的一种结构性的描述
视图/数据:某一表现形势下表现出来的数据库的数据
依据刚才的三次分层即可得到对应的三级模式,即内模式,概念模式和外模式
两层映像
E-C mapping:将外模式映射为概念模式,从而实现数据概念试图向外部视图的转换,便于用户观察和使用
C-I mapping:将概念模式映射为内模式,从而实现数据概念视图向内部视图的转换,便于计算机存储和处理
数据独立性:数据库不会因为系统数据存储结构与数据逻辑结构的变化而影响应用程序
逻辑数据独立性
当概念模式变化时,可以不改变外部模式(只改变E-Cmapping),从而无需改变应用程序
物理数据独立性
当内部模式改变时,可以不改变概念模式(只改变C-Imapping),从而不改变外部模式。
数据模型
规定模式统一的描述方式为模型,包括:数据结构、操作和约束
数据模型是对模式本身结构的抽象,模式是对数据本身结构形式的抽象
比如:关系模型:所有模式都可为抽象表的形式(数据结构),而每一个具体的模式都是拥有不同列名的具体的表,对这种表形式的数据有哪些[操作]和[约束]?
三大经典数据模型
关系模型:表的形式组织数据
层次模式:树的形式组织数据
网状模型:图的形式组织数据
关系模型简述
一个关系(relation)就是一个table
关系模型就是处理table的,它包含三个部分:
1、描述数据库各种数据的基本结构形式
2、描述table与table之间所可能发生的各种操作(关系运算)
3、描述这些操作所应遵循的约束条件
完整性约束:实体完整性、参照完整性和用户自定义的完整性
关系运算包括关系代数和关系演算;关系演算则包括元组演算和域演算,以下分别介绍
关系代数是一种基于集合的运算,即:操作的对象及结果都是集合,是一次一集合(set-at-a-time)的操作,而非关系型的数据操作通常是一次一记录(record-at-a-time)的操作
基于关系代数设计的数据库语言(ISBL):用计算机可识别的符号表征关系代数的运算符号
元组演算:基于逻辑的运算。
域演算:基于示例的运算
什么是关系(relation)?
首先,定义“列”的取值范围“域”(Domain)
域(Domain):一组值的集合,且这组值具有相同的数据类型,集合中元素的个数称为域的基数(cardinality)
再定义“元组”及所有可能组合成的元组:笛卡尔积(Cartesian product)
一组域D1,D2,D3....Dn的笛卡尔积为D1*D2*...*Dn={(d1,d2,d3...,dn)|di∈Di,i=1,...,n}
元组是从每一个域任取一个值所形成的一种组合,笛卡尔积是所有这种可能组合的集合
笛卡尔积的每个元素成为一个n-元组(n-tuple)
元组(d1,d2,d3...,dn)的每一个值叫做一个分量(component)
若Di的基数为mi,则笛卡尔积的基数,即元组的个数为m1*m2*....*mi
而在笛卡尔积中,具有某一方面意义的元组被称作一个关系
由于关系的不同列可能来自于同一个域,为进行区分,需要为每一列起一个一个名字,即属性名
域命与属性名的不同:域名对应到总表中,而属性名则存在于关系中
比如,下表中的男人,女人,小孩即为域名,
男人 | 女人 | 儿童 |
李林 | 李丽 | 李* |
而换成丈夫,妻子,儿童则为属性名
关系可用R(A1:D1,A2:D2,An:Dn)表示,这种描述又被称为关系模式(Schema)
R是关系的名字,Ai是属性,Di是属性所对应的域,n是关系的度(degree),关系中元组的数目称为关系的基数(Cardinality)
案例:家庭(丈夫,妻子,子女)
关系模式R(A1:D1,A2:D2,...An:Dn)中属性向域的映像在很多DBMS中一般直接说明为属性的类型、长度等
如course(C# char(3),Cname char(12),chours integer,credit float(1),T# char(3))
同一关系模式下,可以有很多关系,关系模式是稳定的,而关系是某一时刻的值,是有可能随时间变化而变化的
关系的特性
1、每一列的分量来自同一域,是同一类型的数据
2、不同的列可来自同一个域,称其中的每一列为一个属性,不同属性要给予不同的属性名。
3、关系是以内容来进行区分的,本身与行和列的位置无关,比如将下图中的男人与女人互换,并不会产生影响
4、理论上,关系的任意两个元组不能完全相同,而在现实应用中,表可能并不完全遵守这个特性。
男人 | 女人 | 儿童 |
李林 | 李丽 | 李* |
5、关系必须满足属性不可再分的要求(关系第一范式)
关系中的一些重要概念——候选码/候选键
关系中的一个属性组,其值能唯一标识一个元组,若从该属性组中去掉任何一个属性,它就不具有这一性质,这样的属性组称作候选码
例如:“学生(S#,Sname,Sage,Sclass)”里的S#就是一个候选码
再比如:“选课(S#,C#,Sname,Cname,Grade)”此时(S#,C#)联合起来也是一个候选码。
主码(Primary Key)当有多个候选码的时候,可以选择一个作为主码,包含在任何一个候选码中的属性被称为主属性,而其他属性被称为非主属性。
DBMS以主码为主要线索管理管理关系中的各个元组
外码(foreign key) 关系R中的一个属性组,它不是R的候选码,但它与另一个关系S的候选码相对应,则称这个属性组为R的外码,举例而言,在下列的“合同”关系中,客户号不是候选码,但却是外码,因为它能够唯一标识“客户”这一关系
合同号 | 合同类比 | 客户号 |
BCX0001 | 劳务合同 | BCX123 |
客户号 | 客户 | 客户地址 |
BCX123 | 毕传霞 | Xx省xx市 |
两个不同的关系之间往往要依靠外码进行连接
关系模型的完整性
1、实体完整性:关系的主码中的属性值不能为空值
空值:不知道或无意义的值。
在进行关系操作时,有时关系中的某属性值在当前是填不上的,比如档案中有“生日不详”、“下落不明”等情况,这个时候就需要空值来代表这种情况,关系模型中用“?”来进行表征。
当引入空值后,函数就无法参与算术,比较或逻辑运算等等,因此需要特殊处理有空值的数据。
2、参照完整性:如果关系R1的外码Fk与关系R2的主码Pk相对应,则R1中的每一个元组的Fk值或者等于R2中某一个元组的Pk值,或者为空值。也就是说,如果关系R1的某个元组t1参照了关系R2的某个元组t2,则t2必须存在(一个学生要么还没入学(空值),要么入学进入了一个确定的学院(R2的Pk值),而不能进入一个不存在的学院)。
3、用户自定义完整性
用户针对具体的应用环境定义的完整性约束条件
例如course(C# char(3),Cname char(12),chours integer,credit float(1),T# char(3))
此时name的长度就不能超过12个字符
关系代数
基于集合,提供了一系列的关系代数操作:并、差、笛卡尔积(广义积),选择、投影和更名等基本操作,以及交、连接和关系除等扩展操作
关系代数操作以一个或多个关系为输入,结果是一个新的关系。
用对关系的运算来表达查询,需要指明所用操作,具有一定的过程性
某些关系代数操作需要有一定的前提,如并、差、交等,需满足“并相容性”
并相容性
参与运算的两个关系及其相关属性之间有一定的对应性、可比性或意义关联性
若关系R和关系S存在相容性,则有:
1、关系R和关系S的属性数目必须相同
2、对于任意关系i,关系R的第i个属性需与关系S的第i个属性相同
例如:student(SID char(8),Sname char(8))和professor(PID char(8),Pname char(8))两个关系,就是相容的
并(union):并运算是将两个关系的元组合并成一个关系,在合并时去掉重复的元组
差(difference):差运算R-S最终得到出现在关系R中但不出现在关系S中的元组构成
广义积操作(cartesian product):记作:R*S,由关系R中的元组和关系S中的元组进行所有可能的拼接构成
案例
R | ||
A1 | A2 | A3 |
a | b | c |
a | d | e |
S | ||
B1 | B2 | B3 |
a | b | c |
d | e | f |
R*S | |||||
A1 | A2 | A3 | B1 | B2 | B3 |
a | b | c | a | b | c |
a | b | c | d | e | f |
a | d | e | a | b | c |
a | d | e | d | e | f |
选择操作(select):给定一个关系R,同时给定一个选择的条件condition(简记为con)。选择运算结果也是一个关系,记做错σcon(R),它从关系R中选择出满足给定条件condition的元组组成。
投影操作(project):给定一个关系R,投影运算结果也是一个关系,记作TTA(R),它从关系R中选出属性包含在A中的列构成。
投影操作是从给定关系中选出某些列组成新的关系,而选择操作则是从给定关系中选出某些行组成新的关系。
若投影后有重复的元组,则应删除掉
交(intersection):假设关系R和关系S是并向容得,则关系R与关系S的交运算结果也是一个关系,它由同时出现在关系R和关系S中的元组构成。
θ-连接操作(theta-join)对于给定关系R和关系S,R与S的θ连接运算结果也是一个关系,它有关系R与关系S的笛卡尔积中,选取R中属性A与S中属性B之间满足θ条件的元组构成,总体而言,相当于先做笛卡尔积再做选择。
自然连接操作(Natural-Join)
定义:给定关系R和关系S,R与S的自然连接运算结果也是一个关系,它由关系R和关系S的笛卡尔积中选取相同属性B上值相等的元组构成
在自然连接中,要求R,S有相同的属性且值相等才能连接。
要在结果中去掉重复的属性(因结果中R.B1始终是等于S.B1,所以只保留一列即可)
书写关系代数的思路
首先看是否涉及多个表,如果不涉及,则可以直接使用关系代数运算,如果涉及多个表,则检查
1、是否能够使用自然连接
2、是否能够使用θ-连接
3、如果都不能,则使用笛卡尔积,注意限制条件
“除”运算
操作场景:“查询...全部的/所有的...”
除运算的前提条件:给定关系R(A1,A2,...An)为n度关系,关系S(B1,B2,...Bm)为m度关系。只有当属性集{B1,B2,...,Bm}是属性集{A1,A2,...An}的真子集,即m<n时,才可以进行关系R和关系S的除运算
在进行“除”运算时,首先看属性,在进行R/S时,会得到R中有而S中没有的属性。,而在元组方面,R/S得到的元组满足下述条件:
它与S中每一个元组<b1,...,bm>组合形成的一个新元组都能够在R中找到。
例如:
R | ||
A1 | A2 | A3 |
a | b | c |
d | b | c |
a | e | c |
d | b | f |
a | e | g |
a | e | h |
a | b | l |
S |
A3 |
c |
f |
R/S | |
A1 | A2 |
d | b |
a | e |
外连接操作
两个关系R与S进行连接时,如果关系R(或S)中的元组在S(或R)中找不到匹配的元组,则为了避免该元组信息丢失,从而将该元组与S(或R)中假定存在的全为空值的元组进行连接,放置在结果关系中,这种连接称为外连接(outer join)
注意:连接关系代数时,应使用∩,∪符号,而连接选择符则使用∨和∧