体育统计数据的 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_id
、away_team_id
、venue_id
和一个额外的game_date
以确保游戏行是唯一的。
这会产生连锁反应,即在Stats
表中需要大量外键;所以坚持使用代理键。
使用代理game_id
意味着可以创建重复的游戏,因此在home_team_id
、away_team_id
、venue_id
和(附加字段)game_date
上添加一个唯一索引 .这样你的设计就更简单了,但仍然可以防止重复。
正如我在评论中所说,如果您打算添加更多统计信息,或者经常添加它们,最好将它们设为行数据,以避免过于频繁地更新模型并不得不重写您的查询。如果您遇到这种情况,请发布另一个问题:)
【讨论】:
谢谢托尼,非常彻底的回答! 有人建议对我的回答进行编辑,说图中的“PF”可能是错字。澄清一下,我用来创建图表的软件用“PK”表示主键,用“FK”表示外键,用“PF”表示主/外键。在Stats
表中,game_id
和team_id
形成一个复合主键,同时也是Games
和Teams
表的外键。以上是关于体育统计数据的 SQL 表设计的主要内容,如果未能解决你的问题,请参考以下文章
求SQL语句,一个字段中多个ID,如何对他进行对应的值替换?
代写数据库表设计代写SQL语句代做数据库项目代做MySQL数据库
2023-01-11:体育馆的人流量。编写一个 SQL 查询以找出每行的人数大于或等于 100 且 id 连续的三行或更多行记录。返回按 visit_date 升序排列 的结果表。 DROP TAB