总结:如果您忽略技术细节并专注于连接的意图,自然连接是等连接的子集。如果您包含这些技术细节,事情会变得更加复杂。然后,自然连接可以是等连接的子集,具体取决于使用的定义。
在我看来,这实际上取决于所采用的子集。
编辑:本段在下面的 Wikipedia 关系代数部分中进行了大量扩展,但保留在此处以保留原始答案的上下文。
如果我们谈论的是操作在技术上的作用,那么 equi-join 显然是 theta-join 的一个子集,因为它只能在相等时加入,而 theta 可以在大于比较、小于比较等情况下加入. 另外,equi-join 和 theta-join 都对任意属性进行操作。但是,自然连接在这方面与其他两个连接不同。严格来说,equi-join 和 theta-join 只能对不共享公共属性名称的关系进行操作。自然连接将连接两个公共属性名称相等的关系并“删除”重复属性。当您说自然连接不同时,我相信这就是您要通过的定义,在这种情况下您是正确的。
如果我们谈论的是操作在语义上(或实际上)的作用,那么我会说它们是彼此的子集。 Theta-join 基于任意属性之间的各种布尔条件进行连接。 Equi-join 仅限于相等比较。自然连接进一步受到限制,因为属性不是任意的,它们必须共享名称。
编辑:更技术性的答案:
免责声明:我假设你是第一年的集合论知识。
定义
对于技术性的回答,我们需要技术性的定义。那么我们要遵守哪些技术性的定义呢?如果你用谷歌搜索关系代数,在第一页你可能会从各种大学数据库课程中获得维基百科链接、Youtube 视频和讲义(值得注意的是,没有指向 Codd 论文的链接)。他们都同意选择、投影、连接等的“基础”。但是,他们在某些细节上存在分歧,例如:
- 我们是否允许在共享一个属性名称的两个关系之间发生 theta-joins,如果允许,我们如何处理它?
- 在选择和 theta 连接中,允许使用哪些谓词和命题?
- 当没有属性共享名称时,是否可以执行自然连接(在这种情况下,它会退化为笛卡尔积)?
我将看一下关系代数的两个定义:维基百科和 Codd 的。
维基百科的关系代数
我从Wikipedia's relational algebra article 开始,因为它与当今大学在介绍性数据库课程中所教授的内容非常接近。然而,这篇文章未能有效地引用其来源,尤其是在技术方面。它也是相当数学的。因此,我真的不向第一次研究关系代数的人推荐这篇文章。
自然连接
维基百科将自然连接定义为:
[...] 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 之间的 θ-join 定义为满足 θ-relation 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 也不是自然连接的子集(这就是我最初的意思我说他们是不同的)。因此,自然连接不是等值连接的子集。
Codd 的原始关系代数1
现在,让我们去源码看看an early paper by Codd。诚然,这是我第一次阅读它,所以请随时指出我可能犯的任何错误。但是,在我看来,如果你放弃任何关于关系代数的假设,这篇论文比维基百科的文章更容易阅读。
几点说明:
- 在本文中,Codd 从未真正将他的运算称为“代数”。
- Codd 专注于二元关系(即仅具有两个属性的关系),但在第 2.1.3 节的末尾表明,更大程度的关系很容易简化为二元关系。
- 确实,唯一与 Wikipedia 定义相同的操作是投影。
域和角色
在 1.3 节中,关系被定义为有限数量集合的笛卡尔积的子集。这些集合中的每一个都称为一个域,并且有一个域名2。关系 可以 具有具有相同域名的列(即,其中两个列来自同一个集合)。在这种情况下,具有相同域名的列可以通过唯一的角色名称来区分。因此,Wikipedia 的属性名称类似于 Codd 的 domain_name.role_name3。
加入
在第 2.1.3 节中,Codd 定义了只有当两个关系共享一个域时才可以连接。此外,他指出,
如果存在三元关系 U 使得 π12( U) = R 和 π23(U) = S。任何这样的三元关系称为 R 与 S 的 join。如果 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 节。这是一个类似于Selection (as defined by Wikipedia) 的操作。关系 R 可以通过关系 S 以下列方式限制: 形成一个新关系 R',由 R' 的元组组成em>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 上定义一系列操作,从而得到与等式几乎相同的结果4 join 在维基百科文章中定义。
我们将利用我们只需要考虑二元关系的事实。所以让 R 有列( a, b )和 S 有列( b,c)。它们不一定是可连接的,因为 πb(R) 不一定等于 πb(S)。然后通过限制 R 与 S 相对于属性 b 和 S 来形成关系 R' ' 通过 R 再次限制 S 属性 b。现在,πb(R') = πb( S'),所以我们可以取R'和S'的自然连接。
联接之间的关系
它不属于给定的等连接定义,但是如果 πb(R) = πb(S),那么equi-join就相当于Natural Join。因此,自然连接是等连接的子集。
进一步阅读:我发现this answer 提供了有关 theta-joins 和关系代数的更多有用信息。
脚注
我不确定称这个 Codd 的原始关系代数是否公平,因为我在 CS.SE answer 中发现两年后,他会非常定义关系代数类似于 Wikipedia 中的(虽然谢天谢地在 θ-joins 中允许 ≠)。尽管如此,这个答案的一个重点是强调关系代数有不同的定义,必须先建立定义,然后才能进行任何形式的证明。
我正在忽略首先定义域位置的步骤,以及关系和关系之间的区别。
Codd 定义了一个额外的世代标识符,我们将再次忽略它。
在 Codd 的理论中,要连接的列必须具有相同的域。根据 Wikipedia 中提出的理论,这不是一个要求,但实际上,无论如何您都不应该进行这些类型的连接。