9

我正在为考试而学习,但未能找到一个可靠的标准来确定是x使用笛卡尔积还是使用自然连接|X|

我想出了一个粗略的指南:

“如果您需要投影与要连接的表中的属性同名的属性,您必须使用x并说明要投影的表名称:tableA.colname1 = tableB.colname1

然而,这并没有遵循我笔记中的一些解决方案,我的讲师似乎使用x上述约定或|x|互换使用。

有没有人可以遵循一个规则来定义一个在另一个之上的使用?


以这个模式为例(仅与为简洁起见引用的问题相关的模式):

takes(ID, course_id, sec_id, semester, year, grade)
student(ID, name, dept_name, tot_cred)

Q) 找出所有参加过 2011 年春季或 2011 年秋季课程的学生的姓名。

我的回答尝试:

π name(σ semester="Spring" ^ year=2011(takes ⋈ student)) ∪ π name(σ semester="Autumn" ^ year=2011(takes ⋈ student))

实际答案:

π name(σ semester="Spring" ^ year=2011 ^ takes.ID=student.ID(takes x student)) ∪ π name(σ semester="Autumn" ^ year=2011 ^ takes.ID=student.ID(takes x student))

任何人都可以提供一个理由吗?

在我看来,自然加入会处理takes.ID=student.ID?

4

3 回答 3

9

据我了解,自然连接是投影的过滤笛卡尔积:

  • 你取笛卡尔积,然后
  • 选择它,使同名列中的值具有相同的值,并且
  • 投影它,以便所有列都有不同的名称。

在这种假设下,您的答案与实际答案同构。

要看到这一点,您可能希望将自然连接扩展到上述运算符序列,并使用关系代数定律将它们浮动。您会看到由于投影到 ,投影消失了name,并且选择标准与上面的选择融合在一起。即使您从未改变自己答案的含义,您最终也会得到与实际答案完全相同的树!


我可以想到您的讲师可以互换使用这些概念的一个原因:您的讲师希望您了解这些概念可以互换使用,因为“自然连接只是一条捷径”(尽管这是有争议的)。

于 2013-01-02T18:55:04.137 回答
3

笛卡尔积只是自然连接的一种特殊情况,其中连接关系没有任何共同的属性名称。在 Codd 的原始代数中,重命名完全是一个单独的操作。要获得具有某些共同属性的两个关系的真正笛卡尔积,您必须在进行(自然)连接之前重命名这些属性。

为简洁起见,有时会在书面示例中省略重命名,而是使用产品符号。不幸的是,这掩盖了重要的一点,即只有一种连接。

于 2016-11-27T18:59:51.183 回答
-1

我认为有两种极端情况:

  1. 内连接中没有重复的行:内连接等于相交(我的意思只是结果)。不同的内连接〜相交

  2. 内连接没有共同的特点:内连接等于笛卡尔积。

于 2020-02-23T21:29:16.273 回答