关系代数 - 笛卡儿积与自然联合?

时间:2013-01-02 18:38:09

标签: sql database-design relational relation relational-algebra

我正在攻读考试,但我没有找到一个可靠的标准来确定是否要使用笛卡尔积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))

3 个答案:

答案 0 :(得分:6)

根据我的理解,自然连接是一个预测的,经滤波的笛卡尔积:

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

根据这个假设,你的答案与实际答案是同构的。

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


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

答案 1 :(得分:1)

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

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

答案 2 :(得分:-1)

我认为有两种极端情况:

  1. 内部联接中没有重复的行: 内部联接等于相交(我只表示结果)。 不同的内部连接〜相交

  2. 内部联接没有共同特征: 内部联接等于笛卡尔积。