我正在为考试而学习,没有找到确定x要使用笛卡尔乘积还是要使用自然联接的可靠标准|X|。
x
|X|
我想出了一个粗略的指导:
“如果需要投影与要连接的表中的属性具有相同名称的属性,则必须使用x并声明要投影的表名称:tableA.colname1 = tableB.colname1”
tableA.colname1 = tableB.colname1
但是,这并没有遵循我的笔记中的某些解决方案,并且我的讲师似乎x与上述约定结合使用或|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?
takes.ID=student.ID
据我了解,自然连接是经过预测的,经过过滤的笛卡尔积:
在这种假设下,您的答案与实际答案同构。
要看到这一点,您可能需要将自然联接扩展到上述算子序列,并使用关系代数定律将它们浮动。您会看到,由于到的投影name,投影消失了,并且选择标准与上面的选择融合了起来。即使您从未更改自己答案的含义,您最终还是会得到与实际答案完全相同的树!
name
我可以想到您的讲师可以交替使用这些概念的一个原因:您的讲师希望您了解这些概念 可以 互换使用,因为“自然连接只是捷径”(尽管这值得商bat)。