关系代数 - 笛卡尔积与自然连接?

Posted

技术标签:

【中文标题】关系代数 - 笛卡尔积与自然连接?【英文标题】:Relational Algebra - Cartesian Product vs Natural Join? 【发布时间】:2012-12-17 03:07:48 【问题描述】:

我正在准备考试,但未能找到可靠的标准来确定是使用笛卡尔积 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))

谁能说明原因?

在我看来,Natural Join 会处理takes.ID=student.ID

【问题讨论】:

现实世界的数据库几乎使用笛卡尔积。 乔尔,我不同意。我经常发现笛卡尔积在“现实世界”中很有用。 @sqlvogel 我也用过……但很少见。 【参考方案1】:

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

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

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

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


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

【讨论】:

所以你的意思是这样的:r ⋈ s == π r.A, r.B, r.C, r.D, s.E (σ r.B = s.B ^ r.D = s.D (r x s)) for say schema: R(A,B,C,D) and S(B,D,E)? 是的! :) 至少,我是这么理解的。 好吧,这对我来说是有道理的,只是担心“答案”只显示问题的 1 个解决方案,而实际上有 2 个,我会被标记为不正确。 有太多可能的答案,只有最小的会被认为是正确的。您的解决方案比实际解决方案小,因此如果允许您使用⋈,您的答案是“更正确”。不过,可能还有更短的解决方案。将投影浮动到集合并集上,您将为自己节省一个运算符。 好点,但我也不知道。这实际上取决于您被允许使用的运算符。如果你不能使用逻辑析取,你只需必须使用集合并集。但如果可以的话,那几乎是最短的答案了。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

我认为有两种极端情况:

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

    内连接没有共同特征: 内连接等于笛卡尔积。

【讨论】:

以上是关于关系代数 - 笛卡尔积与自然连接?的主要内容,如果未能解决你的问题,请参考以下文章

关系代数

数组的笛卡尔积与自身可变次数?

数据库系统

数据库原理及应用——关系数据库

软考 系统架构设计师数据库系统④ 关系代数

关系查询处理和关系优化-第三节:查询优化之代数优化