第 1 章 绪论

1.2 数据模型

数据模型是一种模型,它是对现实世界数据特征的抽象,是数据库描述数据、组织数据、操作数据的途径。

两类数据模型

根据模型应用的不同目的,可以将模型划分为两大类:概念模型逻辑模型和物理模型

前者用于对数据建模,用于数据库的设计;后者中,物理模型描述了数据在系统内部的表示方式(硬件层面),逻辑模型按计算机系统的观点对数据进行建模。

数据库管理设计人员需要选择物理模型,而物理模型对于使用者来说实际上是透明的

概念模型

概念模型实际上是现实世界到机器世界的一个中间层次。

信息世界中存在一些概念,这对于数据库概念模型的建立有重要的作用:

  • 实体:客观存在并可相互区别的事物;人就是实体的一种
  • 属性:实体具有的某一特性;一个实体可以由多个属性进行描述
  • 码:某一标识实体的属性集;例如学号、班级都是学生实体的码
  • 实体型:用实体名和属性的集合来抽象、刻画同类实体;例如 学生(年龄、性别、学号、……)
  • 实体集:同一类型实体的集合
  • 联系:实体间的联系通常指不同实体集之间的联系;联系有一对一、一对多和多对多等类型

这里的是针对于联系中实体的数量

实体-联系方法

实体-联系方法使用 E-R 图来对概念模型进行抽象,E-R 图的画法在第 7 章讲解。

数据模型的组成要素

数据模型通常由数据结构、数据操作和数据的完整性约束条件三部分组成。

  • 数据结构:描述数据库的组成对象和对象之间的关系,通常按照数据结构的类型命名数据模型
  • 数据操作:对数据库中各种对象的实例进行的操作的集合,包括操作和规则
  • 数据的完整性约束条件:一组完整性规则,用以限定数据库状态和变化,保证数据的正确、完整性

数据模型的分类

主流的逻辑数据模型有以下几种:层次模型、网状模型、关系模型、面向对象数据模型、对象关系数据模型、半结构化数据模型。其中层次模型和网状模型统称为格式化模型,正在逐渐被关系模型取代

  • 基本层次关系:两个记录和它们之间的联系
  • 双亲节点:关系 $L_{ij}$ 的始点;类似地,$L_{ij}$ 的终点称为子女节点;同理有兄弟节点的关系

层次模型

  • 层次模型用树形结构描述实体以及实体间的关系,由于有向边的方向和节点的层次,使得层次模型只能处理一对多的数据联系
  • 层次结构有且仅有一个节点没有双亲节点,称为根节点
  • 根节点以外的节点有且仅有一个双亲结点
  • 节点:代表一个记录类型,节点内可以有很多记录,每个记录都能延伸出自己的子节点,可以理解为节点有厚度,而每一薄层都能展开树杈
  • 有向边:代表一个联系

每个记录类型可以包括若干个字段,可以定义一个排序字段(码字段),若在层次模型中查找给定的记录值,只能按照层次路径查看,不能脱离双亲的记录值而独自存在

层次模型的数据操纵主要有查询、插入、删除、更新。插入操作必须确定双亲的节点值,否则就无法确定子记录的层次位置;删除操作在删除双亲节点的数据时,其下所有的子节点记录会被一并删除

  • 层次模型的特点:
    • 数据结构简单,全部数据都以树形存放
    • 查询效率高:有向边通常以指针的形式实现,当要对某一记录进行操作时,可以快速查询到路径的位置
    • 节点间若为多对多关系或无层次关系则不适用层次模型
    • 查询子节点必须通过双亲结点

网状模型

当数据记录间的层次性并不明显或无层次关系时可以采用网状模型:

网状模型允许:

  • 一个以上的节点无双亲
  • 一个节点有多于一个的双亲

网状模型具有更普遍性的结构,描述关系更为灵活;节点中的记录可以实现一对多、多对多的联系

image-20230919102623231

  • 支持记录码:数据库不允许标识记录的数据项出现重复
  • 保证一个联系中双亲记录和子女记录间时一对多的关系
  • 支持特定约束条件
  • 网状模型的特点:
    • 描述关系更为广泛,描述方式更直接
    • 性能高,存取效率较高
    • 结构复杂,不利用用户使用
    • DDL、DML 复杂,不易掌握在指定语言的使用方式

关系模型

感觉不如第 2 章再讲

1.3 数据库系统的结构

模式与三级模式结构

  • 模式时数据库中全体数据的逻辑结构和特征的表述,只涉及型(结构、字段等),不涉及值(具体的记录值)
  • 实例:模式的一个具体值,包含具体的记录值;模式是相对稳定的,而实例时实时变动的
  • 数据库一般采用三级模式结构和两级映像结构,三级模式是数据的三个抽象级别,两级映像是层次之间的转换
  • 模式(逻辑模式):数据库全体数据的逻辑结构和特征的表述,时公共数据视图,不涉及到物理的存储细节和设计数据库的语言
  • 外模式(用户模式):用户能够看到的局部数据的逻辑结构,是模式的子集,每个用户看全体数据时都通过自己的外模式,获得到的数据结构可能不同,也只能看到数据的一部分
  • 内模式(存储模式):数据库存储物理信息时采用的结构,体现了存储时数据结构上的组织方式
  • 外模式/模式映像:这个映像面向外模式,实现从总体数据到用户数据之间的转变,每个外模式都有对应的映像,当模式改变时可以通过修改映像来保持外模式的应用不变,保证了数据的逻辑独立性
  • 模式/内模式映像:定义了全局逻辑结构和存储结构之间的对应关系,类似于声明数据结构,当数据结构更改时,同理可以修改映像保证数据的物理独立性

第 2 章 关系数据库

2.1 关系数据结构及形式化定义

关系

  • 关系模型中,数据只包含单一的二维数据结构,即关系。
  • 域:一组具有相同数据类型的值的集合
  • 笛卡尔积:定义在域上的一种集合运算:

$$
D_1×D_2×…×D_n={(d_1,\ d_2, … ,\ d_n)}
$$

通过笛卡尔积计算得出的是域中所有元素以任意形式进行组合后的元素,也称元组,元组的每一个值叫做分量

  • 关系:笛卡尔积的子集叫做对应域上的关系,分量的数目被称为
  • 候选码:某一属性组的值能够唯一地标识一个元组,但是子集不能,则该组属性就称为候选码;换句话说,候选码就是能够独立判别所有元组的属性的集合
  • 主码:对于多个候选码,选取其中一个成为主码,候选码中的所有属性都称作主属性,其余属性被称为非主属性(非码属性)
  • 全码:当主码的属性是全部的属性时,就被称为全码
  • 基本表、查询表、视图表:实际存在的、存储数据的表;查询结果对应的表;根据某些条件筛选得出的表

基本关系的性质

  • 列是同质的:同一列的数据来自同个域
  • 不同的列可以来自相同的域:属性不同可以来自同一个域,比如可以有姓名和家属名两个属性,它们是不同的属性,但是来自同一个域(人名)
  • 列的顺序可以交换:列的次序无关紧要,添加列时通常添加在最后一列
  • 行的顺序可以交换,和列同理
  • 分量必须取原子值:意味着分量不可再分,是一个不可分的数据项
  • 任意两个候选码不能取相同的值
    满足以上六条性质的关系是规范化的关系,也称为范式

2.2 关系操作

  • 关系操作包括查询、插入、删除、修改。查询操作中包含选择、投影、并、差、笛卡尔积这 5 种基本操作。

关系数据语言的分类

早期关系操作能力通常用代数方式和逻辑方式表示,分别成为关系代数和关系演算。

  • 关系代数用对关系的运算来表达要求
  • 关系演算用谓词的逻辑表述要求
  • 同时还有一种具有关系代数和关系演算双重特点的语言(结构化查询语言)

2.3 关系的完整性

  • 关系模型中有三类完整性约束:实体完整性参照完整性和用户定义完整性,前两项需要关系系统实现自动支持,最后一项是应用时需要遵守的约束条件

实体完整性

  • 若属性 $A$ 是基本关系 $R$ 的主属性(主码),则任意的元组都不能允许出现空值的 $A$
  • 如果主属性 $A$ 为空值,那么说明这个记录的唯一性标识不存在,那么无法通过主属性进行实体的区分,显然不应被允许

参照完整性

  • 外码:某个属于基本关系 $R$ 的属性 $F$(不是码),同时是另一个关系 $S$ 的码,那么对于 $R$ 来说,$F$ 就是一个外码;且 $R$ 被称为参照关系,$S$ 被称为被参照关系
    • 显然两个关系的这两个属性必须来自同一个(组)域
    • 要注意 $R$ 和 $S$ 可能是同一个关系(例如学生元组中的学号与班长学号)
  • 在关系和关系间的引用中,若属性 $F$ 是基本关系 $R$ 的外码,它与基本关系 $S$ 的主码 $K_s$ 相对应,则对于 $R$ 的每个元组在 $F$ 上的值必须:
    • 取空值(尚未分配)
    • 取 $S$ 中的某个出现过的主码值

用户定义的完整性

  • 用户定义的完整性就是针对某一具体应用情况的约束条件而存在的一系列语义要求,关系模型应提供定义和检验这类完整性的机制,是实际应用时的一大类约束

2.4 关系代数

关系代数是一种抽象的查询语言,它用对关系的运算表达查询操作

运算对象、运算符、运算结果是运算的三大要素

  • 运算对象:数据库中存放的关系
  • 运算符:集合运算符($\cup\ -\ \cap\ ×$)、关系运算符($\sigma$ 选择、$\Pi$ 投影、连接,$÷$ 除)
    • 其中集合运算符把关系看成传统的集合,进行交并差等操作,关系运算符从列的角度处理关系,进行操作

传统的集合运算

  • 传统的集合运算是二目运算,包括交并差、笛卡尔积四种运算,每种运算的集合表示如下:

$$
R\cup S={t|t\in R\or t\in S}\
R-S={t|t\in R\and t\notin S}\
R\cap S={t|t\in R\and t\in S}\
R× S={t_rt_s|t_r\in R\and t_s\in S}\若RS分别有k_1、k_2个元素,则笛卡尔积有 k_1×k_2个元素
$$

关系运算

  • 分量:元组中相对于关系的某个属性,$t[A_i]$ 代表元组 $t$ 在属性 $A_i$ 上的值(分量)
  • $t[A],\ A={A_{i1},A_{i2},…,A_{in}}$ $A$ 被称为属性组,$t[A]$ 被称为属性组分量的集合,$\overline A$ 表示去掉属性组后剩余的属性
  • $t_rt_s$ 表示元组的串接,它是将 $t_r$、$t_s$ 两个元组进行链接后得到的元组,是一个 $m+n$ 元组(两个单独的元组长度分别为 $m、n$)
  • 象集:当 $t[X]=x$ 时,$x$ 在 $R$ 中的象集为:

$$
Z_x={t[Z]|t\in R, t[X]=x}
$$

表示在 $X$ 上值等于 $x$ 的所有元组,它们的 $Z$ 属性组分量值的集合

  • 选择(限制):关系中满足条件的所有元组

$$
\sigma_F(R)={t|t\in R\cap F(t)=真}
$$

这里的 $F$ 是逻辑表达式,用于进行筛选,通常包含某些属性从而进行约束,比如 $\sigma_{age>20||no>21370000}(Student)$ 可以表达从 $Student$ 这个关系中进行筛选,限制条件是 $age$ 字段大于 20 或 $no$ 字段大于 21370000

  • 投影:从 $R$ 中选择出若干的属性列组成新的关系

$$
\Pi_A(R)={t[A]}
$$

这里的 $A$ 是属性组,这样将会取出某些特定的列,并保持行中原有的信息不改变

要注意投影操作可能会删去某些行,因为去掉列后可能出现重复行,需要进行删除,比如 $\Pi_{ {name, age} }(Student)$ 就选出了 $Student$ 中的姓名和年龄两列组成新的关系,如果出现名字和年龄相同的学生那么需要删除一个记录

  • 连接($\theta$ 连接):从两关系的笛卡尔积中选取满足条件的元组,要求 $R$ 关系在 $A$ 属性组上的值和 $S$ 关系在 $B$ 属性组上的值满足比较关系
    • 等值连接:$\theta$ 为 $=$ 的连接运算,也就是要求 $R$ 的 $A$ 属性和 $S$ 的 $B$ 属性值相同,如果选取了两关系共有的一个属性,就会筛选出所有共用项相同的元组不删去属性)
    • 自然连接:要求连接时筛选的属性必定是同名的,并且会删除重复的属性

image-20230927192934240

  • 悬浮元组:在连接的过程中可能会导致某些元组被浪费,这些无法连接的元组就是悬浮元组。
  • 外连接:如果把无法连接的元组也放在结果中,并给没有的属性标记 $NULL$,就叫做外连接,左右连接分别保留了左右侧关系的元组

除运算

设 $R$ 集合除以 $S$ 集合,则结果关系 $T$ 为:

  • 包含所有在 $R$ 但是不在 $S$ 的属性和值
  • $T$ 的元组和 $S$ 元组的组合都属于 $R$
    • 先求出目标的属性组和象集,再求出另一个集合的在这个属性组上的投影,这样就包含了另一个单位在其上的投影
  • 遍历所有不共用的属性组,若 $S$ 中值对应的元组能在 $R$ 中找到,就说包含了投影

image-20230927194524606

  • $A$ 属性是不共用的
  • 从 $a_1$ 开始遍历,象集为第1、4、7行
  • 发现 1、4、7 三行都在象集中,就说明 $a_1$ 属于除法的结果之一