摘要:如果您忽略技术细节并专注于连接的意图,自然连接是等连接的子集。如果您包含这些技术细节,事情会变得更加复杂。然后,自然连接可以是等连接的子集,具体取决于使用的定义。
在我看来,这实际上取决于所采用的子集。
编辑:本段在下面的维基百科关系代数部分中得到了大量扩展,但保留在此处以保留原始答案的上下文。
如果我们谈论的是操作在技术上的作用,那么 equi-join 显然是 theta-join 的一个子集,因为它只能在相等时加入,而 theta 可以在大于比较、小于比较等情况下加入。此外, equi-join 和 theta-join 都对任意属性进行操作。但是,自然连接在这方面与其他两个连接不同。严格来说,equi-join 和 theta-join 只能对不共享公共属性名称的关系进行操作。自然连接将连接两个公共属性名称相等的关系并“删除”重复属性。我相信这是当您说自然连接不同时所采用的定义,在这种情况下您是正确的。
如果我们谈论的是操作在语义上(或实际上)做了什么,那么我会说它们是彼此的子集。Theta-join 基于任意属性之间的各种布尔条件进行连接。Equi-join 仅限于相等比较。自然连接进一步受到限制,因为属性不是任意的,它们必须共享名称。
编辑:更技术性的答案:
免责声明:我假设集合论的第一年水平知识。
定义
对于技术答案,我们需要技术定义。那么我们遵守哪些技术定义呢?如果你用谷歌搜索关系代数,在第一页你可能会从各种大学数据库课程中获得维基百科链接、Youtube 视频和讲义(值得注意的是,没有指向 Codd 论文的链接)。他们都同意选择、投影、连接等的“基础”。但是,在一些细节上他们不同,例如:
- 我们是否允许在共享属性名称的两个关系之间发生 theta-joins,如果允许,我们如何处理它?
- 在选择和 theta 连接中,允许哪些谓词和命题?
- 当没有属性共享名称时(在这种情况下它退化为笛卡尔积),是否可以执行自然连接?
我将看一下关系代数的两个定义:维基百科和 Codd 的。
维基百科的关系代数
我从维基百科的关系代数文章开始,因为它与现在大学在介绍性数据库课程中所教授的内容非常接近。然而,这篇文章未能有效地引用其来源,尤其是在技术方面。它也是相当数学的。因此,我真的不向第一次看关系代数的人推荐这篇文章。
自然连接
维基百科将自然连接定义为:
[...] R和S中的所有元组组合的集合,它们的公共属性名称相同。
还,
通常要求R和S必须至少有一个公共属性,但是如果省略这个约束,并且R和S没有公共属性,那么自然连接就变成了笛卡尔积。
正如我们将看到的,因为 Codd 需要一个公共属性名称,所以我们将使用允许退化自然连接的定义。请注意,公共属性仅在结果关系中出现一次。所以如果关系R有m个属性,关系S有n 个属性,并且它们有x 个共同的属性(x ≥ 0, x ≤ m , x ≤ n),那么结果关系R NATURAL JOIN S有m + n - x属性.
Theta-joins 和 equi-joins
Wikipedia 将关系R和S之间的 θ 连接定义为满足 θ 关系a θ b或a θ v的连接,其中a和b是属性名称,v 是常数值,θ 是 {<, ≤, =,≥,>}。
还,
此操作的结果由R和S中满足关系 θ 的所有元组组合组成。仅当S和R的标头不相交,即不包含公共属性时,才定义 θ-join 的结果。
等值连接只是一个 θ 连接,其操作是“=”。
联接之间的关系
简单来说,equi-join 是 theta-join 的一个子集。
如果R和S具有共同的属性,则 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 的连接。如果R和S是二元关系,使得 π 2 ( R ) = π 1 ( S ),则R与S是可连接的。
这是相当理论上的,但它本质上的意思是,如果关系R和S可以从连接关系中完全恢复,则连接只能在R和S之间发生。这意味着要连接的列的值集在R和S中必须相同。
这比 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(尽管如果我错了请纠正我)。但是,我们可以在关系R和S上定义一系列操作,其结果与 Wikipedia 文章中定义的 equi-join几乎相同4 。
我们将利用我们只需要考虑二元关系的事实。所以让R有列(a,b),S有列(b,c)。它们不一定是可连接的,因为 π b ( R ) 不一定等于 π b ( S )。然后通过关于属性b用S限制R来形成关系R',并且通过关于属性b再次通过R限制S来形成关系R '. 现在,π b ( R' ) = π b ( S' ),所以我们可以采用R'和S'的自然连接。
联接之间的关系
它不属于给定的等连接定义,但如果 π b ( R ) = π b ( S ),则等连接等价于自然连接。因此,自然连接是 equi-join 的一个子集。
进一步阅读:我发现这个答案提供了有关 theta-joins 和关系代数的更多有用信息。
脚注
我不确定称这个 Codd 的原始关系代数是否公平,因为我在两年后的CS.SE 答案中发现,他会定义一个与维基百科非常相似的关系代数(尽管谢天谢地允许 ≠ 在 θ -加入)。然而,这个答案的重点是强调关系代数有不同的定义,必须先建立定义,然后才能进行任何形式的证明。
我忽略了首先定义域位置的步骤,以及关系和关系之间的区别。
Codd 定义了一个额外的生成标识符,我们将再次忽略它。
在 Codd 的理论中,要连接的列必须具有相同的域。根据 Wikipedia 中提出的理论,这不是要求,但实际上,无论如何您都不应该进行此类连接。