代码之家  ›  专栏  ›  技术社区  ›  Ryan Guill

代表NCAA篮球架的最佳方案

  •  20
  • Ryan Guill  · 技术社区  · 16 年前

    代表NCAA男篮支架的最佳数据库模式是什么?如果您不熟悉以下链接: http://www.cbssports.com/collegebasketball/mayhem/brackets/viewable_men

    我可以看到几种不同的方法来建模这些数据,包括一张表、许多表、硬编码的列、一些动态的方法等。您需要一种方法来建模每个团队的种子和位置,以及每个游戏的结果(以及可能的得分)。您还需要一种方法来表示谁在锦标赛的哪个阶段扮演谁。

    本着三月疯狂的精神,我认为这是个好问题。这里有一些很明显的答案,这个问题的主要目标是看到所有不同的方法,你可以回答它。哪种方式最好,可能是主观的语言你正在使用或如何确切地与它合作,但尽量保持答案数据库不可知,语言不可知和相当高的水平。如果有人对这个问题有更好的表达方式或更好的定义方法有任何建议,请在评论中告诉我。

    8 回复  |  直到 11 年前
        1
  •  5
  •   John Feminella    16 年前

    对于RDBMS,我认为最简单的方法仍然足够灵活以适应大多数情况,是执行以下操作:

    • 团队 [团队ID(PK)] , [姓名] , [区域ID(FK到 区域 ) , [初始种子] . 每个小组有一个条目。(Regions表是一个普通的代码表,只有四个条目,每个NCAA区域一个,此处未列出。)

    • 参与者 [游戏ID(FK to) 游戏 ) , [团队ID(FK to) 团队 ) , [分数(可以为空)] , [结果] . [分数] 可以为空以反映团队可能会被没收。每个游戏通常有两个参与者。

    • 游戏 [游戏ID(PK)] , [日期] , [地点] . 要找出在一场比赛中哪些队参加了比赛,请在参与者表中查找适当的比赛ID。(记住,如果有人退出或被取消资格,可能会有两支以上的球队。)

    要设置初始括号,请将适当的种子相互匹配。当比赛进行时,注意哪个队 结果=获胜者 对于一个特定的比赛,这个队与另一场比赛的胜利者配对。填写括号,直到没有更多的获胜队伍。

        2
  •  10
  •   Alex    15 年前

    自然的倾向是按照游戏的顺序看一个括号。从外到内阅读传统的图表。但让我们换个角度来考虑。每场比赛都是两队之间进行的。一个赢,另一个输。

    现在,不仅仅是这个。在另一场比赛中,某一对比赛的胜利者相互对峙。所以游戏本身也有关系,不管谁在玩这些游戏。也就是说,在每场比赛中对峙的球队(第一轮除外)是前两场比赛的胜利者。

    因此,您可能会注意到,每个游戏前面都有两个“儿童游戏”,并确定在该游戏中谁将面临挑战。这听起来就像一个二叉树:每个根节点最多有两个子节点。如果你知道谁赢了每场比赛,你可以很容易地确定“家长”游戏中的球队。

    因此,要设计一个数据库来建模,您实际上只需要两个实体: Team Game . 各 游戏 有两个与另一个相关的外键 游戏 这些名字并不重要,但我们会把它们作为单独的键来建模,以强制要求每个游戏的前两个游戏都不超过两个。我们打电话给他们 leftGame rightGame 与二叉树命名法保持一致。同样,我们应该有一个名为 parentGame 这追踪的是相反的关系。

    另外,正如我前面提到的,你可以很容易地通过看谁赢了前两场比赛来确定在每场比赛中面对面的球队。所以你只需要追踪每场比赛的胜利者。所以,给 游戏 实体A winner 的外键 团队 表。

    现在,播种支架的小问题。也就是说,为第一轮比赛建模。你可以用一个 游戏 在整个比赛中,每个队都是 赢家 并且没有之前的游戏。

    因此,总体模式是:

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

    当然,你可以将你想要的所有其他信息添加到实体中:位置、分数、结果(以防游戏被没收或其他不正常的情况下赢得)。

        3
  •  2
  •   Jeremy DeGroot    16 年前

    既然你没有指定RDBMS,我会有一点不同,并且使用CouchDB方法,因为我这个周末读到了这个问题。这是我想出的代表游戏的文档结构。

    {
      "round" : 1, //The final would be round 5, and I guess Alabama St. vs. Morehead would be 0
      "location" : "Dayton, OH",
      "division": "South",
      "teams" : ["UNC", "Radford"]  //A feature of Couch is that fields like teams don't need a fixed nuber of columns.
      "winner" : "UNC"  //Showing my bias
    }
    

    一个更有趣或更完整的应用程序可能也在某个地方存储了团队、排名等数据。约翰的方法似乎很好地涵盖了这个角度。我欢迎那些对我的沙发技术更了解的人的评论。

        4
  •  2
  •   FrobozzJ    15 年前

    我用下表创建了一个小系统:

    游戏:gameid、tournid、roundid、sequence、date、visitorid、visitorscore、homeid、homescore、winnerid、winnergameid、winnerhome(位)

    预测:predid、userid、gameid、predvisitorid、predhomeid、predwinnerid

    轮次:圆形,图尔尼,圆形,头部1,头部2

    球队:teamid,tournid,gename,seed,moreinfo,url

    锦标赛:锦标赛、锦标赛

    用户:tournid,用户名

    Winnergameid将一个游戏的赢家连接到下一个游戏。winner home告诉你胜利者是下一场比赛的主场还是客场。除此之外,我认为这是非常不言自明的。

        5
  •  1
  •   Blake Taylor    15 年前

    提出模型

    Proposed ER Diagram http://img257.imageshack.us/img257/1464/ncaaer.jpg

    团队表

    我们只需要知道一个团队的名字和种子。因此,我们需要一个“团队”表来存储种子值。唯一的候选键是团队名称,所以我们将使用它作为主要的元素来保持简单。NCAA的球队名称不太可能在一场比赛中改变,也不可能包含副本,所以它应该是一把足够的钥匙。

    匹配表

    可以使用“匹配”表将团队配对到每个匹配中。“团队”的外键(fk1、fk2)将确保团队的存在,而这些值的主键将确保团队之间只有一次匹配。

    从“匹配”表到“团队”表的外键(FK4)将记录获胜者。从逻辑上讲,获胜者需要是参加比赛的两支球队中的一支。针对主键的检查约束可以确保这一点。

    一旦确定了比赛结果,就可以从小组表中检索出胜利者的种子,以便与其他胜利者的种子进行比较,以确定后续的比赛结果。这样做之后,可以将结果匹配的FK(FK3)写入确定匹配,以描述锦标赛的进度(尽管此数据可能在任何时候都可以得到)。

    游戏桌

    我还模拟了每一场比赛的比赛。一个游戏是由比赛来识别的,它是比赛的一部分,是一个序列号,基于比赛中的顺序。游戏有一个队表(fk2)的赢家。分数也可以记录在这个表中。

        6
  •  1
  •   Keith    15 年前

    4张表:

    团队 (团队、区域、种子)

    用户 (用户ID、电子邮件、blablablabla)

    支架 (括号、用户ID、点数)

    拾取 (bracketid、gameid、team、points)

    每个人提交的括号在选择表中都有63行。
    每场比赛结束后,你都会更新选择表来得分。此表中的“点数”字段对于尚未玩的游戏为空,对于错误的选择为0,对于正确的选择为正数。gameid只是一个识别用户选择范围的关键(例如:East_Round2_Game2,FinalFour_Game1)。

    括号表中的“点”列可以在每次更新pick表之后更新,以便包含该括号的点的总和。最看重的是排名,不想每次有人想看领导班子的时候再加上排名。

    您不需要保留一张包含所有实际玩过的游戏或其结果的表,只需在每次游戏后更新选择表。您甚至可以通过查看pick表中的points列来突出显示正确/错误的pick。

        7
  •  1
  •   Daniel Patrick    11 年前

    在跟踪大量不同等级的预测时:您可以使用67位来跟踪每个游戏的结果。(也就是说,在锦标赛中的67场比赛中,每一场都有一点代表性,1=“A队获胜”,0=“B队获胜”)。要显示任何给定的括号,可以使用非常简单的函数将67位映射到UI。函数知道团队名称及其初始位置,然后在跟踪“bitboard”时通过括号跟踪他们的移动。

        8
  •  -4
  •   Shawn    15 年前

    我对所有数据库使用相同的模式。

    t
    --------
    1 guid PK
    2 guid FK
    3 bit
    

    然后在我的代码中:

    select [2],[3] from t where [1] = @1
    

    @1是我正在获取的数据的ID。如果[2]不为空,我再次选择,将@1设置为[2]。

    这使得很容易模拟你发布的情况。

    推荐文章