【问题标题】:Clear explanation of the "theta join" in relational algebra?关系代数中“theta join”的清晰解释?
【发布时间】:2011-11-25 16:17:30
【问题描述】:

我正在寻找对关系代数中 theta 连接概念的清晰、基本解释,或许还有一个示例(可能使用 SQL)来说明其用法。

如果我理解正确的话,theta 连接是一个添加了条件的自然连接。因此,虽然自然连接强制相同名称的属性之间相等(并删除重复项?),但 theta 连接的作用相同事情,但增加了一个条件。我有这个权利吗?任何简单的解释(对于非数学家)将不胜感激。

另外(很抱歉最后把它扔了,但它有点相关),有人可以解释笛卡尔积的重要性或想法吗?我想我在基本概念方面遗漏了一些东西,因为对我来说,这似乎是对基本事实的重申,即一组 13 X 一组 4 = 52...

【问题讨论】:

标签: sql relational-database cartesian-product relational-algebra


【解决方案1】:

暂时不考虑 SQL...

关系运算符将一个或多个关系作为参数并产生一个关系。因为根据定义,关系没有具有重复名称的属性,所以关系操作 theta join 和 natural join 都将“删除重复的属性”。 [按照您的要求,在 SQL 中发布示例来解释关系操作的一个大问题是,SQL 查询的结果不是关系,因为它可能有重复的行和/或列。]

关系笛卡尔积运算(产生关系)不同于集合笛卡尔积(产生一组对)。 “笛卡尔”这个词在这里并不是特别有用。事实上,Codd 称他的原始运算符为“产品”。

真正的关系语言Tutorial D 缺少乘积运算符,并且product 不是Tutorial D 的合著者Hugh Darwen** 提出的关系代数中的原始运算符。这是因为没有共同属性名称的两个关系的自然连接导致相同的关系作为相同两个关系的乘积,即自然连接更一般,因此更有用。

考虑这些示例(教程 D):

WITH RELATION { TUPLE { Y 1 } , TUPLE { Y 2 } , TUPLE { Y 3 } } AS R1 ,
     RELATION { TUPLE { X 1 } , TUPLE { X 2 } } AS R2 :
R1 JOIN R2

返回关系的乘积,即 2 的度数(即两个属性,XY)和 6 的基数(2 x 3 = 6 个元组)。

然而,

WITH RELATION { TUPLE { Y 1 } , TUPLE { Y 2 } , TUPLE { Y 3 } } AS R1 ,
     RELATION { TUPLE { Y 1 } , TUPLE { Y 2 } } AS R2 :
R1 JOIN R2

返回关系的自然连接,即度数为 1(即属性的集合并集产生一个属性 Y)和基数为 2(即删除重复的元组)。

我希望上面的例子能解释为什么你的说法“一组 13 X 一组 4 = 52”并不完全正确。

同样,教程 D 不包含 theta 连接运算符。这本质上是因为其他运算符(例如自然连接和限制)使其既不必要又不是非常有用。相比之下,Codd 的原始运算符包括可用于执行 theta 连接的产品和限制。


SQL 有一个名为 CROSS JOIN 的显式乘积运算符,它强制结果为乘积,即使它通过创建重复列(属性)而违反 1NF。考虑与上面后面的 Tutoral D 示例等效的 SQL:

WITH R1 AS (SELECT * FROM (VALUES (1), (2), (3)) AS T (Y)), 
     R2 AS (SELECT * FROM (VALUES (1), (2)) AS T (Y))
SELECT * 
  FROM R1 CROSS JOIN R2;

这将返回一个表表达式,其中包含两列(而不是一个属性),都称为 Y (!!) 和 6 行,即 this

SELECT c1 AS Y, c2 AS Y 
  FROM (VALUES (1, 1), 
               (2, 1), 
               (3, 1), 
               (1, 2), 
               (2, 2), 
               (3, 2)
       ) AS T (c1, c2);

** 也就是说,虽然只有一个关系模型(即 Codd's),但关系代数可能不止一个(即 Codd's 只是一个)。

【讨论】:

  • 教程 D 的当前版本没有“缺少”笛卡尔积。该运算符称为 TIMES。 (虽然 Manifesto 书中正式的 Tutorial D 语法不包括 TIMES,但同一本书中的附录 A 清楚地表明,在编写 Manifesto 书时,D&D 已经将 TIMES 作为一个单独的运算符。形式语法是他们在数据库探索中修复的不完整性。)
  • @onedaywhen,非常感谢您对此进行阐述。我在一些基本概念上遇到了麻烦。为什么自然连接(在您的第一个(教程 D)示例中与产品相同?我真的只是在问,您为什么要乘以?结果集不是有 5 个元素吗?我显然遗漏了一些东西这里是基本的......另外,你能用简单的术语解释一下元组是什么吗?将它视为几乎是行的同义词是否有帮助?
  • @Erwin Smout:我知道TIMES 并最初将其包含在我的答案中,但后来将其删除:请参阅修订历史,我对此确实感到两难。请编辑我的答案以根据您的需要进行更正:)
  • @LuxuryMode:是的,关系中的元组类似于表格中的一行。
  • @LuxuryMode:“结果集不是有 5 个元素吗?” -- 如果我们谈论的是集合产品,那么结果将是一组对。但是对于关系产品(当然是我们正在讨论的),结果是一个关系,而您似乎暗示的结果不是一个有效的关系:REL{TUP{Y 1},TUP{Y 2},TUP{Y 3}, TUP{X 1},TUP{X 2}}; 一个属性不能同时是 XY
【解决方案2】:

你不太对 - 一个 theta 连接是一个连接,它可能包含一个条件 other 而不是 = - 在 SQL 中,通常是 <>= 等。参见 @987654321 @

对于笛卡尔积(或CROSS JOIN),它是一种操作,而不是一个想法或概念。这很重要,因为有时您需要使用它! set of 13 x set of 4 = 52是一个基本事实,笛卡尔积就是基于这个事实。

【讨论】:

  • 严格来说,Θ-join 是一个合适的超集;它包括 = 以及其他比较
  • 对此我还不是很清楚。所以Exp1, theta join Exp2等于从exp1 X exp2的叉积中选择一个条件?
  • @LuxyryMode 是的,这是正确的。 Theta 连接是笛卡尔积的子集,而不是自然连接。
  • 事实上所有的连接都是笛卡尔积的一个子集!
  • @M-D 除了针对空集的外连接 - 我认为这不是真正的连接。
【解决方案3】:

在我看来,为了简单起见,如果你理解 equijoin,你应该理解 theta join。如果您将 equijoin 中的符号 = (equal) 更改为 >=,那么您已经完成了 theta join。但是,我认为与 equijoin 相比,很难看出使用 theta join 的实用性,因为我们通常使用的 join 原因是 V.primarykey = C.foreignkey。如果您想更改为theta join,那么它可能取决于值,因此您正在进行选择。

对于自然Join,它与equijoin 类似,只是去掉了多余的属性。简单!:)

希望这个解释有所帮助。

【讨论】:

    【解决方案4】:

    所有连接都可以被认为是从一个叉积开始,然后剔除某些行。自然连接会剔除正在连接的两个表中的同名列具有不同值的所有行。等值连接会清除指定列具有不同值的所有行。并且 theta-join 会清除所有指定列不在指定关系中的行( 或其他;原则上它可以是 is_prefix_of 作为字符串之间的关系)。

    更新:请注意,外连接不能这样理解,因为它们无中生有地合成信息(即空值)。

    【讨论】:

    • (在你所说的那种关系代数中,虽然还有其他的:)自然连接不是交叉连接的过滤器。它是交叉连接的过滤器的某个投影。 PS“概念上”没有帮助。我们正在谈论运营商。它们已经是“概念性的”了。你说的任何其他感觉都不清楚。 PS请参阅我的问题和另一个答案。
    猜你喜欢
    • 2016-08-14
    • 1970-01-01
    • 2013-11-02
    • 1970-01-01
    • 2017-03-24
    • 2015-07-28
    • 1970-01-01
    • 2013-07-27
    • 2023-04-05
    相关资源
    最近更新 更多