关系数据库管理系统 - 关系代数

你好,未来的数据库巫师们!我很高兴能成为你们在这神奇的关系代数世界中的向导。作为一个教授计算机科学多年的人(我们就说我还记得软盘真正软的时代吧),我可以向你保证,掌握这个主题就像在数据库领域中获得了超能力。那么,让我们开始吧!

DBMS - Relational Algebra

关系代数

想象你正在整理你庞大的超级英雄动作人偶收藏(或者也许这只是我)。关系代数就像拥有一套特殊能力,允许你以极其有用的方式操纵和查询你的收藏。它是我们如何与关系数据库交互的基础,为在关系(表)上进行的操作提供了一个理论框架。

基本概念

在我们开始使用花哨的符号之前,让我们先建立一些基本规则:

  1. 关系是元组(行)的集合
  2. 属性是列标题
  3. 操作产生新的关系作为其结果

现在,让我们来看看我们拥有的超能力(操作):

操作 符号 描述
选择 σ 基于条件过滤行
投影 选择特定的列
并集 组合两个兼容的关系
集合差 从一个关系中移除出现在另一个关系中的元组
笛卡尔积 Χ 将一个关系的每一行与另一个关系的每一行组合
重命名 ρ 重命名属性或关系

选择操作 (σ)

选择操作就像给你的数据库加上X光视力。它允许你基于特定条件过滤行。

语法:σ<条件>(关系)

假设我们有一个名为 Heroes 的表:

| 名称   | 能力        | 年龄 |
|---------|-------------|------|
| Bruce   | 智力        | 35   |
| Clark   | 飞行        | 30   |
| Diana   | 力量        | 5000 |
| Barry   | 速度        | 28   |

如果我们想找到所有年龄小于100岁的英雄:

σ 年龄 < 100 (Heroes)

这将给我们:

| 名称   | 能力        | 年龄 |
|---------|-------------|------|
| Bruce   | 智力        | 35   |
| Clark   | 飞行        | 30   |
| Barry   | 速度        | 28   |

看?我们已经过滤掉了Diana,我们那位永恒不变的神奇女侠!

投影操作 (∏)

投影操作就像拥有一个缩小射线。它允许你选择特定的列,减少你的关系的宽度。

语法:∏<属性列表>(关系)

使用我们的 Heroes 表,如果我们只需要名称和能力:

∏ 名称, 能力 (Heroes)

结果:

| 名称   | 能力        |
|---------|-------------|
| Bruce   | 智力        |
| Clark   | 飞行        |
| Diana   | 力量        |
| Barry   | 速度        |

我们已经缩小了我们的表,只关注我们所需的信息!

并集操作 (∪)

并集操作就像龙珠Z中的融合——它组合了两个兼容的关系。

语法:关系1 ∪ 关系2

假设我们有一个名为 Sidekicks 的另一个表:

| 名称   | 能力   | 年龄 |
|---------|--------|------|
| Robin   | 杂技   | 22   |
| Jimmy   | 无     | 25   |

我们可以组合 HeroesSidekicks

Heroes ∪ Sidekicks

结果:

| 名称   | 能力        | 年龄 |
|---------|-------------|------|
| Bruce   | 智力        | 35   |
| Clark   | 飞行        | 30   |
| Diana   | 力量        | 5000 |
| Barry   | 速度        | 28   |
| Robin   | 杂技        | 22   |
| Jimmy   | 无          | 25   |

现在我们有一个超级团队!

集合差 (−)

集合差就像拥有一个消解射线。它从一个关系中移除出现在另一个关系中的元组。

语法:关系1 − 关系2

如果我们想找到不是侧写手的英雄:

Heroes − Sidekicks

这将给我们原始的 Heroes 表,因为它们中没有一个是 Sidekicks 表中的。

笛卡尔积 (Χ)

笛卡尔积就像创建一个每个英雄都会遇到每个侧写手的平行宇宙。

语法:关系1 Χ 关系2

Heroes Χ Sidekicks

这将产生一个包含每个可能的英雄和侧写手组合的表。这是一个很大的表,所以我就不展示全部内容了,这里是一个片段:

| H名称  | H能力       | H年龄 | S名称 | S能力  | S年龄 |
|---------|-------------|-------|-------|--------|------|
| Bruce   | 智力        | 35    | Robin | 杂技   | 22   |
| Bruce   | 智力        | 35    | Jimmy | 无     | 25   |
| Clark   | 飞行        | 30    | Robin | 杂技   | 22   |
| Clark   | 飞行        | 30    | Jimmy | 无     | 25   |
...

重命名操作 (ρ)

重命名操作就像拥有改变现实的能力。它允许你更改属性或关系的名称。

语法:ρ 新名称 (旧名称)

如果我们想将 Power 属性重命名为 Superpower

ρ Superpower←Power (Heroes)

结果:

| 名称   | 超能力      | 年龄 |
|---------|-------------|------|
| Bruce   | 智力        | 35   |
| Clark   | 飞行        | 30   |
| Diana   | 力量        | 5000 |
| Barry   | 速度        | 28   |

关系演算

现在,作为我们的最后一个表演,让我们简要地触及关系演算。如果关系代数是关于“如何”获取数据,那么关系演算就是关于“什么”数据要获取。它是一种声明性的指定数据库查询的方式。

有两种类型:

  1. 元组关系演算 (TRC)
  2. 域关系演算 (DRC)

例如,在TRC中,要找到所有能力为“飞行”的英雄:

{H | H ∈ Heroes ∧ H.能力 = "飞行"}

这表示“给我所有从Heroes中选择的元组H,其中H的能力是飞行。”

就这样,年轻的帕德瓦人!你们的数据库技能已经升级。记住,能力越大,责任越大——明智地使用这些关系代数操作,你很快就会像一个专业人士那样查询数据库。现在去精确地组织你的数据,成为一个真正的超级英雄吧!

Credits: Image by storyset