这种自然连接操作是不是正确使用? (关系代数)

Posted

技术标签:

【中文标题】这种自然连接操作是不是正确使用? (关系代数)【英文标题】:Is this natural join operation used correctly? (Relational Algebra)这种自然连接操作是否正确使用? (关系代数) 【发布时间】:2020-10-20 08:51:04 【问题描述】:

教授给我的任务如下:R-E Modell

    假设公司可能位于多个城市。查找位于“Small Bank Corporation”所在城市的所有公司 位于。

现在教授的解决方法如下:

s ← Π city (σ company_name=’Small Bank Corporation’ (company))
temp1 ← Π comp_id, company_name (company)
temp2 ← Π comp_id, company_name ((temp1 × s) − company)
result ← Π company_name (temp1 − temp2)

我自己发现了一个完全不同的解决方案,其自然连接操作看起来更简单:

我试图做的是使用自然联合操作,它定义为以下关系 r 和 s 在它们的共同属性上连接。所以我试图通过对所有公司名称为“小银行合作”的公司进行投影来获得所有城市名称。之后,我将带有城市名称的表与公司表连接起来,这样我就可以获得所有包含城市名称的公司条目。

company ⋈ Π city (σ company_name=”Small Bank Cooperation” (company)))

我现在的问题是我的解决方案是否也有效,因为它似乎有点微不足道?

【问题讨论】:

您不使用“小银行公司”。没有“名称”列。但是您的一般方法是不正确的。 Re relational querying. PS 嵌套 RA 调用形成一种编程语言。因此,即使您实际上并未运行代码,也要尽可能多地提供minimal reproducible example。而且——谷歌“在线运行关系代数”。 PS这是一个“关系划分”的案例。它有常见问题解答和标签。 您实际上并没有解释您加入的城市名称的“所有包含城市名称的公司条目” - 即只是“SBC” - 是所请求的公司集。 (不是。) 为什么它不是请求的公司集?我得到一张小银行合作所在城市的表格,不是吗?之后,我使用这些城市名称并寻找具有共同城市属性的公司(自然加入)。 您的评论和帖子不清楚。当您没有明确证明时,请不要要求我们反驳您。 (你的错误理由导致了错误的代码。)使用足够多的单词、句子和对部分示例的引用来清楚完整地表达你的意思。在给出业务关系(船)/关联或表(基础或查询结果)时,说明其中的一行根据其列值说明了业务情况。 (子表达式返回(所有)SBC 城市。但您最终不会返回所有这些城市中的公司,即在每个城市中;您至少返回其中一个中的公司。) 我刚才说的是,你的任务是所有 SBC 城市的公司,即每个 SBC 城市,但你至少返回一个 SBC 城市的公司。我建议您通过一个示例,运行一个示例,为每个子表达式的表提供成员资格条件,阅读有关划分并阅读如何构建查询(还以文本形式提供表定义并将您的代码格式化为代码未包装的散文),但你没有;但我希望你这样做。 (再次:关于连接返回的最后一步是不合理的)。 (我正在编辑您的查询的答案。) 【参考方案1】:

你的不一样。

My answer here says how to query relationally. 它使用关系代数的一个版本,其中标题是属性名称的集合。 My answer here summarizes it:

每个查询表达式都有一个关联的(特征) 谓词——由属性参数化的语句模板。元组 使谓词成为真正的命题--陈述--在 关系。

我们得到了关系名称表达式的谓词。

让查询表达式 E 有谓词 e。那么:

R ⨝ S 有谓词 r and s R ∪ S 有谓词 r or s R - S 有谓词 r and not s σ p (R) 有谓词 r and p π A (R) 有谓词 exists non-A attributes of R [r]

当我们想要满足某个谓词的元组时,我们会找到一种方法 用关系运算符表达那个谓词 给定关系谓词的转换。对应的查询 返回/计算元组。

您的解决方案

company ⋈ Π city (σ company_name=”Small Bank Corporation” (company)))

是行在哪里

    company company_id named company_name is in city
AND FOR SOME company_id & company_name [
            company company_id named company_name is in city
        AND company_name=”Small Bank Corporation”]

    company company_id named company_name is in city
AND FOR SOME company_id [
        company company_id named ”Small Bank Corporation” is in city]

    company company_id named company_name is in city
AND some company named ”Small Bank Corporation” is in city

您返回的行包含的列不仅仅是 company_name。但您的公司不是要求的公司。

将您的行投影到 company_name 会给出行的位置

    some company named company_name is in some city
AND some company named ”Small Bank Corporation” is in that city

之后,我将带有城市名称的表格加入公司 表,以便我获得所有包含城市名称的公司条目 它。

这不清楚你得到了什么。但是,您所在行中的公司至少是 SBC 城市之一的公司。该请求适用于所有 SBC 城市的人:

位于“小型银行公司”所在城市的公司

我提供的链接告诉您如何编写查询,以及如何在查询结果规范和返回结果的关系代数表达式之间进行转换。

当您看到与“每个”或“所有”其他行匹配的行的查询时,您可以预期查询的这一部分涉及relational-division 或一些相关的成语。确切的代数取决于 - 经常表达不佳/含糊不清 - 要求的意图。例如,当没有这样的城市时,“公司位于每个城市”是否应该是没有公司(部门)或所有公司(相关成语)。 (您的作业的正常数学解释是后者。)例如,他们是否想要在所有此类城市或至少在所有此类城市中都有公司。

(这有助于避免在“find”和“return”之后使用“all”和“every”,无论如何它都是多余的。)

Database Relational Algebra: How to find actors who have played in ALL movies produced by “Universal Studios”?How to understand u=r÷s, the division operator, in relational algebra?How to find all pizzerias that serve every pizza eaten by people over 30?

【讨论】:

以上是关于这种自然连接操作是不是正确使用? (关系代数)的主要内容,如果未能解决你的问题,请参考以下文章

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

8种常用的关系代数运算_20160928

数据库关系代数操作 并 差 积 选择 投影 连接等操作

数据库系统

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

数据库 关系代数中 join 的意思是啥 怎么用