体育统计数据的 SQL 表设计

Posted

技术标签:

【中文标题】体育统计数据的 SQL 表设计【英文标题】:SQL table design for sports stats 【发布时间】: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 个统计数据,以后不打算再添加,但我想这是可能的。 我只是想检查一下您不会经常添加统计信息,在这种情况下,最好将它们存储为行数据。最好将统计信息作为表格字段。 【参考方案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 表的外键。

以上是关于体育统计数据的 SQL 表设计的主要内容,如果未能解决你的问题,请参考以下文章

求SQL语句,一个字段中多个ID,如何对他进行对应的值替换?

MySQL体育馆的人流量

MySQL体育馆的人流量

代写数据库表设计代写SQL语句代做数据库项目代做MySQL数据库

SQL Serever学习6——数据表2

2023-01-11:体育馆的人流量。编写一个 SQL 查询以找出每行的人数大于或等于 100 且 id 连续的三行或更多行记录。返回按 visit_date 升序排列 的结果表。 DROP TAB