关系代数的除法运算

Division Operation on Relational Algebra

我有这个架构:

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

一名球员只能加入一支球队。比赛可以在队友之间进行。一支球队只能有一个俱乐部。

我需要做这个代数关系:

Extract the players who have always won and the related team.

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

r(A, B) / s(B)

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

好的,让我们assemble一些积木。

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

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

    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 的主题之前对该主题的某种象征性报道?

我可以随意猜测为什么要告诉你 "matches can be played between teammates."

  • 假设查询正在寻找对团队中每个人都有 "always won" 的球员。 这是除法的好用处。
  • 那么举报就有点意思了"related team": 一个给定的玩家可能 "always won" 对抗几支不同的球队; 我们想要报告每个这样的球队——不一定是球员的 'home' 球队。
  • 但它可能包括 'home' 团队(因为 "matches can be played between teammates")。 然后有一个陷阱:没有玩家可以玩自己(大概); 那么他们需要 "always one" 与 'home' 团队中除了他们自己以外的所有人进行比赛。

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

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

  • 另一个积木:将每场比赛的 winner 和失败者配对(这是 PlayednLost 的变体):

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

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

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

PlayednWonAllPlayednBeatAll有什么区别?卡拉只打了一场比赛,对阵唐娜,卡拉赢了。 Anna 和 Barabara 不仅与 Donna 对战,还与 Emilia 对战并获胜(都没有扮演 Carla)。所以 Anna 和 Barbara 出现在两个结果中,Carla 只出现在 PlayednWonAll.

  • 这是一个无用的鸿沟:

    ThinkAboutIt := WinnernLoser ÷ π⟨Badge⟩(PLAYER)
    
    • PLAYER 可能包括从未玩过的玩家。 那么没有人能打败他们。即使每个 PLAYER 播放过:
    • PLAYER 包括 "always won" 的所有人; 他们不可能输给自己。
    • IOW ThinkAboutIt 总是空的。

我认为教授关系鸿沟毫无意义的原因就在于此。实际上有几种除法变体,每一种都试图以不同的方式处理极端情况,例如空关系或除数的属性不是被除数的子集。 (或者像 "always won" 和 "never lost" 这样的语义。)并且 lecturers/textbooks 很少进入微妙之处。

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