代表NCAA男子篮球支架的最佳数据库架构是什么?如果你不熟悉,这里有一个链接:http://www.cbssports.com/collegebasketball/mayhem/brackets/viewable_men
我可以看到几种不同的方式来建模这些数据,包括单个表,许多表,硬编码列,有些动态方式等.您需要一种方法来模拟每个团队所处的种子和位置,以及每个游戏和每个人的结果(可能得分).您还需要一种方式来表示谁在比赛的哪个阶段比赛谁.
本着疯狂三月的精神,我认为这是一个很好的问题.这里有一些明显的答案,这个问题的主要目标是看到你能够回答它的所有不同方法.哪种方式最好可能对您正在使用的语言具有主观性,或者您使用它的确切程度如何,但尝试保持答案与数据库无关,语言无关且相当高级别.如果有人对更好地说出这个问题有任何建议或更好的方法来定义它,请在评论中告诉我.
自然倾向是按照游戏顺序查看括号.你从外面阅读传统的图表.但是让我们反过来想一想.每场比赛都在两队之间进行.一个赢了,另一个输了.
现在,除此之外还有更多内容.一对特定游戏的获胜者在另一场比赛中相互对峙.因此,无论谁在这些游戏中玩游戏,游戏本身之间也存在关系.也就是说,在每场比赛中面对的球队(第一轮除外)是两场早期比赛的获胜者.
所以你可能会注意到每个游戏都有两个"儿童游戏",它们在游戏之前确定面对谁.这听起来就像二叉树:每个根节点最多有两个子节点.如果你知道谁赢了每场比赛,你可以很容易地确定"父"游戏中的球队.
因此,要设计一个数据库来对其进行建模,您实际上只需要两个实体: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
当然,您可以将您想要的所有其他信息添加到实体中:位置,分数,结果(如果游戏是通过没收或其他一些不同寻常的条件赢得的).
对于RDBMS,我认为仍然足够灵活以适应大多数情况的最简单方法是执行以下操作:
团队有[team-id(PK)],[name],[region-id(FK to Regions)],[initial-seed].每个团队您将有一个条目.(区域表是一个简单的代码表,只有四个条目,每个NCAA区域一个,这里没有列出.)
参与者有[游戏ID(FK到游戏)],[团队ID(FK到团队)],[得分(可空)],[结果].[得分]可以为空,以反映一支球队可能会被没收.每场比赛通常会有两名参赛者.
游戏有[游戏ID(PK)],[日期],[位置].要了解哪些球队参加了比赛,请在参与者表格中查找相应的游戏ID.(请记住,如果有人退学或被取消资格,可能会有两个以上的球队.)
要设置初始括号,请将相应的种子相互匹配.在玩游戏时,请注意哪个团队的结果=特定游戏的获胜者 ; 这支球队与另一场比赛的胜利者相匹配.填写括号,直到没有更多的获胜队伍离开.