【问题标题】:SQL table design for sports stats体育统计数据的 SQL 表设计
【发布时间】:2014-05-01 10:24:56
【问题描述】:

我正在尝试创建一个数据库架构,我可以在其中存储体育联盟的统计数据,其中每场比赛都有球队统计数据。

我有以下:

Home Team | Away Team | Venue | Home stat #1 | Away stat #1 | Home stat #2 | Away stat #2 | ... | Home stat #n | Away stat #n

有不止两个统计数据。例如,一项统计数据可能是进球数,一项数据可能是射门次数。主队和客队都记录了相同类别的统计数据,但它们不相关(例如,无法通过知道客队进球数来找到主队进球数)。

存储它的最佳架构是什么?

此刻,我在想:

Teams(TeamID, TeamName)
Venues(VenueID, VenueName)
Games(GameID, HomeTeamID, AwayTeamID, VenueID)
Stats(GameID, TeamID, Stat#1, Stat#2, ... , Stat#n) 

这避免了在不同的列中复制主队和客队的每个统计数据,如果我想在“比赛”表中包含所有内容,我必须这样做。我不确定这个良好的架构设计是否并且希望得到任何反馈。

【问题讨论】:

  • 您当前的设计看起来不错。你有多少个Stat 字段?以后还会添加更多吗?
  • 我目前有 18 个统计数据,以后不打算再添加,但我想这是可能的。
  • 我只是想检查一下您不会经常添加统计信息,在这种情况下,最好将它们存储为行数据。最好将统计信息作为表格字段。

标签: sql database-design database-schema


【解决方案1】:

为了实际回答您的问题,而不仅仅是评论,这里有一些额外的想法。

根据您的描述,您的表格是这样的:

就我个人而言,我尽可能多地使用自然键,但我可以看到在这种情况下,Games 表最终会得到一个组合键 home_team_idaway_team_idvenue_id 和一个额外的game_date 以确保游戏行是唯一的。

这会产生连锁反应,即在Stats 表中需要大量外键;所以坚持使用代理键。

使用代理game_id 意味着可以创建重复的游戏,因此在home_team_idaway_team_idvenue_id 和(附加字段)game_date 上添加一个唯一索引 .这样你的设计就更简单了,但仍然可以防止重复。

正如我在评论中所说,如果您打算添加更多统计信息,或者经常添加它们,最好将它们设为行数据,以避免过于频繁地更新模型并不得不重写您的查询。如果您遇到这种情况,请发布另一个问题:)

【讨论】:

  • 谢谢托尼,非常彻底的回答!
  • 有人建议对我的回答进行编辑,说图中的“PF”可能是错字。澄清一下,我用来创建图表的软件用“PK”表示主键,用“FK”表示外键,用“PF”表示主/外键。在Stats 表中,game_idteam_id 形成一个复合主键,同时也是GamesTeams 表的外键。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
相关资源
最近更新 更多