小编典典

关系代数-Cartesian Product vs Natural Join?

sql

我正在为考试而学习,没有找到确定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)

问)找出参加过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


阅读 224

收藏
2021-04-17

共1个答案

小编典典

据我了解,自然连接是经过预测的,经过过滤的笛卡尔积:

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

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

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


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

2021-04-17