关系代数 - 笛卡尔积与自然连接?
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】:我认为有两种极端情况:
内部连接中没有重复的行: 内连接等于相交(我的意思只是结果)。 不同的内连接~相交
内连接没有共同特征: 内连接等于笛卡尔积。
【讨论】:
以上是关于关系代数 - 笛卡尔积与自然连接?的主要内容,如果未能解决你的问题,请参考以下文章