【问题标题】:Relational Algebra Join - necessary to rename?关系代数加入 - 需要重命名?
【发布时间】:2020-07-12 08:26:51
【问题描述】:

假设我有一些 2 个简单的表:

重要提示:这是关于关系代数,而不是 SQL。

乐队表:

 band_name founded
 Gambo     1975
 John.     1342

专辑表:

album_name band_name
Celsius.   Gambo
Trambo     Gambo

现在,由于 Band 和 Album 表共享相同的列名“band_name”,当我加入它们时是否需要重命名?

据我所知,联接消除了联接之间共享的重复条目。在这个例子中,我简单地选择了专辑表中存在的所有乐队(在这个给出的例子中显然只是“Gambo”)

Πfounded, band_name(Band ⋈ Album)

因此应该可以正常工作,对吧?有人可以确认吗?

【问题讨论】:

  • 您的第一个(具体研究非重复)问题是什么? PS 有很多 RA(关系代数)。它们在运算符甚至关系是什么方面都不同。提供操作员定义和您的参考。例如教科书名称、版本和页码。

标签: join database-design relational-algebra relational


【解决方案1】:

(必须注意,关系代数有许多变体;它们在语义上不同;它们在语法上也不同。假设您打算使用类似于wikipedia 中的变体...)

是的,该表达式应该可以正常工作。自然连接运算符 匹配其两个操作数之间的同名属性。所以子表达式Band ⋈ Album 产生一个带有{band_name, founded, album_name} 属性的结果。你的表达投射了其中的两个。

注意关系值的属性是一个集合而不是一个序列;因此,对具有同名属性的关系操作数的任何操作都必须与属性匹配。

相比之下,笛卡尔积× 要求其操作数具有不相交的属性名称。然后Band × Album 格式不正确,将被拒绝。 (因此,您需要在其中一个中重命名 band_name,以获得可能是操作数的关系。)

我对你所说的“加入消除了在加入之间共享的重复条目”的方式不太满意。因为只有在 SQL 中才会得到重复项(来自SELECT * FROM Band, Album ...——这会导致一个包含四列的表,其中两列名为band_name)。 SQL FROM 表列表是一个拙劣的表:既不是联接也不是笛卡尔积,而是试图两者兼而有之的东西,并且成功地只是两者都不是。 RA 的 永远不会产生“重复”,因此它永远不会“消除”任何东西。

特别是如果声明了键和外键约束(从Albumband_nameBand 的),我认为那些标识了 same 乐队,那么自然操作就是把已经拆开的东西聚在一起,所以得名“自然连接”。

【讨论】:

  • 维基百科关系代数文章自然连接部分包含误导性“如果不是这种情况,例如从 Dept.Manager 到 Employee.Name 的外键,那么我们必须在采取之前重命名这些列自然加入。” (后面是不正确的“这样的连接 [...] 是等值连接。)它所在的整个段落被误解且措辞非常糟糕。我想知道这是否是(不清楚)中“需要重命名”混淆的根源) 问题。“我们是否必须重命名”取决于参数和结果元组成员资格标准,而不是 FK 或共享或非共享列本身。
猜你喜欢
  • 1970-01-01
  • 2019-11-09
  • 1970-01-01
  • 1970-01-01
  • 2016-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-20
相关资源
最近更新 更多