首页 > 解决方案 > 关系代数的除法运算

问题描述

我有这个架构:

CLUB(Name, Address, City)
TEAM(TeamName, club)
PLAYER(Badge, teamName)
MATCH(matchNumber, player1, player2, club, winner)

一名球员只能是一支球队的一员。队友之间可以进行比赛。一支球队只能拥有一个俱乐部。

我需要做这个代数关系:

提取始终获胜的玩家和相关团队。

我知道这也可以通过使用除法操作来完成:

r(A, B) / s(B)

事实是我不知道如何设置它。在第一个关系中,我有一个属性 A,这是我想要提取的属性(我猜),所以它应该是“TeamName”。第二个 (B) 应该是与 s(B) 共有的一个属性(其中 s(B) 是 r(A, B) 的子集)。在这种情况下,它可以是属性“赢家”吗?

标签: schemarelational-algebrarelational-division

解决方案


好的,让我们组装一些积木。

注意符号:我使用希腊字母表示关系运算符;它们的属性名称周围的尖括号(通常显示为后缀);关系参数的圆括号。

  • 参加并赢得至少一场比赛的球员:

    PlayednWon := ρ⟨Badge := winner⟩(π⟨winner⟩(MATCH))
    
  • 至少参加并输掉一场比赛的球员:

    PlayednLost := ρ⟨Badge := player1⟩(π⟨player1⟩(σ⟨winner ≠ player1⟩(MATCH)))
                   ∪
                   ρ⟨Badge := player2⟩(π⟨player2⟩(σ⟨winner ≠ player2⟩(MATCH)))
    
  • 参加过并赢得每场比赛的球员。(即从未玩过和输过)

    PlayednWonAll := PlayednWon - PlayednLost
    
  • 从未输过的玩家(可能是因为他们从未玩过)

    NeverLost := π⟨Badge⟩(PLAYER) - PlayednLost
    

到目前为止不需要任何关系划分。我也看不出它会使这些更简洁。稍后我将添加更多代码。

您是否忠实地复制了试题?例如,您是否被告知MATCH在整个联盟中每对可能的球员之间至少有一场比赛?课程告诉你使用除法的目的是什么?

考试题是否为围绕合理场景进行创造性思考提供额外分数?讲师是某种虐待狂吗?讲师是否了解 RA,或者这是在进入 SQL 实质之前对该主题的某种象征性覆盖?

我可以大胆猜测为什么你会被告知“队友之间可以进行比赛”。

  • 假设查询正在寻找与球队中的每个人“总是赢”的球员。这对除法很有用。
  • 那么报告“相关球队”就很重要了:一个特定的球员可能“总是赢”几支不同的球队;我们想要报告每一个这样的球队——不一定是球员的“主队”。
  • 但它可能包括“主队”(因为“队友之间可以进行比赛”)。然后有一个问题:没有玩家可以玩自己(大概);然后他们需要和他们的“主”队中的每个人都打过并且“总是一个人”,除了他们自己。

考试中是否会因探索所有这些可能性而打分?

补充:让我们使用除法来找到一个微妙的变体。

  • 另一个构建块:将winner每场比赛的输家和输家配对(这是 的变体PlayednLost):

    WinnernLoser := ρ⟨Badge := player1⟩(π⟨winner, player1⟩(σ⟨winner ≠ player1⟩(MATCH)))
                    ∪
                    ρ⟨Badge := player2⟩(π⟨winner, player2⟩(σ⟨winner ≠ player2⟩(MATCH)))
    
  • 现在,那些一直站在胜利一边的人对抗曾经输过的所有人:

    PlayednBeatAll := WinnernLoser ÷ PlaydnLost
    // equivalently:  WinnernLoser ÷ π⟨Badge⟩(WinnernLoser)
    
    • 快速:结果中有哪些属性?为什么?
    • 那么我们如何根据原始问题获得“相关团队”?
    • 这是 的一个子集(不是正确的)PlayednWonAll。为什么?

请注意,对于关系PlayednWonAllor PlayednBeatAll,结果中可能有很多玩家: Anna 赢得了她参加的每一场比赛;芭芭拉也是如此。怎么来的?因为安娜从来没有演过芭芭拉;没有总冠军。在 的情况下PlayednBeatAll,这意味着 Anna 和 Barbara 扮演过除了彼此之外的所有人。

PlayednWonAllas compare 和有什么不一样PlayednBeatAll?卡拉只打了一场比赛,对阵唐娜,卡拉赢了。安娜和巴拉巴拉不仅战胜了唐娜,还战胜了艾米莉亚(都没有扮演卡拉)。所以 Anna 和 Barbara 出现在两个结果中,Carla 只出现在PlayednWonAll.

  • 这是一个无用的划分:

    ThinkAboutIt := WinnernLoser ÷ π⟨Badge⟩(PLAYER)
    
    • PLAYER可能包括从未玩过的玩家。那么没有人能打败他们。即使每个PLAYER人都玩过:
    • PLAYER包括“总是赢”的每个人;他们不可能输给自己。
    • IOWThinkAboutIt始终为空。

像这样的问题就是为什么我认为教授关系鸿沟是毫无意义的。实际上有几种除法变体,每种变体都试图以不同的方式处理极端情况,例如空关系或具有属性而不是除数子集的除数。(或者像“总是赢”和“从不输”这样的语义。)讲师/教科书很少涉及细节。

此外,除法在 SQL 中不可用,因此了解它是微不足道的。除法总是可以通过其他运算符获得,并且通常这些运算符给出的表达式同样简洁,并且更易于理解。(我的意思是其他 RA 运算符:在 SQL 中模拟除法需要可怕的代码,像往常一样。) QED。


推荐阅读