Skip to content

db2

提出关系模型的是美国 IBM 公司的 E.F.Codd

  • 1970年提出关系数据模型,之后,提出了关系代数和关系演算的概念。
    • 1972年提出了关系的第一、第二、第三范式。
    • 1974年提出了关系的 BC 范式。

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


按照数据模型的三个要素:

  • 关系模型由关系数据结构、关系操作集合和关系完整性约束三部分组成。

下面将对这三部分内容进行分别介绍。


2.1.1 关系


关系模型的数据结构非常简单,只包含单一的数据结构—关系。在用户看来,关系模型中数据的逻辑结构是一张扁平的二维表。



  • 是一组具有相同数据类型的值的集合。
    • 例如;自然数、整数、实数的集合。

笛卡尔积


  • 给定一组域:\(D_1, D_2, D_3, \dots, D_n\),且允许其中某些域是相同的。
    • 则其笛卡尔积为:\(D_1 \times D_2 \times \dots \times D_n = \{ (d_1, d_2, d_3, \dots, d_n) \mid d_i \in D_i, i = 1, 2, \dots , n \}\)
    • 其中每一个元素 \((d_1, d_2, d_3, \dots, d_n)\) 叫做一个 \(n\) 元组,或简称元组,其中 \(d_i\) 为分量。

一个域允许的不同取值个数称为这个域的基数

  • \(D_i (i = 1, 2, \dots, n)\) 为有限集,其基数为 \(m_i(i = 1, 2, \dots, n)\)
  • 则笛卡尔积 \(D_1 \times D_2 \times \dots \times D_n\) 的基数为:
    \[M = \prod_{i=1}^{n} m_i \]

笛卡尔积可以表示为一张二维表,表中的每行对应一个元组,表中的每一列的值来自一个域。

例如:

  • 已知:\(D_1 = X = \{ a, b \}\)\(D_2 = Y = \{ c, d \}\)
  • \(D_1 \times D_2\) 的笛卡尔积为 \(D_1 \times D_2 = \{ (a, c), (a, d), (b, c), (b, d) \}\)
  • 笛卡尔积的基数为 \(2 \times 2 = 4\),共 \(4\) 个元组,可生成表格如下:
\(X\)\(Y\)
\(a\)\(c\)
\(a\)\(d\)
\(b\)\(c\)
\(b\)\(d\)

关系


  • \(D_1 \times D_2 \times \dots \times D_n\) 的子集叫做在域 \(D_1, D_2, D_3, \dots, D_n\) 上的关系。
  • 表示为 \(R(D_1, D_2, D_3, \dots, D_n)\),其中 \(R\) 为关系名,\(n\) 为关系的目或度(Degree)。
  • 关系中的每个元素是关系中的元组,通常用 \(t\) 表示。
  • \(n = 1\) 时,称该关系为单元关系(Unary relation)或一元关系,\(n = 2\) 时称为二元关系(Binary relation)。

关系是笛卡尔积的有限子集,所以关系也是一张二维表,表的每行对应一个元组,表的每列对应一个域。



  • 候选码(Candidate key):若关系中的某一属性组的值能唯一地标识一个元组,而其任何子集都不能,则称该属性组为候选码(如学号,身份证号)。

  • 全码(All key):在最简单的情况下,候选码只包含一个属性。在最极端的情况下,关系模式的所有属性是这个关系模式的候选码。

  • 主码(Primary key):若一个关系有多个候选码,则选定其中一个为主码。候选码的诸属性称为主属性(Prime attribute)。不包含在任何候选码中的属性称为非码属性或非主属性(Non-key attribute)。

主码和候选码本质相同,只是数量不同。


三类关系


  • 基本关系(基本表或基表):实际存在的表,是实际存储数据的逻辑表示。
  • 查询表:查询结果对应的表。
  • 视图表:由基本表或其他视图表导出的表,是虚表,不对应于实际存储的数据。

基本关系的性质


  • 列同质的(Homogeneous):每一列中的分量是同一类型的数据,来自同一个域。
  • 不同的列可出自同一个域
    • 这些列中的每一列称为一个属性。
    • 不同的属性要给予不同的属性名。
  • 列的顺序无所谓(属性名打破有序性)。
  • 任意两个元组不能完全相同(候选码不同)。
  • 行的顺序无所谓,即行的次序可以任意交换。
  • 分量必须取原子值,每一个分量都必须是不可分的数据项。这是规范条件中最基本的。

2.1.2 关系模式


在数据库中要区分型和值,关系数据库中:

  • 关系模式(Relation Schema)是型,关系是值。

关系模式是对关系的描述:

  • 元组集合的结构:
    • 属性构成
    • 属性来自的域
    • 属性与域之间的映象关系
  • 包括完整性约束条件及元组语义。

关系的描述称为关系模式(relation schema)。它可以形式化地表示为 \(R(U, D, DOM, F)\)

  • \(R\) 为关系名
  • \(U\) 为组成该关系的属性名集合
  • \(D\)\(U\) 中属性所来自的域
  • \(DOM\) 为属性向域的映像集合
  • \(F\) 为属性间数据的依赖关系集合。

2.1.3 关系数据库


在关系模型中,实体以及实体间的联系都是用关系来表示的。在一个给定的应用领域中,所有关系的集合构成一个关系数据库。

关系数据库也有型和值之分:

  • 关系数据库的型也称为关系数据库模式,是对关系数据库的描述。
  • 关系数据库模式包括若干域的定义,以及在这些域上定义的若干关系模式。
  • 关系数据库的值是这些关系模式在某一时刻对应的关系的集合,通常就称为关系数据库。

2.1.4 关系模型的存储结构


  • 有的关系数据库管理系统中一个表对应一个操作系统文件,将物理数据组织交给操作系统完成。
  • 有的关系数据库管理系统从操作系统那里申请若干个大的文件,自己划分文件空间,组织表、索引等存储结构,并进行存储管理。

2.2 关系操作


2.2.1 基本的关系操作


查询:

基本操作:选择、投影、并、差、笛卡尔积;
其他操作:连接、除、交,可由上述基本操作导出。

数据更新:插入、删除、修改。

关系操作的特点是集合操作方式:

  • 操作的对象和结果都是集合。
  • 这种操作方式也称为一次一集合(set-at-a-time)的方式。

相应地,非关系数据模型的数据操作方式则为一次一记录(record-at-a-time)的方式。


2.2.2 关系数据语言的分类


特点

  • 关系语言是一种高度非过程化的语言,存取路径的选择由 DBMS 的优化机制来完成,用户不必用循环结构就可以完成数据操作。
  • 能够嵌入高级语言中使用。
  • 关系代数、元组关系演算和域关系演算三种语言在表达能力上完全等价。

2.3 关系的完整性


关系模型中有三类完整性约束:

  • 实体完整性(entity integrity)
  • 参照完整性(referential integrity)
  • 用户定义的完整性(user-defined integrity)

关系模型必须满足实体完整性和参照完整性,被称作是关系的两个不变性,应该由关系系统自动支持。

用户定义的完整性是应用领域需要遵循的约束条件,体现了具体领域中的语义约束。


2.3.1 实体完整性


  • 若属性(指一个或一组属性)\(A\) 是基本关系 \(R\) 的主属性,则 \(A\) 不能取空值(null value)。
    • 所谓空值就是“不知道”或“不存在”或“无意义”的值。

原因

  1. 实体完整性规则是针对基本关系而言的。一个基本表通常对应现实世界的一个实体集。
  2. 现实世界中的实体是可区分的,即它们具有某种唯一性标识。
  3. 关系模型中以主码作为唯一性标识。
  4. 主码中的属性即主属性不能取空值。主属性取空值,就说明存在某个不可标识的实体,即存在不可区分的实体,这与第(2)点相矛盾,因此这个规则称为实体完整性。

2.3.2 参照完整性


外码

  • \(F\) 是基本关系 \(R\) 的一个或一组属性,但不是关系 \(R\) 的码。
  • 如果 \(F\) 与基本关系 \(S\) 的主码 \(K_s\) 相对应,则称 \(F\)\(R\) 的外码。
  • 基本关系 \(R\) 称为参照关系(Referencing Relation)。
  • 基本关系 \(S\) 称为被参照关系(Referenced Relation)或目标关系(Target Relation)。

关系 \(R\)\(S\) 不一定是不同的关系,目标关系 \(S\) 的主码 \(K_s\) 和参照关系的外码 \(F\) 必须定义在同一个(或一组)域上。

外码并不一定要与相应的主码同名;当外码与相应的主码属于不同关系时,往往取相同的名字,以便于识别。

参照完整性规则

  • 若属性(或属性组)\(F\) 是基本关系 \(R\) 的外码,它与基本关系 \(S\) 的主码 \(K\) 相对应(基本关系 \(R\)\(S\) 不一定是不同的关系),则对于 \(R\) 中每个元组在 \(F\) 上的值必须:
    • 取空值(\(F\) 的每个属性值均为空值)
    • 或等于 \(S\) 中某个元组的主码值。

2.3.3 用户定义的完整性


  • 用户定义的完整性是针对某一具体关系数据库的约束条件,反映某一具体应用所涉及的数据必须满足的语义要求。
    • 关系模型应提供定义和检验这类完整性的机制,以便用统一的系统的方法处理它们,而不要由应用程序承担这一功能。

2.4 关系代数


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

运算具备以下要素

  • 运算对象
  • 运算符
  • 运算结果

任何一种运算都是将一定的运算符作用于一定的运算对象上,得到预期的运算结果

关系代数的运算对象是关系,运算结果亦为关系。关系代数用到的运算符包括两类:

  • 集合运算符
  • 专门的关系运算符


2.4.1 传统的集合运算


传统的集合运算是二目运算,包括并、差、交、笛卡儿积4种运算。

设关系 \(R\) 和关系 \(S\) 具有相同的目(即两个关系都有 \(n\) 个属性),且相应的属性取自同一个域,\(t\) 是元组变量,\(t \in R\) 表示 \(t\)\(R\) 的一个元组。可以定义并、差、交、笛卡儿积运算如下:

  • 并(union): 关系 \(R\) 与关系 \(S\) 的并记作:

    \[R \cup S = \{t \mid t \in R \lor t \in S\} \]

    其结果仍为 \(n\) 目关系,由属于 \(R\) 或属于 \(S\) 的元组组成。

  • 差(difference): 关系 \(R\) 与关系 \(S\) 的差记作:

    \[R - S = \{t \mid t \in R \land t \notin S\} \]

    其结果关系仍为 \(n\) 目关系,由属于 \(R\) 而不属于 \(S\) 的所有元组组成。

  • 交(intersection): 关系 \(R\) 与关系 \(S\) 的交记作:

    \[R \cap S = \{t \mid t \in R \land t \in S\} \]

    其结果关系仍为 \(n\) 目关系,由既属于 \(R\) 又属于 \(S\) 的元组组成。 关系的交可以用差来表示,即 \(R \cap S = R - (R - S)\)

  • 笛卡儿积(Cartesian product)

    • 这里笛卡儿积的元素是元组。
    • 两个分别为 \(n\) 目和 \(m\) 目的关系 \(R\)\(S\) 的笛卡儿积是一个 \((n + m)\) 列的元组的集合。元组的前 \(n\) 列是关系 \(R\) 的一个元组,后 \(m\) 列是关系 \(S\) 的一个元组。
    • \(R\)\(k_1\) 个元组,\(S\)\(k_2\) 个元组,则关系 \(R\) 和关系 \(S\) 的笛卡儿积有 \(k_1 \times k_2\) 个元组。记作
      \[R \times S = \{\overset{\frown}{t_r t_s} \mid t_r \in R \land t_s \in S\} \]


2.4.2 专门的关系运算


专门的关系运算包括选择、投影、连接、除运算等。为了叙述上的方便,先引入几个记号:

  • \(R\)\(t \in R\)\(t[A_i]\)

    • 设关系模式为 \(R(A_1, A_2, \dots , A_n)\)
    • 它的一个关系设为 \(R\)
    • \(t \in R\) 表示 \(t\)\(R\) 的一个元组
    • \(t[A_i]\) 表示元组 \(t\) 中相应于属性 \(A_i\) 的一个分量
  • \(A\)\(t[A]\)\(\overline{A}\)

    • \(A = \{ A_{i1}, A_{i2}, \dots, A_{ik} \}\),其中 \(A_{i1}, A_{i2}, \dots, A_{ik}\)\(A_1, A_2, \dots, A_n\) 中的一部分,则 \(A\) 被称为属性列属性组
    • \(t[A] = (t[A_{i1}], t[A_{i2}], \dots, t[A_{ik}])\) 表示元组 \(t\) 在属性列 \(A\) 上诸分量的集合。
    • \(\overline{A}\) 则表示 \(\{ A_1, A_2, \dots, A_n \}\) 中去掉 \(A_{i1}, A_{i2}, \dots, A_{ik}\) 后剩余的属性组。
  • \(\overset{\frown}{t_r t_s}\)

    • \(R\)\(n\) 目关系,\(S\)\(m\) 目关系
    • \(t_r \in R\)\(t_s \in S\)\(\overset{\frown}{t_r t_s}\) 称为元组的连接
    • \(\overset{\frown}{t_r t_s}\) 是一个 \(n + m\) 列的元组,前 \(n\) 个分量为 \(R\) 中的一个 \(n\) 元组,后 \(m\) 个分量为 \(S\) 中的一个 \(m\) 元组
  • 象集 \(Z_x\)

    • 给定一个关系 \(R(X, Z)\)\(X\)\(Z\) 为属性组
    • \(t[X] = x\) 时,\(x\)\(R\) 中的象集(Images Set)为:
      \[Z_x = \{ t[Z] \mid t \in R,\ t[X] = x \} \]
    • 它表示 \(R\) 中属性组 \(X\) 上值为 \(x\) 的诸元组在 \(Z\) 上分量的集合。

选择

  • 选择又称为限制(Restriction)
  • 选择运算符的含义:
    • 在关系 \(R\) 中选择满足给定条件的诸元组
    • \[\sigma_F(R) = \{ t \mid t \in R \land F(t) = \text{`true'} \} \]
    • \(F\):选择条件,是一个逻辑表达式,取值为“真”或“假”
    • 基本形式为:\(X_1\ \theta\ Y_1\)
    • \(\theta\) 表示比较运算符,它可以是 \(\gt, \ge, \lt, \le, =, \neq\)
    • \(X_1, Y_1\) 等是属性名、常量、简单函数;属性名也可以用它的序号来代替。
    • 在基本的选择条件上可以进一步进行逻辑运算,求非(\(\lnot\))、与(\(\land\))、或(\(\lor\))运算。

选择


投影

  • \(R\) 中选择出若干属性列组成新的关系
    • \(\Pi_A(R) = \{ t[A] \mid t \in R \}\)
    • \(A\)\(R\) 中的属性
    • 投影操作主要是从的角度进行运算
    • 投影之后不仅取消了原关系中的某些列,而且还可能取消某些元组(避免重复行)

投影


连接

  • θ 连接也称为 θ 连接。
    • 连接运算的含义:
      • 从两个关系的笛卡尔积中选取属性间满足一定条件的元组。
      • \[R \underset{A \theta B}{\bowtie} S = \{ \overset{\frown}{t_r t_s} \mid t_r \in R \land t_s \in S \land t_r[A] \theta t_s[B] \} \]
      • \(A\)\(B\):分别为 \(R\)\(S\) 上度数相等且可比的属性组。
    • 连接运算从 \(R\)\(S\) 的广义笛卡尔积 \(R \times S\) 中选取 \(R\) 关系在 \(A\) 属性组上的值与 \(S\) 关系在 \(B\) 属性组上的值满足比较关系 \(\theta\) 的元组。

两类常用连接运算:

  • 等值连接(equijoin)
    • \(\theta\)\(=\) 的运算。
    • 从关系 \(R\)\(S\) 的广义笛卡尔积中选取 \(A, B\) 属性值相等的那些元组。
    • \[R \underset{A = B}{\bowtie} S = \{ \overset{\frown}{t_r t_s} \mid t_r \in R \land t_s \in S \land t_r[A] = t_s[B] \} \]
  • 自然连接(natural join)
    • 自然连接是一种特殊的等值连接:
      • 两个关系中进行比较的分量必须是相同的属性组。
      • 在结果中把重复的属性列去掉。
    • 自然连接的含义:
      • \(R\)\(S\) 具有相同的属性组 \(B\)
      • \[R \bowtie S = \{ \overset{\frown}{t_r t_s} [\overline{B}] \mid t_r \in R \land t_s \in S \land t_r[B] = t_s[B] \} \]
      • 其中 \(\overline{B}\) 为去掉重复属性组 \(B\) 后的剩余属性组。

一般的连接操作是从行的角度进行运算。

自然连接还需要取消重复列,所以是同时从行和列的角度进行运算。


除运算

  • 给定关系 \(R(X, Y)\)\(S(Y, Z)\),其中 \(X, Y, Z\) 为属性组。
    • \(R\) 中的 \(Y\)\(S\) 中的 \(Y\) 可以有不同的属性名,但必须出自相同的域集。
    • \(R\)\(S\) 的除运算得到一个新的关系 \(P(X)\)
    • \(P\)\(R\) 中满足下列条件的元组在 \(X\) 属性列上的投影:
      • 元组在 \(X\) 上分量值 \(x\) 的象集 \(Y_x\) 包含 \(S\)\(Y\) 上投影的集合。
      • \[R \div S = \{ t_r[X] \mid t_r \in R \land \Pi_Y(S) \subseteq Y_x \} \]
      • \(Y_x\)\(x\)\(R\) 中的象集,\(x = t_r[X]\)

除操作是同时从行和列角度进行运算。