Note01- 关系模型与形式化查询语言
形象来说,一个关系就一个 Table,关系模型用来处理 Table,它由三个部分组成:
- 描述 DB 各种数据的基本结构形式(关系)
- 描述 Table 与 Table 之间所可能发生的各种操作(关系运算)
- 描述这些操作所应遵循的约束条件(完整性约束)
关系的数据结构
关系数据库由表构成,每个表有唯一的名字,称之为关系 (Relation)
若干概念
- 元组 (tuple)
- 关系表的行
- 关系是元组的集合以元组在关系中出现的顺序无关紧要
- 属性 (attribute)
- 关系表的列
- 列的顺序也无关紧要
- 域 (domain)
- 每个属性所有可能取值的集合
- 原子域:域中每个元素不可再分
- 复合域:原子域的组合
- 空值:表示值未知或不存在
由此可以得到关系的数学定义:
:::tip 定义
设
:::
性质
- 列是同质的
- 每一列中的分量是同一类型的数据,来自同一个域
- 不同的列可出自同一个域
- 任意两个元组不能完全相同
- 分量必须取原子值
关系模式
我们把一个关系模式定义为:
: :关系名 : 的属性集合 : 中属性的域集合 : 到 的映射,表明每个属性取什么 :完整性约束集合 :属性间的函数依赖关系
关系模式也可以简记为
完整性约束
若干概念
- 超码
- 一个或多个属性的集合,这些属性的组合可以在一个关系中唯一地标识一个元组
- 候选码
- 首先是一个超码,然后它的任意真子集都不是超码。即能标识一个元组的最小集合
- 主码
- 被设计者人为选中的候选码
- 主码应该选那些值从不或极少变化的属性
- 一个关系模式只能有一个主码
- 主属性
- 主码中的属性
- 外码
- 一个关系模式
可能在它的属性中包括另一个关系模式 的主码, 这个属性集合在 上称作参
照的外码
- 一个关系模式
完整性约束分类
- 实体完整性约束
- 如果
是关系模式 的主属性,则 不能取空值
- 如果
- 参照完整性约束
- 要求在参照关系中任意元组在特定属性上的取值必然等于被参照关系中某个元组在特定属性上的取值
- 即:设
是关系模式 关于关系模式 的外码。如果 的关系实例的一个元组在这个属性上取值为 ,则 实例也必定存在在这个属性上取值为 的元组
- 用户定义完整性
关系运算
关系代数
过程化查询语言。包括一个运算集合,这些运算的输入为若干个关系,输出为一个新的关系
基本运算:
-
选择:
为选择谓词,是对属性进行的逻辑选择。如 表示 属性和 属性取值相同,且 属性取值大于 5 的元组集合
-
投影:
- 返回的关系为选中的这
个列,同时,要删去重复元组
-
并:
- 我们必须保证做并运算的关系相容
- 属性个数相同
- 两个关系对应属性的域相同
-
差:
- 关系也必须相容
-
笛卡尔积:
:::caution 注意
在笛卡尔积运算中,关系
:::
-
更名:
- 表示将关系
重新命名为 ,且 的各个属性按从左到右顺序分别命名为
-
交:
-
自然连接:
- 对有重复属性的两个关系做笛卡尔积,要求在所有相同属性上的值一致
-
连接 为两关系属性的限制
-
外连接
- 左外连接:⟕
- 取出左侧关系中所有与右侧关系的任一元组都不匹配的元组,用空值填充所有来自右侧关系的属性
- 再把所产生的元组加到自然连接的结果中
- 右外连接:⟖
- 取出右侧关系中所有与左侧关系的任一元组都不匹配的元组,用空值填充所有来自左侧关系的属性
- 再把所产生的元组加到自然连接的结果中
- 全外连接:⟗
- 左外连接与右外连接的并
- 左外连接:⟕
元组关系演算
非过程化的查询语句
:::tip 定义
- 是所有使得公式
为真的元组 的集合 表示元组变量, 表示元组 在 属性上的取值
:::
如,给定下列关系:
branch (branch_name, branch_city, assets)
customer (c_name, c_street, c_city)
account (account_number, branch_name, balance)
loan (loan_number, branch_name, amount)
depositor (c_name, account_number)
borrower (c_name, loan_number)
- 查询所有贷款额度超过 1200 的贷款号、银行名、贷款额度:
域演算
使用从属性域中取值的域变量,而不是整个元组的值
:::tip 定义
分别是域变量 是由原子公式构成的公式 - 查询结果是所有包含
的元组,并且 使得公式 为真
:::
还是如上面的例子:
- 查询所有贷款额度超过 1200 的贷款号、银行名、贷款额度:
- 查询至少有一支贷款额度超过 1200 的客户姓名:
关系运算的安全性
如果一个关系运算系统不产生无限关系和无穷验证, 则这个运算是安全的
:::caution 元组关系和域关系演算不安全
关系代数系统是安全的,而元组关系演算和域关系演算系统不安全,如:
- 元组关系演算
是无限集合 - 域关系演算
是无限集合
:::