在关系模型中如何使用关系代数

153 阅读4分钟

当使用关系模型工作时,我们有2组操作可以使用。其中之一是关系代数。

当使用关系模型工作时,我们有2组可以使用的操作。

第一组被称为关系代数,它是一种程序性语言

这是SQL的基础,因此学习它非常重要--因为SQL是处理关系型数据库的事实上的标准。

第二种被称为关系微积分,它不是程序性语言,而是一种声明性语言。这是我们与数据库互动的根本区别,因为你不告诉数据库软件做什么,你只是告诉它你想要什么,然后让它找出如何做的细节。

这是编程语言中常见的一种区别。在现代前端,我们说React中与DOM的交互是声明性的。使用vanilla JavaScript来修改DOM是程序性的。

DatalogQBEQUEL这样的语言以关系微积分为基础。我不打算谈论这个,因为我认为与SQL所遵循的更实用的方法相比,它是一种更小众的方式,但如果你想的话,你可以看看它。

鉴于上述介绍,让我们继续讨论关系代数

我们有2种类型的操作。

  • 主操作
  • 连接操作

关系代数中的主操作

主要操作是。

  • union从两个表中获取数据,产生一个图元的总和,只要这两个表有相同的列和属性类型(域)。
  • 差分获得第一个表中的数据,但不包括第二个表中的数据,产生一个图元的差分,只要这两个表有相同的列和属性类型(域)。
  • Cartesian product从两个表中获取数据,并生成一个单一的表,根据一个属性值将它们的数据结合起来。
  • 选择(select):根据某些标准,只提取一个表中包含的一些图元(行)。
  • project生成一个新的表,只包含现有表的一个或多个属性(列)。
  • rename用来重命名一个属性,当多个表对不同的数据有相同的名称时,用来防止冲突。

关系代数中的连接操作

连接可能是你能用关系代数进行的最强大的操作。它们建立在主操作之上,允许你将不同关系(表)中的数据关联起来。

注意:我很快就会谈论DBMS中的连接操作,这主要是理论。

我们有2个主要的连接版本:自然连接Theta连接。所有其他的版本都是从这两个版本中提取出来的。

自然连接

自然连接将两个关系(表)联系起来,并基于相同的属性值创建一个新的表。

我们需要两个具有相同属性名称(列)的关系,首先。然后,如果关系A中的属性值在关系B中的属性中不匹配,那么该行就不是结果的一部分,它被忽略。

例子。

关系A

雇员ID名称
1符号
2托尼
3里克

关系B

经理姓名雇员编号
托德1
阿尔伯特2

我们可以执行一个自然连接,以获得每个雇员的老板姓名。

雇员ID名称经理姓名
1马克托德
2托尼艾伯特

由于这些关系有共同的Employee ID属性名称,它在结果中只出现一次,而不是2次。

存在于关系A中的雇员3号,Rick,不包括在这个表中,因为关系B中没有相应的条目。

Theta-join

Theta-join允许基于任何标准执行一个连接,以比较两个不同关系中的两列,而不仅仅是像自然连接那样的平等。

它执行两个表的笛卡尔乘积,并根据我们想做的选择过滤结果。

等价连接

等价连接是一个Theta连接,其中的选择是基于两个不同表中的属性值之间的相等。

与自然连接不同的是,我们可以选择我们想要比较的属性名称(列)。

稍后在介绍SQL时,我们将更多地谈论连接,因此我们可以在实践中使用它们。