正确建立关系数据库中的体育统计模型

时间:2009-07-23 03:23:29

标签: sql database-design

我正在尝试在PostGreSQL中对足球统计数据进行建模,但我有一些有效的东西,但感觉并不是很正确。这是问题所在:

我有团队,游戏和统计数据。每场比赛都有两支球队。每支球队都有一条进攻统计线,可能包括冲球,传球等等。但是,这种进攻性数据隐含着其他球队的防守数据,例如:如果进攻球队在对阵防守球队的比赛中有100码冲球,则防守球队会放弃100码冲球。跟踪进攻和防守统计数据非常重要。

我目前的模型有FootballTeam,FootballGame,FootballStat和FootballTeamStat作为FootballTeam和FootballStat之间的链接表。 FootballStat拥有FootballGame的外键。 FootballTeamStat有两个外键,一个用于FootballTeam,另一个用于FootballStat。它还有一个StatTypeId,它是攻击性或防御性的标志。通过这样做,我可以避免在FootballStat中有很多冗余,否则我必须有两行用于相同的统计数据,但其中一行具有攻击性标志,另一行具有防御性标志。

这在我目前的应用程序中非常有效,但它从未感觉完全正确。有一个更好的方法吗?我的数据库建模经验几乎仅限于我在阅读数据库设计之后我自己完成的项目,虽然这似乎跟随我的大多数经验,但我不确定这是最好的方法。

编辑:更新以使其成为通用而非联盟特定。

4 个答案:

答案 0 :(得分:0)

你走在正确的轨道上,我只是建议更好地命名表格。 FootballStat和FootballTeamStat读作包含有和没有Team上下文的统计信息。以下是我根据您的帖子指定的内容:

TEAM-STATISTICS-CATEGORY-CODE

  • CODE
  • 说明
IE:DEF:防守,OFF:进攻性


TEAM-STATISTICS-TYPE-CODE

  • TEAM-STATISTICS-TYPE-CODE-ID
  • CODE(FK:TEAM-STATISTICS-CATEGORY-CODE)
  • 说明

IE:1,OFF,Rushing


TEAM

  • TEAM-ID(pk)

TEAM-统计

  • TEAM-STATISTICS-ID
  • TEAM-ID
  • GAME-ID
  • TEAM-STATISTICS-TYPE-CODE-ID(FK:团队统计类型代码)
  • VALUE

IE:1,1,1,100

我意识到进攻和防守数据非常重要,但是如果一个数据总是与进攻和防守相关联 - 那么你只能记录进攻数据和进攻数据。使用SQL来计算防御性的。 IE:如果100码的进攻冲击意味着100码的防守损失,您是否可以从存储防御信息中受益,或者您是否应该在数据库中创建映射以便您可以通过查询或查看来反转值?


GAME

  • GAME-ID
  • HOME-TEAM-ID
  • AWAY-TEAM-ID
  • HOME-SCORE
  • AWAY-SCORE

答案 1 :(得分:0)

嗯,另一种方法是摆脱FootballTeamStat。

相反,在FootballStat中添加两列:

  • OffensiveTeam
  • DefensiveTeam

您还需要一个约束来保证OffensiveTeam!= DefensiveTeam,并且您必须扫描两次表来计算团队的统计数据。但你确实节省了几个连接。

答案 2 :(得分:0)

您可以避免两次存储统计信息。实际上,您应该避免这种情况,因为即使您在插入操作之前执行了所有正确的验证,也可能通过更新操作导致数据不一致。您可以在teamstats和团队之间建立多种关系

TeamStats(stat, OffensiveTeamID, DefensiveTeamID)

示例行

Insert into TeamStats('100 yards rushing', 'Team A', 'Team B')

在这种情况下,A队的进攻速度为100码,B队的防守为100码。您需要使OffensiveTeamID和DefensiveTeamID NOT NULL列。

答案 3 :(得分:0)

只要每个游戏都由数据库中的两个团队进行游戏,那就可以了。
但是你会有一个只有一个团队在数据库中的游戏吗?