Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 表示NCAA篮球支架的最佳方案_Sql_Database Design_Language Agnostic_Database Agnostic - Fatal编程技术网

Sql 表示NCAA篮球支架的最佳方案

Sql 表示NCAA篮球支架的最佳方案,sql,database-design,language-agnostic,database-agnostic,Sql,Database Design,Language Agnostic,Database Agnostic,代表NCAA男篮支架的最佳数据库模式是什么?如果您不熟悉以下链接: 我可以看到几种不同的方法可以对这些数据进行建模,包括一个表、多个表、硬编码列、动态方式等。您需要一种方法来建模每个团队的种子和位置,以及每一场比赛和每一场比赛的结果(可能还有分数)。你还需要一种方式来代表谁在比赛的哪个阶段扮演谁 本着三月疯狂的精神,我认为这将是一个好问题。这里有一些显而易见的答案,这个问题的主要目的是看看你可以用什么不同的方式来回答它。哪种方法最好可能是主观的,取决于您使用的语言或您使用它的具体方式,但请尽量保

代表NCAA男篮支架的最佳数据库模式是什么?如果您不熟悉以下链接:

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


本着三月疯狂的精神,我认为这将是一个好问题。这里有一些显而易见的答案,这个问题的主要目的是看看你可以用什么不同的方式来回答它。哪种方法最好可能是主观的,取决于您使用的语言或您使用它的具体方式,但请尽量保持答案不可知、语言不可知和相当高的水平。如果有人对如何更好地表达这个问题或如何更好地定义这个问题有任何建议,请在评论中告诉我。

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

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

  • 参与者有[游戏id(FK到游戏)]、[团队id(FK到团队)]、[得分(可为空)]、[结果]。[score]可以为空,以反映团队可能会被没收。每场比赛通常有两名参与者

  • 游戏有[游戏id(PK)],[日期],[位置]。要了解哪支球队参加了比赛,请在参与者表中查找相应的比赛id。(请记住,如果有人退出或被取消资格,可能会有两个以上的球队。)


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

由于您没有指定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
}

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

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

现在,这不仅仅是一个问题。某一对游戏的获胜者在另一场游戏中互相对决。因此,无论是谁在玩游戏,游戏本身之间也存在着某种关系。也就是说,在每场比赛中对决的球队(第一轮除外)是前两场比赛的赢家

因此,您可能会注意到,每个游戏前面都有两个“子游戏”,它们决定了游戏中的对手。这听起来很像二叉树:每个根节点最多有两个子节点。如果你知道谁赢得每场比赛,你可以很容易地确定“家长”游戏中的球队

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

另外,正如我前面提到的,你可以通过看谁赢了之前的两场比赛来很容易地确定每场比赛的对手。所以你只需要追踪每场比赛的赢家。因此,将
游戏
实体a
赢家
外键赋给
团队

现在,有一个小问题,播种支架。也就是说,为第一轮比赛建模。您可以通过在整个比赛中为每个队安排一场
比赛
,该队是
赢家
,并且之前没有比赛,来模拟这一点

因此,总体方案是:

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

Team:
    name
    other attributes as you see fit

当然,您需要将所有其他信息添加到实体中:位置、分数、结果(如果游戏是通过没收或其他异常情况赢得的)。

我创建了一个带有以下表格的小系统:

游戏:GameId、TournId、RoundId、序列、日期、VisitorId、VisitorScore、HomeId、HomeScore、WinnerId、WinnerGameId、WinnerHome(位)

预测:PredId、UserId、GameId、PredVisitorId、PredHomeId、PredWinnerId

轮数:轮号、TournId、轮号、头1、头2

团队:团队ID、TournId、团队名称、种子、MoreInfo、Url

锦标赛:锦标赛

用户:TournId,用户名


WinnerGameId将一场比赛的获胜者连接到他们的下一场比赛。WinnerHome会告诉你赢家是下一场比赛的主场还是客场。除此之外,我认为这是不言自明的。

4个表格:

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

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

括号(括号ID、用户ID、点)

拾取t -------- 1 guid PK 2 guid FK 3 bit
select [2],[3] from t where [1] = @1