10

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

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

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

4

4 回答 4

12

暂时将 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

返回关系的乘积,即二的度数(即两个属性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

返回关系的自然连接,即度数为一(即产生一个属性的属性的集合并集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 行,即这个

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 只是一个)。

于 2011-09-27T06:03:37.900 回答
3

你不太对 - 一个 theta 连接是一个连接,它可能包括一个条件,不是=- 在 SQL 中,通常<等等>=。请参阅TechNet

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

于 2011-09-27T03:11:21.233 回答
2

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

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

希望这个解释有所帮助。

于 2012-02-09T08:23:57.157 回答
0

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

更新:请注意,不能以这种方式理解外连接,因为它们从无到有地合成信息(即空值)。

于 2019-05-31T00:51:54.907 回答