数据模型(data model)也是一种模型,是对现实世界数据特征的抽象,用来描述数据、组织数据和对数据进行操作。计算机不可能直接处理现实世界中的具体事物,所以人们必须事先把具体事物转换成数据,现有的数据库系统均是基于某种数据模型的。数据模型应满足三方面要求:
在数据库系统中针对不同的使用对象和应用目的,采用不同的数据模型,可以将这些模型划分为属于不同层次的两大类。第一类是概念模型,第二类是逻辑模型和物理模型。
数据模型 | 说明 |
---|---|
第一类概念模型 | 按用户的观点来对数据和信息建模,用于数据库设计 |
第二类逻辑模型 | 按计算机系统的观点对数据建模,用于数据库管理系统的实现 |
第二类物理模型 | 是对数据最底层的抽象,描述数据在系统内部的表示方式和存取方法 |
为了把现实世界中的具体事物抽象、组织为某一数据库管理系统支持的数据模型,人们常常首先将现实世界抽象为信息世界,然后将信息世界转换为机器世界。
数据模型是严格定义的一组概念的集合,用于描述了系统的静态特性、动态特性和完整性约束条件。数据模型通常由数据结构、数据操作和数据的完整性约束条件三部分组成。
组成要素 | 说明 |
---|---|
数据结构 | 描述数据库的组成对象以及对象之间的联系 |
数据操作 | 指对数据库中各种对象(型)的实例(值)允许执行的操作的集合,包括操作及有关的操作规则 |
完整性约束条件 | 是一组完整性规则,给定的数据模型中数据及其联系所具有的制约和依存规则 |
层次模型是数据库系统中最早出现的数据模型,用树形结构来表示各类实体以及实体间的联系。每个结点表示一个记录类型,记录类型之间的联系用结点之间的有向边表示,层次数据库系统只能处理一对多的实体联系。在数据库中定义满足下面两个条件的基本层次联系的集合为层次模型:
例如一个教师学生层次模型,它有 3 个记录类型,专业是根结点,教师和学生类型是专业的子结点。进行插入操作时,如果没有相应的双亲结点值就不能插入它的子女结点值。进行删除操作时,如果删除双亲结点值,则相应的子女结点值也将被同时删除。
层次模型的优点主要有:
层次模型的缺点主要有:
在现实世界中事物之间的联系更多的是非层次关系的,用层次模型表示非树形结构能力有限,网状模型则可以克服这个问题。在数据库中,把满足以下两个条件的基本层次联系集合称为网状模型:
例如一个借书网状模型,一个学生可以借多本书,一本书也可以在不同的时间被不同的同学借走,因此这是一个多对多的联系。学生记录的一个值,借书记录可以有多个值和它对应,但是借书记录的一个值只能和一个学生记录值对应。学生和借书之间是一对多关系,书籍和借书之间也是一对多关系。
网状模型的优点主要有:
网状模型的缺点主要有:
关系模型建立在严格的数学概念的基础上,是最重要的一种数据模型。在关系模型中,现实世界的实体以及实体间的各种联系均用单一的结构——关系来表示,每个关系的数据结构是一张规范化的二维表。
关系模型要求关系必须是规范化的,关系的每一个分量都是不可分的数据项。以下为关系模型的一些重要概念:
术语 | 说明 |
---|---|
关系 | 一个关系对应通常说的一张表 |
元组 | 表中的一行即为一个元组 |
属性 | 表中的一列即为一个属性,给每一个属性起一个名称即属性名 |
码 | 也称为码键。表中的某个属性组,它可以唯一确定一个元组 |
域 | 域是一组具有相同数据类型的值的集合,属性的取值范围来自某个域 |
分量 | 元组中的一个属性值 |
关系模式 | 对关系的描述,一般表示为关系名(属性1, 属性2, ……, 属性n) |
例如用户的登录表可以认为是一个关系,一条用户记录为一个元组,用户 id、用户名和密码等是用户的属性。用户 id 可以唯一确定一个用户,所以它是这个关系的码。用户的密码都是 MD5 单向加密的结果,所以密码的取值来自于 32 位字符串这个取值范围中。
笛卡儿积是域上的集合运算可表示为一张二维表。表中的每行对应一个元组,表中的每一列的值来自一个域。例如给出三个域,分别表示教师集合、课程集合和教师集合:
D1 = {张老师, 王老师} D2 = {离散数学, 数据结构} D3 = {1号楼101, 1号楼102}
则 D1、D2、D3 的笛卡尔积为如下,笛卡尔积的基数为 2×2×2,也就是说 D1×D2×D3 一共有 8 个元组,这些元组可以组成一张表。
D1×D2×D3= { (张老师, 离散数学, 1号楼101), (张老师, 离散数学, 1号楼102), (张老师, 数据结构, 1号楼101), (张老师, 数据结构, 1号楼102), (王老师, 离散数学, 1号楼101), (王老师, 离散数学, 1号楼102), (王老师, 数据结构, 1号楼101), (王老师, 数据结构, 1号楼102) }
一般来说,几个集合的笛卡儿积是没有实际语义的,只有它的某个真子集才有实际含义。例如上面的例子,王老师可能不开离散数学这门课程,因此需要把同时含有王老师和离散数学的元组删掉才有实际意义。
和码相关的概念如下,在最简单的情况下,候选码只包含一个属性。
术语 | 说明 |
---|---|
候选码 | 值能唯一地标识一个元组,而其子集不能标识的属性组 |
主码 | 若一个关系有多个候选码,则选定其中一个为主码 |
主属性 | 候选码包括的属性 |
非主属性 | 不包含在任何候选码中的属性 |
全码 | 关系模式的所有属性是这个关系模式的候选码 |
关系可以是一个无限集合,但是无限关系在数据库系统中是无意义的。所以当关系作为关系数据模型的数据结构时,需要限定关系数据模型中的关系必须是有限集合。由于笛卡尔积不满足交换律,所以需要通过为关系的每个列附加一个属性名的方法取消关系属性的有序性。关系可以有三种类型:
关系类型 | 说明 |
---|---|
基本表 | 实际存在的表,实际存储数据的逻辑表示 |
查询表 | 查询结果对应的表 |
视图表 | 由基本表或其他视图表导出的表,不对应实际存储的数据 |
基本关系具有以下几条性质:
关系是元组的集合,因此关系模式必须指出这个元组集合的结构,即它由哪些属性构成,这些属性来自哪些域,以及属性与域之间的映像关系。现实世界的许多已有事实和规则限定了关系模式所有可能的关系必须满足一定的完整性约束条件,通过对属性取值范围的限定。关系的描述称为关系模式,它可以形式化地表示为:
R(U, D, DOM, F)
参数 | 说明 |
---|---|
R | 关系名 |
U | 组成该关系的属性名集合 |
D | U 中属性所来自的域 |
DOM | 属性向域的映像集合 |
F | 属性间数据的依赖关系集合 |
在关系模型中,实体以及实体间的联系都是用关系来表示的。在一个给定的应用领域中,所有关系的集合构成一个关系数据库。关系数据库的型也称为关系数据库模式,关系数据库的值是这些关系模式在某一时刻对应的关系的集合。
关系操作的对象和结果都是集合,关系模型中常用的关系操作包括查询操作和插入、删除、修改操作两大部分。查询是关系操作中最主要的部分,选择、投影、并、差、笛卡儿积是查找的 5 种基本操作,其他操作可以用基本操作来定义和导出。
早期的关系操作能力通常用代数方式或逻辑方式来表示,分别称为关系代数和关系演算。关系代数用对关系的运算来表达查询要求,关系演算则用谓词来表达查询要求。关系演算又可按谓词变元的基本对象是元组变量还是域变量分为元组关系演算和域关系演算。另外,还有一种介于关系代数和关系演算之间的结构化查询语言 SQL,SQL 是集查询、数据定义语言、数据操纵语言和数据控制语言于一体的关系数据语言。
关系模型的完整性规则是对关系的某种约束条件,这些约束条件实际上是现实世界的要求。关系模型中有三类完整性约束:实体完整性、参照完整性和用户定义的完整性。其中实体完整性和参照完整性是关系模型必须满足的完整性约束条件,被称作是关系的两个不变性。
实体完整性是若属性或属性组 A 是基本关系 R 的主属性,则 A 不能为空,实体完整性保证了关系数据库中每个元组应该是可区分的。例如书本关系中书号是主码,则书号不能取空值,否则无法区别同名但是内容或出版社不同等情况。如果是主码是属性组,则属性组中的每个属性都不能取空值,借书记录中学号和书号缺一不可。
书本(书号, 书名, 类别号, 价格, 出版社) 借书记录(书号, 学号, 借书时间)
设 F 是基本关系 R 的一个或一组属性,但不是关系 R 的码,Ks 是基本关系 S 的主码。如果 F 与 Ks 相对应,则称 F 是 R 的外码。参照完整性是若属性或属性组 F 是基本关系 R 的外码,它与基本关系 S 的主码 Ks 相对应,则对于 R 中每个元组在 F 上的值必须取空值或者等于 S 中某个元组的主码值。
参照完整性描述了现实世界中实体之间的联系,还是以借书为例,图书馆会用不同的字母表示书的类别,因此书本中的类别号必须是书本类别集合中的。如果是刚入库的图书允许类别号为空,后续入库再补上。借书记录中的书号和学号,都应当取自于书本集合和学生集合,且在实体完整性约束下这两个属性为主码不能为空,否则就会出现不存在的学生借了不存在的书的情况。
书本(书号, 书名, 类别号, 价格, 出版社) 学生(学号, 姓名, 专业号) 书本类别(类别号, 类别名) 借书记录(书号, 学号, 借书时间)
用户定义的完整性是针对某一具体关系数据库的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求。例如某个属性必须取唯一值、某个非主属性不能取空值等。还是以借书为例,可以要求书名和出版社不能为空,由于价格不能去负数,也可以用用户定义完整性限制价格必须为正数。
关系代数是一种抽象的查询语言,它用对关系的运算来表达查询,关系代数的运算符包括集合运算符和专门的关系运算符。
传统的集合运算是二目运算,包括并、差、交、笛卡儿积,设关系 R 和关系 S 具有相同的目 n,且相应的属性取自同一个域,t 是元组变量,t∈R表示 t 是 R 的一个元组。
运算 | 描述 |
---|---|
并 | 由 R 与 S 中所有的元组组成,去掉重复元组 |
交 | 由 R 与 S 中都有的元组组成 |
差 | 由 R 中有而 S 中没有的元组组成 |
广义笛卡尔积 | 由 R 中的每一个元组与 S 中的每一个元组所有可能的方式组合起来,合并为 R×S 的元组 |
假设有具有 3 个属性的关系 R 和 S:
R 与 S 的并、交、差操作的结果为:
R 与 S 的广义笛卡尔积为:
专门的关系运算包括选择、投影、连接、除运算等。
运算 | 描述 |
---|---|
选择 | 从关系 R 中选择满足指定条件的元组构成的新关系 |
投影 | 从关系 R 中选择某些属性的所有值组成的新关系 |
连接 | 从两个关系的广义笛卡尔积中选取属性间满足一定条件的元组形成一个新关系 |
除 | 按与除关系不同的部分 X 分组,求包括除关系中全部相同的部分 Y 值的组,这些组中的 X 值将作为除结果的元组 |
对表 (a) 所示的学生表中选择性别为男的学生,选择操作后的结果如 (b) 所示。
对表 (a) 所示的学生表中查询所有学生的学号和姓名,投影操作后的结果如 (b) 所示。查询所有学生的性别,投影操作后的结果如 (c) 所示,其中投影取消了重复的元组。
等值连接为从 R 和 S 的广义笛卡尔积 R×S 中选取属性 A 与 B 等值的那些元组形成的关系。自然连接是一种特殊的等值连接,它要求关系 R 和 S 中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉。
例如有如图所示关系 R 和关系 S,以及他们的等值连接、自然连接的结果。
两个关系 R 和 S 在做自然连接时,关系 R(S) 中某些元组有可能在 S(R) 中不存在公共属性上值相等的元组,从而造成这些元组在操作时被舍弃了,这些被舍弃的元组称为悬浮元组。如果把悬浮元组也保存在结果关系中,而在其他属性上填空值(NULL),那么这种连接就叫做外连接,如果只保留左边关系 R 中的悬浮元组就叫做左外连接,只保留右边关系 S 中的悬浮元组就叫做右外连接。
例如有如图所示关系 R 和关系 S,以及他们的外连接、左外连接和右外连接的结果。
给定关系 R(X,Y) 和 S(Y,Z),其中 X、Y、Z 为属性组。在进行运算时,将被除关系R的属性分成两部分:与除关系相同的部分 Y 和不同的部分 X。在被除关系 R 中,按 X 的值相同的元组分为一组。除法的运算是求包括除关系中全部 Y 值的组,这些组中的 X 值将作为除结果的元组。
例如如图所示 R 表示学生成绩,S 表示要挑选离散数学和数据结构为优秀的学生。进行 R÷S 运算时,R 与除关系相同的部分 Y 为 (Cname, Grade),不同的部分 X为 (Sname)。包括除关系中全部 Y 值的组为 X 中的李华和丹霞,按 X 的值相同的元组分为一组得到结果。
《数据库系统概论(第5版)》,王珊 萨师煊 编著,高等教育出版社