我正在攻读考试,但我没有找到一个可靠的标准来确定是否要使用笛卡尔积x
或是否使用自然加入|X|
。
我想出了一个粗略的指南:
“如果您需要投影与要加入的表中的属性同名的属性,则必须使用x
并说明要投影的表名:{{ 1}}“ 的
然而,这并不遵循我的笔记中的一些解决方案,我的讲师似乎使用tableA.colname1 = tableB.colname1
上述惯例或x
可互换使用。
是否有人可以遵循规则来定义一个规则的使用?
以此模式为例(仅为与简洁引用的问题相关的模式):
|x|
问)找出所有参加2011年春季或2011年秋季课程的学生的姓名。
我的回答尝试:
takes(ID, course_id, sec_id, semester, year, grade)
student(ID, name, dept_name, tot_cred)
实际答案:
π 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))
?
答案 0 :(得分:6)
根据我的理解,自然连接是一个预测的,经滤波的笛卡尔积:
根据这个假设,你的答案与实际答案是同构的。
要看到这一点,您可能希望将自然连接扩展到上面的运算符序列,并使用关系代数法则将它们浮动。您将看到投影由于投影到name
而消失,并且选择标准与上面的选择融合。你最终会得到与实际答案完全相同的树,即使你从未改变过自己答案的含义!
我可以想到你的讲师可以互换地使用这些概念的一个原因:你的讲师希望你理解这些概念可以可以互换使用,因为“自然联接只是一个捷径”(尽管这是有争议的。)
答案 1 :(得分:1)
笛卡尔积只是自然连接的一个特例,其中连接关系没有任何共同的属性名称。在Codd的原始代数中,重命名是一个单独的操作。要获得具有一些共同属性的两个关系的真正笛卡尔积,您必须在执行(自然)连接之前重命名这些属性。
为简洁起见,重命名有时会被排除在书面示例之外,而使用的是产品符号。不幸的是,这掩盖了重要的一点,即只有一种联接。
答案 2 :(得分:-1)
我认为有两种极端情况:
内部联接中没有重复的行: 内部联接等于相交(我只表示结果)。 不同的内部连接〜相交
内部联接没有共同特征: 内部联接等于笛卡尔积。