【问题标题】:can the natural-join be seen as a subset of the equi-join and theta-join?自然连接可以看作是等连接和θ连接的子集吗?
【发布时间】:2013-02-21 19:37:27
【问题描述】:

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

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

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

谁能解释一下这个问题?

*我找不到这句话的原始出处。

【问题讨论】:

  • 这和统计有什么关系?
  • @AndyW,感谢您的评论。我将关系代数理解为理解数据关系的一种方式,并且它是统计的一部分,但它属于stackoverflow.com
  • @sqlvogel 我在这里提到你是为了让你意识到这个问题。也许您可以详细说明您的评论。谢谢,埃里克
  • 为这些运算符名称提供定义定义您的“运算符的子集”。你的意思是 natural theta-join & equijoin 吗?或者它们是否也都为他们的比较运算符输入了一对属性?假设前者。假设我们将运算符解释为一组输入-输出对。 Theta-join 输入三元组(关系、运算符、关系),因此它与自然等值连接和自然连接不相交。对于输入关系对没有公共列,后两者相交,但否则它们返回不同数量的列;所以两者都不是另一个的子集。定义术语,这很简单。
  • PS 如果您阅读定义,您为什么还要问这个问题——您会知道每个定义的作用。当然,演示文稿在细节和模糊性上有所不同。但是,如果定义是矛盾的和/或模糊的,为什么要询问(未定义的)子集而不是询问定义?接受的答案对“子集”也很模糊,而且冗长冗长。另见this

标签: database math join relational-database relational-algebra


【解决方案1】:

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


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

编辑:本段在下面的 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 开始,因为它与当今大学在介绍性数据库课程中所教授的内容非常接近。然而,这篇文章未能有效地引用其来源,尤其是在技术方面。它也是相当数学的。因此,我真的不向第一次研究关系代数的人推荐这篇文章。

自然连接

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

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

还有,

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

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

Theta-joins 和 equi-joins

Wikipedia 将关系 RS 之间的 θ-join 定义为满足 θ-relation a θ b 或 a θ 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 也不是自然连接的子集(这就是我最初的意思我说他们是不同的)。因此,自然连接不是等值连接的子集

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。如果 RS 是二元关系,使得π2(R) = π1(S),则R为可与 S 连接。

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

这比 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(尽管如果我错了请纠正我)。然而,我们可以在关系 RS 上定义一系列操作,从而得到与等式几乎相同的结果4 join 在维基百科文章中定义。

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

联接之间的关系

它不属于给定的等连接定义,但是如果 πb(R) = πb(S),那么equi-join就相当于Natural Join。因此,自然连接是等连接的子集


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


脚注

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

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

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

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

【讨论】:

  • 感谢您的回复。我原以为会有一个严格的技术答案。 是自然连接的数学定义,是等连接和θ连接的严格技术定义的子集,但也许这样的答案不存在。无论如何,我感谢您抽出宝贵的时间。
  • @EricFail 出于某种原因,我没有意识到您正在寻找严格的技术答案。我已经更新了我的帖子并添加了很多技术性,希望能回答您的问题。
【解决方案2】:

他可能提到了以下内容:

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

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

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

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

【讨论】:

  • 感谢您的插话,您的“他”指的是谁? DPenner、E.F. Codd 还是我?如果我将其解读为 自然连接可以合理地被视为 equi-join 和 theta-join 的子集,我是否正确阅读了您的答案?
  • 声明的作者(自然连接是 equijoin 的一个子集),您的问题是关于此的。
猜你喜欢
  • 2018-11-30
  • 2011-12-13
  • 1970-01-01
  • 1970-01-01
  • 2011-07-25
  • 2012-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多