关系代数的除法运算

时间:2018-06-06 07:34:03

标签: schema relational-algebra relational-division

我有这个架构:

var paramLatitude = 0F
    TEAM 中的
  • 俱乐部 CLUB 中的名称;
  • TEAY
  • 玩家1,玩家2,获胜者 玩家 MATCH 参考徽章;
  • MATCH 中的 俱乐部 CLUB ; 中的名称

玩家只能参加一个团队。比赛可以在队友之间进行。一个团队只能拥有一个俱乐部。

我需要做这个代数关系:

  

提取一直赢得的球员和相关球队。

我知道这可以通过使用结构化的除法运算来完成:

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

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

1 个答案:

答案 0 :(得分:2)

好吧让我们组装一些积木。

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

  • 玩过的玩家&赢了至少一场比赛:

    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在整个联盟中每个可能的球员配对之间至少包含一场比赛?课程告诉你关于使用分工的目的是什么?

考试问题是否会在合理的场景中为创造性思维提供额外的分数?讲师是某种虐待狂吗?在谈到SQL之前,讲师是否理解RA,或者这是对该主题的某种象征性报道?

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

  • 假设查询正在寻找对团队中的每个人“总是赢”的玩家。 这对分裂很有用。
  • 然后报告“相关团队”会有一点意义: 一个特定的球员可能会“赢得”几个不同的球队; 我们想要报告每个这样的团队 - 不一定是玩家的'主队'。
  • 但它可能包括'主队'球队(因为“比赛可以在队友之间进行”)。 然后有一个问题:没有玩家可以自己玩(大概); 然后他们需要在他们的“主场”球队中对所有人进行比赛并且“总是一个人”,除了他们自己。

考试中是否会考虑探索所有这些可能性?

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

  • 另一个构建基块:将每个匹配的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的子集(不是必要的)。为什么?

请注意,对于PlayednWonAllPlayednBeatAll关系,结果中可能会有很多玩家:安娜赢了所有比赛;芭芭拉也是如此。怎么会?因为安娜从未扮演芭芭拉;没有整体冠军。在PlayednBeatAll的情况下,这意味着安娜和芭芭拉除了彼此之外都扮演了所有人。

PlayednWonAllPlayednBeatAll之间的区别是什么?卡拉只打了一场对阵唐娜的比赛,卡拉赢了。安娜和巴拉巴拉不仅打了唐娜,还打了艾米利亚(两人都不打卡拉)。安娜&芭芭拉出现在两个结果中,卡拉仅出现在PlayednWonAll

  • 这是一个无用的鸿沟:

    ThinkAboutIt := WinnernLoser ÷ π⟨Badge⟩(PLAYER)
    
    • PLAYER可能包括从未玩过的玩家。 然后没人能打败他们。即使每个PLAYER都玩过:
    • PLAYER包括所有“永远赢了”的人; 他们不能迷失自己。
    • IOW ThinkAboutIt始终为空。
这就是为什么我认为教导关系鸿沟毫无意义。实际上有几种不同的差异,每种都试图以不同的方式应对,例如空关系或除数,而属性不是被除数的子集。 (或者像“永远赢了”和“永不丢失”这样的语义。)讲师/教科书很少涉及细微之处。

此外,SQL无法实现鸿沟,因此了解它具有微不足道的好处。除了总是可以通过其他运算符获得除法,通常这些运算符给出一个简洁的表达式,以及一个更容易理解的表达式。 (我的意思是其他RA操作符:在SQL模拟中,需要像往常一样需要可怕的代码。)QED。