我有这个架构:
var paramLatitude = 0F
玩家只能参加一个团队。比赛可以在队友之间进行。一个团队只能拥有一个俱乐部。
我需要做这个代数关系:
提取一直赢得的球员和相关球队。
我知道这可以通过使用结构化的除法运算来完成:
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"?
答案 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
的子集(不是必要的)。为什么?请注意,对于PlayednWonAll
或PlayednBeatAll
关系,结果中可能会有很多玩家:安娜赢了所有比赛;芭芭拉也是如此。怎么会?因为安娜从未扮演芭芭拉;没有整体冠军。在PlayednBeatAll
的情况下,这意味着安娜和芭芭拉除了彼此之外都扮演了所有人。
PlayednWonAll
与PlayednBeatAll
之间的区别是什么?卡拉只打了一场对阵唐娜的比赛,卡拉赢了。安娜和巴拉巴拉不仅打了唐娜,还打了艾米利亚(两人都不打卡拉)。安娜&芭芭拉出现在两个结果中,卡拉仅出现在PlayednWonAll
。
这是一个无用的鸿沟:
ThinkAboutIt := WinnernLoser ÷ π⟨Badge⟩(PLAYER)
PLAYER
可能包括从未玩过的玩家。
然后没人能打败他们。即使每个PLAYER
都玩过:PLAYER
包括所有“永远赢了”的人;
他们不能迷失自己。ThinkAboutIt
始终为空。此外,SQL无法实现鸿沟,因此了解它具有微不足道的好处。除了总是可以通过其他运算符获得除法,通常这些运算符给出一个简洁的表达式,以及一个更容易理解的表达式。 (我的意思是其他RA操作符:在SQL模拟中,需要像往常一样需要可怕的代码。)QED。