2

我有一个关于关系代数的问题,以及如何将 theta-join、equi-join 和 natural-join 相互分类。

在对 stackoverflow.com 的评论中,sqlvogel引用了EF Codd的话,他是发明数据库管理关系模型的计算机科学家,“[the] Natural[-join] 是 Equi[-join] 的一个子集,它是 Theta[-加入]。” *stackoverflow.com于 2 月 12 日晚上 9:01 检索)。

我了解如何将 equi-join 视为 theta-join 的子集。它们都连接并且都使用固定数量的属性,但是等连接仅限于使用相等运算符 (=)。另一方面,自然连接是连接两个关系的所有元组组合(不是固定数量的属性)的集合,并且仅限于使用相等运算符 (=)。equi-join 和 theta-join 在它们可以使用的运算符上有所不同,但我认为自然连接在不同的维度上是不同的,因为它的定义中不需要任何属性。

任何人都可以对这个问题有所了解吗?

*我找不到这句话的原始来源。

4

2 回答 2

3

摘要:如果您忽略技术细节并专注于连接的意图,自然连接是等连接的子集。如果您包含这些技术细节,事情会变得更加复杂。然后,自然连接可以是等连接的子集,具体取决于使用的定义。


在我看来,这实际上取决于所采用的子集。

编辑:本段在下面的维基百科关系代数部分中得到了大量扩展,但保留在此处以保留原始答案的上下文。

如果我们谈论的是操作在技术上的作用,那么 equi-join 显然是 theta-join 的一个子集,因为它只能在相等时加入,而 theta 可以在大于比较、小于比较等情况下加入。此外, equi-join 和 theta-join 都对任意属性进行操作。但是,自然连接在这方面与其他两个连接不同。严格来说,equi-join 和 theta-join 只能对不共享公共属性名称的关系进行操作。自然连接将连接两个公共属性名称相等的关系并“删除”重复属性。我相信这是当您说自然连接不同时所采用的定义,在这种情况下您是正确的。

如果我们谈论的是操作在语义上(或实际上)做了什么,那么我会说它们是彼此的子集。Theta-join 基于任意属性之间的各种布尔条件进行连接。Equi-join 仅限于相等比较。自然连接进一步受到限制,因为属性不是任意的,它们必须共享名称。


编辑:更技术性的答案:

免责声明:我假设集合论的第一年水平知识。

定义

对于技术答案,我们需要技术定义。那么我们遵守哪些技术定义呢?如果你用谷歌搜索关系代数,在第一页你可能会从各种大学数据库课程中获得维基百科链接、Youtube 视频和讲义(值得注意的是,没有指向 Codd 论文的链接)。他们都同意选择、投影、连接等的“基础”。但是,在一些细节上他们不同,例如:

  • 我们是否允许在共享属性名称的两个关系之间发生 theta-joins,如果允许,我们如何处理它?
  • 在选择和 theta 连接中,允许哪些谓词和命题?
  • 当没有属性共享名称时(在这种情况下它退化为笛卡尔积),是否可以执行自然连接?

我将看一下关系代数的两个定义:维基百科和 Codd 的

维基百科的关系代数

我从维基百科的关系代数文章开始,因为它与现在大学在介绍性数据库课程中所教授的内容非常接近。然而,这篇文章未能有效地引用其来源,尤其是在技术方面。它也是相当数学的。因此,我真的不向第一次看关系代数的人推荐这篇文章。

自然连接

维基百科将自然连接定义为:

[...] RS中的所有元组组合的集合,它们的公共属性名称相同。

还,

通常要求RS必须至少有一个公共属性,但是如果省略这个约束,并且RS没有公共属性,那么自然连接就变成了笛卡尔积。

正如我们将看到的,因为 Codd 需要一个公共属性名称,所以我们将使用允许退化自然连接的定义。请注意,公共属性仅在结果关系中出现一次。所以如果关系Rm个属性,关系Sn 个属性,并且它们有x 个共同的属性(x ≥ 0, xm , xn),那么结果关系R NATURAL JOIN Sm + n - x属性.

Theta-joins 和 equi-joins

Wikipedia 将关系RS之间的 θ 连接定义为满足 θ 关系a θ ba θ v的连接,其中ab是属性名称,v 是常数值,θ 是 {<, ≤, =,≥,>}。

还,

此操作的结果由RS中满足关系 θ 的所有元组组合组成。仅当SR的标头不相交,即不包含公共属性时,才定义 θ-join 的结果。

等值连接只是一个 θ 连接,其操作是“=”。

联接之间的关系

简单来说,equi-join 是 theta-join 的一个子集。

如果RS具有共同的属性,则 theta-join 不能直接对关系进行操作。因此,自然连接可以产生 theta-join 不能产生的关系。如果它们没有共同的属性,那么自然连接将退化为笛卡尔积。theta-join 现在是合法的。它将能够加入,但可以根据所使用的特定 θ 关系产生不同的结果。那么在一般情况下,theta-joins 可以产生自然连接不能产生的关系。

所以总而言之,我们有 equi-joins 是 theta-joins 的子集,自然连接不是 theta-joins 的子集,theta-joins 也不是自然连接的子集(这就是我最初说它们时的意思是不同的)。由此可见,自然连接不是 equi-joins 的子集

Codd 的原始关系代数1

现在,让我们去源头看看Codd 的早期论文。诚然,这是我第一次阅读它,所以请随时指出我可能犯的任何错误。然而,在我看来,如果你放弃任何关于关系代数的假设,这篇论文比维基百科的文章更容易阅读。

几点注意事项:

  • 在本文中,Codd 从未真正将他的运算称为“代数”。
  • Codd 关注二元关系(即只有两个属性的关系),但在第 2.1.3 节的末尾表明,更大程度的关系很容易简化为二元关系。
  • 实际上,唯一与 Wikipedia 定义相同的操作是投影。

域和角色

在 1.3 节中,关系被定义为有限数量集合的笛卡尔积的子集。这些集合中的每一个都称为一个,并具有一个域名2。关系可以有具有相同域名的列(即,其中两个列来自同一个集合)。在这种情况下,具有相同域名的列可以通过唯一的角色名称来区分。因此,Wikipedia 的属性名称类似于 Codd 的 domain_name.role_name 3

加入

在 2.1.3 节中,Codd 将连接定义为只有当两个关系共享一个域时才可能。此外,他指出,

如果存在三元关系U使得 π 12 ( U ) = R和 π 23 ( U ) = S ,则二元关系R可与二元关系 S 连接。任何这样的三元关系称为R与 S 的连接。如果RS是二元关系,使得 π 2 ( R ) = π 1 ( S ),则RS是可连接的。

这是相当理论上的,但它本质上的意思是,如果关系RS可以从连接关系中完全恢复,则连接只能在RS之间发生。这意味着要连接的列的值集在RS中必须相同。

这比 SQL 的连接和 Wikipedia 文章中定义的连接(包括自然连接)更具限制性。

自然连接

鉴于上述情况,自然连接的定义很容易失败:

R x S = { ( a , b , c ): R ( a , b ) ⋀ S ( b , c ) }

限制

我们将从连接中快速绕道查看描述限制的第 2.1.5 节。它是一种类似于选择(由维基百科定义)的操作。关系R可以通过以下方式受到关系S的限制:形成一个新关系R',由 R 的元组组成,其中其列值的子集是S列子集的元素。我不确定我是否能很好地解释这一点,所以这里有一些等效的 SQL:

SELECT * FROM R 
WHERE some_attributes IN (
    SELECT some_comparable_attributes FROM S)

Theta-joins 和 equi-joins

该论文没有theta 和 equi-joins 提供明确的定义。此外,似乎不可能简单地定义一个 theta-join(尽管如果我错了请纠正我)。但是,我们可以在关系RS上定义一系列操作,其结果与 Wikipedia 文章中定义的 equi-join几乎相同4 。

我们将利用我们只需要考虑二元关系的事实。所以让R有列(ab),S有列(bc)。它们不一定是可连接的,因为 π b ( R ) 不一定等于 π b ( S )。然后通过关于属性bS限制R来形成关系R',并且通过关于属性b再次通过R限制S来形成关系R '. 现在,π b ( R' ) = π b ( S' ),所以我们可以采用R'S'的自然连接。

联接之间的关系

它不属于给定的等连接定义,但如果 π b ( R ) = π b ( S ),则等连接等价于自然连接。因此,自然连接是 equi-join 的一个子集


进一步阅读:我发现这个答案提供了有关 theta-joins 和关系代数的更多有用信息。


脚注

  1. 我不确定称这个 Codd 的原始关系代数是否公平,因为我在两年后的CS.SE 答案中发现,他会定义一个与维基百科非常相似的关系代数(尽管谢天谢地允许 ≠ 在 θ -加入)。然而,这个答案的重点是强调关系代数有不同的定义,必须先建立定义,然后才能进行任何形式的证明。

  2. 我忽略了首先定义域位置的步骤,以及关系和关系之间的区别。

  3. Codd 定义了一个额外的生成标识符,我们将再次忽略它。

  4. 在 Codd 的理论中,要连接的列必须具有相同的域。根据 Wikipedia 中提出的理论,这不是要求,但实际上,无论如何您都不应该进行此类连接。

于 2013-02-22T04:41:12.057 回答
1

他大概提到了以下几点:

自然连接是等连接,其中相等比较将应用于具有相同名称的属性。

TABLE_A JOIN TABLE_B ON TABLE_A.X = TABLE_B.Y 是等连接,但不是自然连接。

因此,所有自然连接确实是等连接,但并非所有等连接都是自然连接。

因此,表之间所有可能的自然连接的集合是那些相同表之间所有可能的等连接集合的子集(通常是正确的)。

于 2013-02-22T23:51:38.240 回答