2. 关系代数

182 阅读11分钟

关系代数

关系代数是关系数据库中的一种代数系统,用于描述和操作关系数据库中的关系。在关系代数中,关系是一个二维表格,由行和列组成,每行表示一个元组,每列表示一个属性。关系代数中的基本操作包括选择、投影、连接、并、差等。

元组:就是表中 的意思。

  • 域是相同类型的值的集合
  • 域可以是有限集,可以是无穷集
  • 如果域D为有限集时,则称 D 中元素的个数为D的基数,记作|D|

笛卡尔积(直积)

笛卡尔积的概念

卡尔积是指从每个集合中选择一个元素组成的元组的集合。

定义:设 A,B 为集合,A 与 B 的笛卡尔积记作 AxB,即 AxB={<x,y> | x∈A∩y∈B}

|AxB| = m * n (基数数量)
 m n
 

给定 nn 个域 D1,D2,DnD_1,D_2,D_n 上的笛卡尔记作:D1×D2×...×DnD_1 × D_2 × ... × D_n,且

D1×D2×...×DnD_1 × D_2 × ... × D_n = {(d1,d2,...,dn)d1D1D2Dn...dnDnd_1,d_2,...,d_n)|d_1∈D_1∩D_2∈D_n∩...∩ d_n∈D_n}

每个元素 (d1,d2,...,dn)d_1,d_2,...,d_n) 都称为一个 nn-元组(简称元组)。

for example:

假设我们有2个域 A={1,2},B={a,b}A={\{1, 2\}, B=\{a, b\}} ,要计算这2个域的笛卡尔积,即 A×BA × B
因此,我们可以计算 A×BA × B 如下:

A×B={(1,a),(1,b),(2,a),(2,b)}A × B = \{(1, a), (1, b), (2, a), (2, b)\},基数就是 2×2=4{2 \times 2} = 4

关系

在关系代数中,一个 n 元关系指的是具有 n 个属性的关系。例如,一个包含学生信息的关系可以包括学生的学号、姓名、年龄等属性,如果这个关系有三个属性,即学号、姓名和年龄,那么这个关系就是一个三元关系。 总的来说,关系代数中的关系是一个二维表格,n 元关系指的是具有 n 个属性的关系。关系代数通过对关系进行各种操作,实现对数据库中的数据进行查询、插入、更新和删除等操作。

关系的性质
  • 关系是笛卡尔积的子集,即元组(行)的集合,所以,关系(表)中的行的次序不重要,关系(表)中不能包含两个相同的元组(行)
  • 列的顺序不重要
  • 只考虑有序关系;关系每个属性必须是原子的。
关系的码
  • 超码:超码是能唯一标识关系中元组的属性或属性组合,但不一定是最小的。换句话说,超码包含了候选码以及其他属性,可能包含冗余信息。超码是候选码的超集,可以用来唯一标识元组,但不是最小的唯一标识。
  • 码:是一种极小(特殊)的超码。
  • 主码:关系中用来唯一标识每个元组的属性或属性组合,通常作为表的主键使用。
    • 码中的属性称为主属性,而不再任何码中出现的属性称为非主属性。
  • 候选码(Candidate Key):候选码是可以作为主码的备选属性或属性组合。可以有多个候选码,但最终只能选择一个作为主码。

关系模式

关系模式的规范化,实质上就是概念的单一化

关系模式概念对应与程序设计语言中的类型概念,是对关系型的描述,可以表示为

R(U,DOM,D,F)R(U,DOM,D,F),简写为 R(U)R(U)

  • RR 关系模式名(理解为表名)
  • FF (函数依赖):函数依赖描述了关系中属性之间的依依赖通常表示为X→ Y,表示属性集合X的取值决定了属性集合 Y 的取值。依赖关系,即一个属性的值决定另一个属性的值。
  • DOMDOM (属性域) 为UUDD的映射,属性域是关系中属性的取值范围,即属性可以取的所有可能值的集合。属性域可以是数字、字符串、日期等不同类型的数据。
  • UU为关系模式的诸属性集合,即关系中包含的属性。(字段集合)
  • DD为属性名,每个属性都有一个唯一的名称。属性名描述了关系中存储的数据的特征或属性

for example:

考虑一个关系模式 R(学生ID, 姓名, 年龄, 课程, 成绩),其中:

  • U = {学生ID, 姓名, 年龄, 课程, 成绩} 表示关系模式包含了这些属性

  • DOM = {整数, 字符串} 表示属性的取值范围分别为整数和字符串

  • F 可以包含各种函数依赖,例如:
    学生ID → 姓名 表示学生ID 唯一确定了学生的姓名学生ID,课程 → 成绩 表示学生ID 和课程 唯一确定了学生在某门课程的成绩

ER图向关系模型的转换(考试)

  1. 识别实体和属性
  • 首先,识别 ER 图中的实体(Entity)和属性(Attribute)。
  • 每个实体对应一个关系表,每个属性对应表中的一个字段。
  1. 确定主键
  • 为每个实体确定主键(Primary Key),通常是实体的唯一标识符。
  • 主键可以是单个属性,也可以是多个属性的组合。
  1. 处理关系
  • 处理 ER 图中的关系(Relationship),将其转换为外键(Foreign Key)。
  • 如果两个实体之间存在一对一或一对多关系,可以在一个实体的表中添加另一个实体的主键作为外键,以建立关联。
    • 对于两个实体间的1:n联系,转换关系模型的原则是:将1方的主码放到n方实体对应的关系模式中作为外码,联系属性一并加入到实体对应的关系模型中(冗余字段设计,减少查询,提高查询效率,存在一致性问题)。

......

做题解析:主要是给出 实体联系

image.png

完整性约束规则

实体完整性

关系R的所有元组在主码上的值必须唯一,并且主码不能取空值。

参照完整性规则

典型的案例就是FK外码。

用户自定义的完整性规则。

设计人员自行定义数据存储规则。

关系代数的5种基本运算

选择运算

从关系中选择满足指定条件的元组,通常表示为 σ<条件>(关系)\sigma<条件>(关系) ,其中条件是一个逻辑表达式。

RR 是一个关系,FF 是一个公式,涉及

  1. 运算对象,常量或属性名
  2. 算术比较运算符,<、≤、=、≥、>、≠
  3. 逻辑运算符 ¬\wedge、\vee、\neg

选择σF(R)\sigma_F(R)RR 中使得公式 FF 为真的元组 tt 的集合。 元组 tt 使得公式 FF 为真意指当我们将 FF 中所有的属性名用 tt 的对应属性值替换时,公式 FF 为真。用 F(t)F(t) 表示元组 tt 使得公式 FF 为真,则

σF(R)=ttRF(t)\sigma_F(R)={t|t∈R \wedge F(t)}

公式 FF 理解成条件即可。

选择运算是一个 行运算,生成一个新关系。

For example:

B67A6071-3E15-43A9-B061-06ECEE7F04C1.png

上图中, 对于B属性列表,只要其值 B=bB='b' 就满足条件 F(t)F(t) .

投影运算

用于从R中选择出若干属性列组成新的关系(默认去重),列运算,行删除。通常表示为:

πL(R)π_L(R)

  • LLRR中的属性列表
  • 结果为只包含RR中某些列的新的关系
  • 结果要去掉重复元组

image.png

并运算

并(Union):并运算用来将两个关系中的元组合并成一个新的关系,去除重复元组。并运算要求两个关系的属性集合必须相同。

AB={xxAxB}A \cup B=\{{x|x \in A \vee x \in B}\}

差运算

差(Difference):差运算用来从一个关系中删除另一个关系中的元组,生成一个新的关系。差运算通常表示为 R - S,表示从关系 R 中去除关系 S 中的元组。

RS={xxRxS}R - S=\{{x|x \in R \wedge x ∉ S}\}

笛卡尔积

两个集合,表示为X × Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员。

image.png

交运算

RS={ttRtS}R∩S = \{t|t∈R \wedge t∈S\}

image.png

除运算

关系代数中的除运算是一种相对较复杂的操作,用于解决除法相关的查询问题。在关系代数中,关系除运算表示为 R ÷ S,它的含义是在关系 R 中找出所有不在关系 S 中的元组。除运算的结果是一个新的关系,包含了满足条件的元组。

R÷S=P(X)R ÷ S = P(X),

R(X,Y)÷S(Y,Z)=P(X)R(X,Y) ÷ S(Y,Z) = P(X)

除运算的具体步骤如下:

  1. 确定两个关系 R 和 S,它们的属性集合必须相同。
  2. 对于关系 R 中的每个元组,检查是否存在一个元组在关系 S 中与之匹配。如果不存在匹配的元组,则将该元组添加到结果关系中。
  3. 最终得到的结果关系包含了满足条件的元组,即在关系 R 中存在,但在关系 S 中不存在的元组。 除运算通常用于解决一些复杂的查询问题,例如找出某个关系中满足一定条件但不在另一个关系中的数据。

在实际数据库查询中,除运算的使用相对较少,因为它通常需要对关系进行比较耗时的计算。

For example:

假设有两个关系 R 和 S,它们的属性集合相同,分别如下: 关系 R 包含元组 (1, 'Alice'), (2, 'Bob'), (3, 'Charlie'), (4, 'David') 关系 S 包含元组 (1, 'Alice'), (3, 'Charlie') 现在我们进行 R ÷ S 的除运算,即找出在关系 R 中存在但在关系 S 中不存在的元组。 首先,我们对关系 R 中的每个元组进行检查:

  • 元组 (1, 'Alice') 在关系 S 中存在,所以不满足条件,排除
  • 元组 (2, 'Bob') 在关系 S 中不存在,满足条件,保留
  • 元组 (3, 'Charlie') 在关系 S 中存在,所以不满足条件,排除
  • 元组 (4, 'David') 在关系 S 中不存在,满足条件,保留

最终,除运算的结果为新的关系,包含满足条件的元组: 结果关系为 (2, 'Bob'), (4, 'David') 这就是一个简单的除运算的例子,展示了如何从一个关系中找出不在另一个关系中的元组。

连接运算

连接运算是关系代数中的一种基本操作,用于将两个关系中的元组进行组合,生成一个新的关系。连接运算通常基于两个关系中的共同属性进行匹配,可以是等值连接或自然连接。

等值连接

等值连接(Equi-Join)是连接运算中最常见的形式,它基于两个关系中的共同属性进行匹配。两个关系中的共同属性值相等的元组会被组合成一个新的元组。等值连接通常表示为

R<条件>SR ⨝<条件> S

其中条件是两个关系中共同属性的等值条件。

举个简单的例子:
假设有两个关系 R 和 S,分别如下:
关系 R 包含元组 (1, 'Alice'), (2, 'Bob'), (3, 'Charlie')
关系 S 包含元组 (1, 'Math'), (2, 'Science'), (3, 'History')

现在我们进行 R<R.属性=S.属性>SR ⨝<R.属性=S.属性> S 的等值连接操作,即基于两个关系的第一个属性进行匹配。
在这个例子中,我们基于关系 R 和 S 的第一个属性进行匹配,找出共同属性值相等的元组

  • 元组 (1, 'Alice') 和 (1, 'Math') 匹配,生成新元组 (1, 'Alice', 'Math')
  • 元组 (2, 'Bob') 和 (2, 'Science') 匹配,生成新元组 (2, 'Bob', 'Science')
  • 元组 (3, 'Charlie') 和 (3, 'History') 匹配,生成新元组 (3, 'Charlie', 'History')

最终,等值连接的结果为新的关系,包含了匹配的元组:
结果关系为 (1, 'Alice', 'Math'), (2, 'Bob', 'Science'), (3, 'Charlie', 'History')

自然连接运算

基于两个关系中的共同属性进行匹配,并且自动去除重复的属性。自然连接会将两个关系中具有相同属性名的属性进行等值比较,然后生成一个新的关系。

表示为 RS=(R.B=S.B)R ⨝ S = (R._B=S._B)

举个简单的例子:

假设有两个关系 R 和 S,分别如下:
关系 R 包含元组 (1, 'Alice', 25), (2, 'Bob', 30), (3, 'Charlie', 28)
关系 S 包含元组 (1, 'Math', 'A'), (2, 'Science', 'B'), (3, 'History', 'C')
现在我们进行 R ⨝ S 的自然连接操作,基于两个关系中相同属性名的属性进行匹配。

在这个例子中,关系 R 和 S 中都有第一个属性名为 ID,所以这个属性将用于连接:

  • 元组 (1, 'Alice', 25) 和 (1, 'Math', 'A') 匹配,生成新元组 (1, 'Alice', 25, 'Math', 'A')
  • 元组 (2, 'Bob', 30) 和 (2, 'Science', 'B') 匹配,生成新元组 (2, 'Bob', 30, 'Science', 'B')
  • 元组 (3, 'Charlie', 28) 和 (3, 'History', 'C') 匹配,生成新元组 (3, 'Charlie', 28, 'History', 'C')

最终,自然连接的结果为新的关系,包含了匹配的元组:
结果关系为 (1, 'Alice', 25, 'Math', 'A'), (2, 'Bob', 30, 'Science', 'B'), (3, 'Charlie', 28, 'History', 'C')

注意:

  • 当 R 和 S 不具有相同的属性则自然退化为笛卡尔积。

关系代数表达式

  1. 列出系编号为MA(数学系)的所有学生的详细信息
    σdno=MA(Students)\sigma_{dno='MA'} (Students)

  2. 列出所有课程的课程号、课程名和学分
    πcno,cname,credit(Courses)\pi_{cno,cname,credit} (Courses)

  3. 列出年龄不超过45岁的所有副教授的姓名、性别和年龄。
    πtname,sex,age(σage45title=副教)(Teachers)\pi_{tname,sex,age}(\sigma_{age≤45 \wedge title='副教授'}) (Teachers)

    ....