sql - 代表 NCAA 篮球赛的最佳模式

标签 sql database-design language-agnostic database-agnostic

代表 NCAA 男子篮球分组的最佳数据库模式是什么?如果您不熟悉,请点击以下链接:http://www.cbssports.com/collegebasketball/mayhem/brackets/viewable_men

我可以看到几种不同的方法可以对这些数据进行建模,使用单个表、多个表、硬编码列、动态方式等。您需要一种方法来对每个团队所处的种子和位置进行建模,以及每场比赛和每场比赛的结果(可能还有得分)。您还需要一种方法来表示谁在锦标赛的哪个阶段与谁比赛。

本着疯狂三月的精神,我认为这是一个很好的问题。这里有一些明显的答案,这个问题的主要目标是看看你可以回答它的所有不同方式。哪种方式最好可能取决于您所使用的语言或您使用它的具体方式,但请尽量保持答案与数据库、语言无关并且保持相当高的水平。如果有人对更好的表达这个问题的方式或更好的定义它的方式有任何建议,请在评论中告诉我。

最佳答案

人们自然倾向于按照比赛进行的顺序查看括号。您从外到内阅读传统的图表。但让我们反过来想一下。每场比赛都在两队之间进行。一胜一败。

现在,还有更多的事情要做。特定两场比赛的获胜者将在另一场比赛中对阵。因此,游戏本身之间也存在着某种关系,无论谁在玩这些游戏。也就是说,每场比赛(第一轮除外)中对阵的球队是前两场比赛的获胜者。

因此,您可能会注意到,每个游戏之前都有两个“子游戏”,并决定谁在该游戏中对阵。这听起来就像一棵二叉树:每个根节点最多有两个子节点。如果您知道每场比赛谁获胜,您可以轻松确定“父”比赛中的球队。

因此,要设计一个数据库来对此进行建模,您实际上只需要两个实体:TeamGame。每个Game都有两个与其他Game相关的外键。名称并不重要,但我们会将它们建模为单独的键,以强制执行每个游戏不超过两个先前游戏的要求。我们将它们称为 leftGamerightGame,以与二叉树命名法保持一致。同样,我们应该有一个名为 parentGame 的键来跟踪反向关系。

此外,正如我之前提到的,您可以通过查看前两场比赛的获胜者来轻松确定每场比赛中对阵的球队。所以你实际上只需要跟踪每场比赛的获胜者。因此,为 Game 实体提供一个指向 Team 表的 winner 外键。

现在,有一个小问题,就是播种括号。也就是说,对第一轮比赛的比赛进行建模。您可以通过为整个比赛中的每个团队进行一场游戏来建模,该团队是获胜者并且没有之前的比赛。

因此,总体架构将是:

Game:
    winner: Team
    leftGame: Game
    rightGame: Game
    parentGame: Game
    other attributes as you see fit

Team:
    name
    other attributes as you see fit

当然,您可以将所需的所有其他信息添加到实体中:位置、分数、结果(如果游戏因放弃或其他异常情况而获胜)。

关于sql - 代表 NCAA 篮球赛的最佳模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/650182/

相关文章:

mysql - 使用来自其他 MySQL 表的数据填充 MySQL 表

database - 支付交易设计的重复金额列

database - PostgreSQL Schemas -- 使用场景/案例

language-agnostic - 通常在 URL 中始终散列唯一标识符是个好主意吗?

mysql - SQL 中两个表的交集

mysql - 如何查询多行的平均时差?

sql - 具有额外属性的记录 : sparse table or EAV?

algorithm - 二叉树的排列

算法:找到一条直线的峰值

mysql - 转向 SQL Access