关系代数的除法运算
Division Operation on Relational Algebra
我有这个架构:
CLUB(Name, Address, City)
TEAM(TeamName, club)
PLAYER(Badge, teamName)
MATCH(matchNumber, player1, player2, club, winner)
- TEAM 中的俱乐部 引用 CLUB[=45 中的 Name =];
- teamName in PLAYER references TeamName in TEAM;
- 玩家 1,玩家 2,获胜者 在 MATCH 参考 Badge 在 [=31] =]玩家;
- MATCH 中的 引用了 CLUB[=45 中的 Name =];
一名球员只能加入一支球队。比赛可以在队友之间进行。一支球队只能有一个俱乐部。
我需要做这个代数关系:
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
的一个子集(不一定是正确的)。为什么?
注意关系 PlayednWonAll
或 PlayednBeatAll
,结果中可能有很多玩家:安娜赢得了她参加的每一场比赛;芭芭拉也是。怎么会?因为安娜从未扮演过芭芭拉;没有总冠军。在 PlayednBeatAll
的情况下,这意味着 Anna 和 Barbara 扮演了除彼此之外的所有人。
PlayednWonAll
和PlayednBeatAll
有什么区别?卡拉只打了一场比赛,对阵唐娜,卡拉赢了。 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.
我有这个架构:
CLUB(Name, Address, City)
TEAM(TeamName, club)
PLAYER(Badge, teamName)
MATCH(matchNumber, player1, player2, club, winner)
- TEAM 中的俱乐部 引用 CLUB[=45 中的 Name =];
- teamName in PLAYER references TeamName in TEAM;
- 玩家 1,玩家 2,获胜者 在 MATCH 参考 Badge 在 [=31] =]玩家;
- MATCH 中的 引用了 CLUB[=45 中的 Name =];
一名球员只能加入一支球队。比赛可以在队友之间进行。一支球队只能有一个俱乐部。
我需要做这个代数关系:
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
的一个子集(不一定是正确的)。为什么?
注意关系 PlayednWonAll
或 PlayednBeatAll
,结果中可能有很多玩家:安娜赢得了她参加的每一场比赛;芭芭拉也是。怎么会?因为安娜从未扮演过芭芭拉;没有总冠军。在 PlayednBeatAll
的情况下,这意味着 Anna 和 Barbara 扮演了除彼此之外的所有人。
PlayednWonAll
和PlayednBeatAll
有什么区别?卡拉只打了一场比赛,对阵唐娜,卡拉赢了。 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.