1 概念数据模型与基本数据模型
1.1 概念数据模型
独立于计算机系统的数据模型,它完全不涉及信息在计算机系统中的表示,只是用来描述某个特定组织所关心的信息结构,这类模型称为 “概念数据模型”。
概念数据模型用于建立信息世界的数据模型,强调其语义表达能力,概念应该简单,清晰,易于用户理解,它是现实世界的第一层抽象,是用户和数据库人员之间进行交流的工具。最著名的是“实体联系模型”。(ER模型)
1.2 基本数据模型
直接面向数据库的逻辑结构的数据模型,它是现实世界的第二层抽象。这类模型涉及到计算机系统和数据库管理系统,又称为“基本数据模型”或“结构数据模型”。
例如, 层次、网状、关系、面向对象数据模型”。这类模型有严格的形式化定义,以便在计算机系统中实现。
2 Hierarchical Data Model层次模型
2.1 两个概念
record (记录): 现实世界的实体,表达成“记录”的形式
field (字段): 每一个记录有若干个域,用来表示实体的不同特征
2.2 Parent-Child relationship (PCR)
层次结构最基本的数据关系,两个数据类型之间的1对多的关系.
RCR的定义 | PCR的实例 |
2.3 Hierarchical Data Schema 层次数据模式
每一个PCR都是1对多,N个PCR组成起来.
每个记录类型只能有一个parent.
定义 | 实例 |
2.4 Virtual Record虚记录
在真实世界中,很多数据并不是层次化结构的,很难用PCR来直接表达这种结构.
举几个例子:
多对多关系 | |
|
|
多对一关系 | |
|
|
多元关系 | |
|
为了避免冗余,同时又要保证PCR的树形结构,我们就引入了虚记录的概念.
只存一份记录,其他引用该记录的地方用指针代替(用指针代替的记录——虚拟记录)[下图中下标v表示的记录就是虚记录]
多对多关系 | ||
多对一关系 |
| |
多元关系 |
以多对多关系为例,我们定义了两个虚记录类型,一个代表学生一个代表课程。
那么我们就分别定义了课程-学生,学生-课程的一对多关系
但是此时的子女节点都是虚记录,这个虚记录记录类型并不是真正地存储数据,只是存储了一个指向真正数据的指针。
2.5 层次数据的线性表示
由于存储器是线性的,层次数据必须变换成线性形式才能存储,层次数据模式的实例对应一棵层次树(或森林),对层次树(或森林)按先序遍历生成的序列称为层次序列(hierarchical sequence),规定以此作为存储次序。
2.6 层次数据模型的特点
2.6.1 约束
(1)除了根记录外,任何其它记录不能离开其双亲记录而孤立存在;
(2)任何记录,不管虚实,只允许有一个双亲记录(保证层次数据模式及其实例是树形);
(3)虚拟记录的指针必须指向一个实际存在的记录,有虚拟记录指向的记录不得删除;
(4)虚拟记录不得为根记录。
2.6.2 优点
记录之间的联系通过指针来实现,查询效率较高(针对层次结构)。
2.6.3 缺点
1、只能表示1:N联系,虽然可以采用虚拟记录描述非层次数据关系,但较复杂,用户不易掌握,并且非层次结构的查询效率比较低;
2、由于层次顺序的严格和复杂,引起数据的查询和更新很复杂,因此应用程序的编写也比较复杂;
3、模式描述语言较复杂,数据独立性差。
3 Network Data Model 网状数据模型
网状数据模型的基本数据结构是set(系),代表了两个记录型之间的一个一对多的关系。 一这边是主记录;多这边是属记录。
一个记录类型可以是多个系的主记录,也可以是多个系的属记录。
具有多种类型属记录的系——“多属系”。
一个记录型不能同时是一个系的首记录,又是这个系的属记录。
data item:网状数据结构中对于记录的描述,有点类似于层次数据结构中的field,但是这里的‘field’可以是向量(复合类型)。
在网状数据结构中,系值不再是树了,而是链表
|
3.1 Link记录类型
在网状数据结构中,如何表达自联结呢?(因为一个记录类型不能同时是主记录和属记录)
比如我们要表示公式上下级关系的数据模式,我们引入一个LINK记录类型:
类型 | 实例 |
1:1表示一人担任一个领导岗位 1:N表示一个人可以领导N个人 |
因为自己和自己也是领导与被领导的关系,所以我们引入LINK类型进行辅助。
员工->相应LINK是一个一对一的关系,换句话说,每一个LINK就相当于员工的一个“替身”,用它和其他的员工产生联系。
s2表达的就是领导与被领导的关系。
如果想要找某一个员工的下属,先用S1链表找到他对应的S,然后用S2链表找到除了自己之外的元素,遍历这个链表。遍历到的人就是这个员工的直接下属
3.2 网状数据结构表达多对多关系
也是引用了Link记录,link记录有SL链表,是和student之间的关系;CL链表,和course之间的关系
当我们要看一个学生选了几门课的时候,我们从这个指定的学生出发,先沿着SL到Link去,然后 再从Link出发,沿着相应的CL到course
如果要看一门课那几个学生选呢?那么就反过来,从课程出发,先沿着相应的CL到link,然后从link出发,沿着SL找到所有的学生 | 本表格中靠上的图这样的表示方式是不行的(一个记录不能出现在同一系型的多个系值中,如果需要,那么必须使用Link记录) 需要这样,L5之后,沿着CL可以到DB,也可以到L6(C)
|
4 Relational Data Model 关系数据网络
关系模型(relaction data model)的主要特征是用表格结构表达实体集,用外键表示实体间联系。与层次模型和网状模型相比,关系模型比较简单.
关系模型是由若干个关系模式组成的集合。每个关系实际上是一张表格,记录之间联系是通过各个关系模式的键体现的。
关系模型最基本的数据结构是“表”。现实世界中的实体、实体和实体之间的关系都是用“表”来表示(以示区别,之前的层次和网状,实体和实体之间的关系是用层次和网络来表示的)
4.1 和层次结构、网状结构的区别
关系模型和层次、网状模型的最大差别是用键而不是用指针导航数据,其表格简单,用户易懂,用户只需用简单的查询语句就可以对数据库进行操作,并不涉及存储结构、访问技术等细节。
4.2 特点
这时候存储的东西,查询的东西,所有的东西都是表格,她们形成了一个封闭的空间,我们可以借此定义一个代数系统(关系代数)。
基于集合论,拥有更高的抽象级别。
计算机底层实现的一些细节将被屏蔽。
非过程化的查询语言(SQL)(用户只需要提供他要什么;而不用像之前的层次数据模型和网状数据模型一样,需要详细说明他需要怎么查询【遍历链表or遍历树等到】)
4.2.1 软连接
之前的两种数据模型中,多对多是复杂的(要么需要虚记录、要么需要LINK记录).
在关系数据模型中,我们只需要再做一张表(如下图的elective),里面的s#和C#就是student和course的id,可以看成这两个的逻辑指针(即软连接)。
4.3 关系数据模型的一些概念
属性(attribute):实体的性质用属性描述(eg,学生的姓名、学号。。。)
域(domain):每一个属性都有一个取值范围,这个范围就是域。
4.3.1 域的性质
1范式限制(1NF):每一个属性都是原子的,不能再分;即每一个属性不能是结构啊数组啊什么的;换句话说,不允许出现表中套表。
允许某一个记录里面的值是空值(NULL,不知道,表示该属性值空缺)
同一关系中,不允许有同名属性,但不同属性可有相同的域。
4.3.2 关系
任何一个实体都是一个或者多个关系
如果一个关系R,有n个属性A1,A2,…..An,相对应的域是D1,D2,……Dn,那么关系R可以表示为R = (A1/D1, A2/D2, … An/Dn),简化为R = (A1, A2, … An) ——>这个就是关系的模式(schema)
n是关系的度/目(degree)
在关系R中,元组的次序无关,但不能允许有相同的二个元组
在关系R中,属性的次序无关。
4.3.3 元组
元组是关系R的一个实例
一个关系R可以被表示成 r 或 r(R),r = {t1, t2, …, tm}
每一个元组可以表示为t = <v1, v2, …, vn>, vi∈Di, 1≤i ≤n ( t ∈ D1×D2×, …, ×Dn, 1≤i ≤n)
relation也被叫做表格,attribute被叫做列,tuple被叫做行。
4.4 键
4.4.1 候选键(candidate key)
对一个关系而言,一组属性被称之为候选键,当他满足以下条件:
1,任意两个元组,这组属性里面的值都不一样
2,这组属性里面的任何一个子集都不具备上一条特点
那么这一组属性就被称之为候选键 candidate key(eg,身份证号码)
(说白了就类似于极大无关组)
4.4.2 超键(super key)
如果不满足候选键的条件2,也就是说有冗余的属性,那么这样的一组属性被称之为超键 super key。
4.4.3 主键(primary key)与全键(all key)
极大无关组不唯一,所以候选键也不唯一,那么我们可以选定其中一组为主键 primary key,其他的是候选键alternate key。
如果主键包括了关系中所有的属性,那么我们称之为全键all key。
4.4.4 外键(foreign key)
如果这一张表里面的属性是用来引用另一张表的元组(即另一张表的主键),那么这一张表里面的这个属性被称为外键
在students里面sid是主键,在enrolled里面,sid是外键
4.5 约束
4.5.1 域完整性约束(Domain integrity constraint)
每条元组的每个属性的值均符合值域的要求.
4.5.2 实体完整性约束(Entity integrity constraint )
主键的属性不允许为空
如果这个值一定要为NULL,那么就不把它设置为主键.
4.5.3 引用完整性约束
外键要么空缺,要么引用实际存在的主键值
5 关系代数
5.1 这一小节会使用到的表格
水手信息的表格(rating是水手的级别)
船信息的表格
预定关系(这时候水手的id和船的id加起来的这个属性组并不是主键,因为同一个水手可以在不同时间预定船,所以此时的主键是全键)。
5.2 基本运算符
如果一个系统支持以下五个基本操作,那么这个系统是关系完备的(关系模型上的所有操作都可以通过这五个操作导出)。
因为这些操作的结果也都是关系,所以这些运算符是可以相互组合的。
一元操作(单目)优先级高于二元操作。
5.2.1 选择
1-Selection (σ):选择是一种单目运算,即对一个关系施加的运算,按给定条件从关系中挑选满足条件的元组组成的集合 。
5.2.2 投影
Projection (Π) :投影操作是单目运算,从关系中挑选指定的属性组成的新关系。即把不需要的域(列)去掉
理论上投影操作需要去除重复元素(面向对象的模型里面,哪怕所有属性都一样,只要两个元素id不同,就不是一个元素;但是在关系模型里面,如果所有的属性都相等,那么我们认为它们表达的是同一个元素)。
但在实际的数据库操作里面,是不主动去除同样的元素的,除非用户显示地要求删去(因为数据库并不知道用户的应用开发需要什么样的数据,删除了可能反而无法满足用户的需求)。
5.2.3 笛卡尔积
Cross-product (笛卡尔乘积):把两个关系拼接在一起,两张表拼成一张大表
笛卡尔乘积的结果包含原来两张表的所有属性。
结果由参加运算的两个表格的每一条元组两两拼接而成。
<t,g>为t和g的拼接,即R × S仍为一个关系,它的目为nr+ns、元组数为|R|×|S|。
以S1×R1为例:
但因为S1和R1都有sid这个属性,而同一张表里面不允许有两个相同的属性;于是我们要对属性进行重命名:
结果为
5.2.4 集合差
et-difference (-):集合差,A-B:属于关系A,但是不属于关系B的记录
交运算可以用差运算表示。设A、B为两个集合,则A和B的交可表示为:A∩B≡A-(A-B)
5.2.5 集合并
Union(∪) 集合并 由属于A或属于B的所有元组组成的集合。即两个表合并成一个
参与并、差操作的两个关系的元组必须限制为同类型的,即具有相同的目(属性数),且对应的属性的域相同——并兼容(union compatibility);
5.3 连接
5.3.1 条件连接 condition join
笛卡尔乘积是两两拼接,这就可能会出来很多没有意义的元组,导致数据冗余。
条件链接就是在笛卡尔乘积的基础上,对结果按照条件C进行选择操作。
有的时候,条件连接也叫做θ连接。
连接条件为两关系中对应属性的比较,对应属性不一定同名,但要有相同的域。其普遍表示形式为:<条件1>and<条件2>and…and<条件k>。
5.3.2 等值连接 equi-join
特殊的条件链接,只有做笛卡尔乘积的两个表格,某一个/几个属性相同的才会被选择
等值连接的结果相比于条件链接和笛卡尔乘积的结果,把等值的属性去掉一个。
5.3.3 自然连接 natural join
做笛卡尔乘积的两个表格,所有公共属性相同的才会被选择.
5.4 完备性
5.5 除法
结果的x集合满足什么条件呢?对于B中的每一个y,都可以在A中找到一条记录,使得<x,y>在A中
举一个例子,A是由sno和pno两个属性组成,A/B的结果只有sno属性,因为pno属性被除掉了。
我们要找 原来关系A中,和B中的每一条元素都有联系的xno。
我们举A/B2为例,为什么不选s2呢?因为在A中有<s2,p2>,但没有<s2,p4>,所以不满足除法条件(对于B中的每一个y,都可以在A中找到一条记录)
5.5.1 除法的表示
因为除法不是基本运算符,所以我们要看一下怎么把除法用五个基本运算符表示。
直接看“满足和所有B中元素都有联系”这个约束条件比较繁琐,所以我们可以从”否定之否定“的角度来看这个问题。即先看不满足除法条件的点,然后把这些点剔除就可以了。
我们先看
A中所有的x和B两两拼接,进行笛卡尔乘积,那么所有可能的A_x与B 的组合都有了。
接着是
把所有A中有的<x,y>对去掉,那么剩下的就是不满足除法条件的所有<x,y>对了(不在原来A中的<x,y>对)
把所有不满足除法条件的<x,y>对中的x提出来,这些x就是不满足除法条件的点(因为如果某一个x满足除法条件的话,那么所有这个x的<x,y>对在前面-A的时候应该都消掉了,留下来的都是至少有一个<x,y>对不在A中的)
于是我们得到了A/B(剔除上一步的x即可)
5.6 外连接
一般的连接是自然连接,那么不满足连接操作的元组都会被丢弃。
如果我们一定要这些元素呢?那我们就要用外连接了。
外连接一共分成左外连接、右外连接和全外连接,分别是把左操作数、右操作数、两个操作数的所有元组保留。能匹配的匹配,匹配不到的属性对应的值为空值NULL
5.7 外并
执行基本操作并,需要满足的条件是属性模式需要相同。但实际应用中,不满足并兼容关系的也要合并在一起的话,那就需要使用外并了。结果的属性集是参与运算的属性集的并。没有值的元素填NULL。
6 关系演算Relational Calculus
用关系代数表示的操作,需要我们指定运算的顺序【因而以关系代数为基础的DB语言是过程性语言(procedural language)】,而关系演算只需要指明需要满足的逻辑条件(基于谓词演算的逻辑表达式)【只要说明所要得到的结果,而不必标明操作的过程,因而以关系演算为基础的数据库语言是说明性语言(declarative language)】。
换言之,关系演算只用谓词公式告知“做什么”,而不告诉“怎么做”。
目前,面向用户的关系数据库语言基本上都以关系演算为基础。
关系演算分为元组关系演算(以元组为单位定义变量)和域关系演算 (以属性为单位定义变量),他们唯一的区别是变量的定义。
关系演算中的布尔表达式称为公式,所有让布尔表达式为真的结果就是我们要的答案。
6.1 安全查询
我们可以写出一个句法上是正确的,但是满足结果的条件是无限多的关系演算。这样的查询是不安全的。
还是以水手为例,比如这样的一个关系演算
意思为找出所有不在sailer表里面的水手,这个关系演算句法上是对的,但是是不安全的,因为我们可以找到无限个这样的满足条件的水手。
6.2 表达能力完备性
关系代数可以表达的,我们也可以用一个安全的域关系演算或者元组关系演算表达(两者表达能力等价)。
6.3 域关系演算 Domain Relational Calculus
变量定义在域,也就是属性上面。形式如下:
‘|’号右边的公式可以有更多的域变量,但对于结果我只需要n个就够了。
6.3.1 DRC中的原子公式
其中X,Y都是域变量,op是比较运算符。
6.3.2 DRC中的公式
后两行“free”的意思是,在p(X)里面,X没有被任取和存在限制。
还是以之前的水手为例,那么如果我们要找到等级在7以上的水手的id,名字等级和年龄,我们用关系演算可以这么写:
6.4 元组关系演算Tuple Relational Calculus
有如下的格式:
t是元组变量,既可以用整个t作为查询对象,也可查询t中的某些属性。
如果查询整个t,则可省去<属性表>。
还是以水手为例,我们要找到所有等级在7以上,年龄在50以下的水手的名字,我们可以这么写
6.5 关系操作用关系演算表达
6.5.1 投影
6.5.2 选择
6.5.3 减法
6.5.4 (自然)连接
7 传统数据结构的评价
传统数据结构是我们之前讨论过的层次、网状、关系数据结构的统称。
7.1 特点
●都继承了文件中的记录、字段等概念。
●物理级也借鉴了文件的索引、散列等存取方法。
●向用户提供了统一的数据模型和相应的数据库语言。
●都在记录的基础上定义了数据的基本结构、约束和操作
7.2 不足
以记录为基础,基于结构化数据实现,把现实数据表示成规范化的内容,但这样就不能很好地面向用户和应用。
不能很自然地表达实体和实体之间的联系。
缺乏语义信息(以关系为例,把实体表达成一张一张的表,从逻辑上讲,表之间的地位是平等的。表之间的相互引用、继承关系等内在联系,则需要约束、应用程序、数据库的文档等才能看出来。单独从模型的角度,是看不出来的)。
支持的数据类型太少(结构、字典、列表这种都不行)。
8 ER模型
E-R数据模型不是面向实现,而是面向现实世界。其设计的出发点是有效自然的模拟现实世界,而不是首先考虑它在机器中的实现问题。
E-R模型提供了实体、属性和联系三个抽象概念。这三个概念简单、明了、直观易懂,用以模拟现实世界比较自然,且可方便地转换关系、层次、网状数据模式。
用E-R表示数据模式时,我们只关心有哪些数据(即有哪些实体以及属性)以及数据间的关系(实体关系),而不必关心这些数据在计算机内如何表示和用什么DBMS。
在E-R模型中,实体和联系均可有属性,如选课联系的属性可有成绩、选课时间等。
ER模型的实体大部分特点和关系模型是一样的,不过实体的属性允许复合类型,允许多值属性。(比如一个人有多个电话,那么电话这个属性就可以是多值属性)
8.1 ER图
虽然ER模型最终没有成功,但是它的衍生物,ER图在数据库的设计中起到的重要的作用(我们直接看图就能知道他的语义信息)
8.2 ER图的扩展(EER extended ER)
8.2.1 弱实体Weak entity
不能单独存在,必须依赖于其他的实体。
eg,学校职工-职工家属,每个职工家属实体都是弱实体,必须依赖于职工存在。
8.2.2 普遍化与特殊化 Specialization and Generalization
类似于面向对象里面的子类和父类。
8.2.3 聚集
允许将两个实体间的关系也看成一个实体。
8.2.4 范畴 Category
可以用不同类型的实体组成的集合表达一个实体。