schema - 关系代数的除法运算
问题描述
我有这个架构:
CLUB(Name, Address, City)
TEAM(TeamName, club)
PLAYER(Badge, teamName)
MATCH(matchNumber, player1, player2, club, winner)
- TEAM中的俱乐部引用CLUB中的名称;
- PLAYER中的teamName引用了TEAM中的TeamName;
- 玩家 1,玩家 2,MATCH中的获胜者参考徽章在PLAYER中;
- MATCH中的Club引用CLUB中的名称;
一名球员只能是一支球队的一员。队友之间可以进行比赛。一支球队只能拥有一个俱乐部。
我需要做这个代数关系:
提取始终获胜的玩家和相关团队。
我知道这也可以通过使用除法操作来完成:
r(A, B) / s(B)
事实是我不知道如何设置它。在第一个关系中,我有一个属性 A,这是我想要提取的属性(我猜),所以它应该是“TeamName”。第二个 (B) 应该是与 s(B) 共有的一个属性(其中 s(B) 是 r(A, B) 的子集)。在这种情况下,它可以是属性“赢家”吗?
解决方案
好的,让我们组装一些积木。
注意符号:我使用希腊字母表示关系运算符;它们的属性名称周围的尖括号(通常显示为后缀);关系参数的圆括号。
参加并赢得至少一场比赛的球员:
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
。为什么?
请注意,对于关系PlayednWonAll
or PlayednBeatAll
,结果中可能有很多玩家: Anna 赢得了她参加的每一场比赛;芭芭拉也是如此。怎么来的?因为安娜从来没有演过芭芭拉;没有总冠军。在 的情况下PlayednBeatAll
,这意味着 Anna 和 Barbara 扮演过除了彼此之外的所有人。
PlayednWonAll
as compare 和有什么不一样PlayednBeatAll
?卡拉只打了一场比赛,对阵唐娜,卡拉赢了。安娜和巴拉巴拉不仅战胜了唐娜,还战胜了艾米莉亚(都没有扮演卡拉)。所以 Anna 和 Barbara 出现在两个结果中,Carla 只出现在PlayednWonAll
.
这是一个无用的划分:
ThinkAboutIt := WinnernLoser ÷ π⟨Badge⟩(PLAYER)
PLAYER
可能包括从未玩过的玩家。那么没有人能打败他们。即使每个PLAYER
人都玩过:PLAYER
包括“总是赢”的每个人;他们不可能输给自己。- IOW
ThinkAboutIt
始终为空。
像这样的问题就是为什么我认为教授关系鸿沟是毫无意义的。实际上有几种除法变体,每种变体都试图以不同的方式处理极端情况,例如空关系或具有属性而不是除数子集的除数。(或者像“总是赢”和“从不输”这样的语义。)讲师/教科书很少涉及细节。
此外,除法在 SQL 中不可用,因此了解它是微不足道的。除法总是可以通过其他运算符获得,并且通常这些运算符给出的表达式同样简洁,并且更易于理解。(我的意思是其他 RA 运算符:在 SQL 中模拟除法需要可怕的代码,像往常一样。) QED。
推荐阅读
- c# - FirstOrDefault 或 FirstOrDefaultAsync 核心选择什么
- mongodb - 如何排除在其他集合中有引用的文档?
- python - 如何获取从单独模块加载的回调函数中定义的全局定义变量的值?
- python - TypeError:函数构建代码之外的操作正在传递“图形”张量
- tkinter - Turtle 和 Tkinter 有什么区别?
- javascript - 新选项卡未在 puppeteer Node js 中打开
- kotlin - 如何将长数据类型写为kotlin中列表的索引?
- html - 如何获取具有特定类后缀的 span 元素的内容?
- android - 反应原生,生成签名的apk时出错
- python - 如何在没有类的情况下从 BeautifulSoup 中的多个跨度获取文本