自然的倾向是按照游戏进行的顺序查看括号。您从外向内阅读传统图表。但让我们反过来想它。每场比赛在两支球队之间进行。一个赢,另一个输。
现在,它不仅仅是这个。一对特定游戏的获胜者在另一场游戏中相互对抗。因此,游戏本身之间也存在关系,无论谁在玩这些游戏。也就是说,在每场比赛(第一轮除外)中对峙的球队是前两场比赛的获胜者。
因此,您可能会注意到,每场比赛之前都有两个“子比赛”,并决定了谁在该比赛中面对。这听起来就像一棵二叉树:每个根节点最多有两个子节点。如果您知道谁赢得了每场比赛,则可以轻松确定“父”比赛中的球队。
因此,要设计一个数据库来对此进行建模,您实际上只需要两个实体:Team
和Game
. 每个Game
都有两个与其他Game
s 相关的外键。名称无关紧要,但我们会将它们建模为单独的键,以强制要求每个游戏不超过两个前面的游戏。让我们称它们为leftGame
和rightGame
,以保持二叉树命名法。同样,我们应该有一个名为parentGame
跟踪反向关系的键。
此外,正如我之前提到的,您可以通过查看前两场比赛的获胜者来轻松确定每场比赛的对手。所以你真的只需要追踪每场比赛的获胜者。所以,给Game
实体一个表的winner
外键Team
。
现在,有播种支架的小问题。也就是说,为第一轮比赛建模。您可以通过Game
为整个比赛中的每支球队建立一个模型来建模,该球队是该球队winner
并且没有之前的比赛。
因此,整体架构将是:
Game:
winner: Team
leftGame: Game
rightGame: Game
parentGame: Game
other attributes as you see fit
Team:
name
other attributes as you see fit
当然,您可以将您想要的所有其他信息添加到实体中:位置、分数、结果(以防游戏因没收或其他异常情况而获胜)。