属性可以指定一个表而不是另一个表吗?

时间:2009-12-21 14:12:26

标签: sql mysql database database-design rdbms

我正在创建一个体育统计数据库。有了它,我想为许多类型的运动编制游戏/比赛统计数据。例如,这个数据库可以告诉你卡罗莱纳黑豹队在09-10赛季(足球)的得分有多少,或者迈阿密热火在上一场比赛(篮球)中有多少次罚球。

我在设计一个名为Matches的更基础的表时遇到了麻烦。 Matches表包含以下列:

  • ID(PK match_id
  • 比赛日期( play_date
  • ID表格中表示团队的表现(FK team_1_performance_id team_2_performance_id )。

表演表格包含:

  • ID(PK perf_id
  • 团队ID(FK team_id
  • 最重要的是,所有其他统计数据如:罢工次数(*)
  • 每场比赛平均冲码数(*)
  • 三分球命中率(*)

(*)问题是,如何使表演表与各自的运动相关?例如,棒球比赛有罢工,但足球和曲棍球没有(我也没想过任何其他运动)。我不希望我的Performance表有一个strikes列,当它只与一部分记录相关时。

还是我?也许我的设计应该是不同的?你会怎么做?

现在,我不知道这是否可行,但我有一个想法是在Matches中包含一些引用不同性能表的性能表ID列。因此,当我查询比赛的表现时,它会查看特定的表格。这就是这个问题的标题来自(属性可以指定一个表而不是另一个表吗?)。想象一下“SELECT team_1_performance.strikes FROM Matches INNER JOIN proper_performance_table AS team_1_performance WHERE Matches.performance_table_id ='Baseball'”我怎样才能指定proper_performance_table,如果可能的话?

我的另一个想法是为所有运动创建匹配表,如Rugby_Matches或Football_Matches,然后为Rugby_Perfomances或Football_Performances这些运动创建各自的表。这看起来好像很多表代表相似的东西。

如果可以的话,请尽量保持MySQL特定的响应。

谢谢!

4 个答案:

答案 0 :(得分:2)

而不是交叉,创建数据下降。

所以你会有

表演表格包含:

  • ID(PK perf_id
  • 团队ID(FK team_id
  • 效果统计类型
  • 效果统计值

或类似的东西。

然后,您还必须创建一个规则表,该表将特定的性能统计类型链接到特定的体育类型

这样,您还可以轻松添加新的性能统计类型,而不会对数据库架构产生重大影响。

您也可以实施展示订单,甚至可以根据需要显示分组。

答案 1 :(得分:2)

创建“指标”(或“统计”)表,用于定义您要衡量的不同内容。

  Table Metrics
    MetricId int,
    MetericName (Runs Batted In, Touchdowns, FreeThrows, etc.)
    MetricAbbreviation Nullable?
    Sport (That Metric belongs to )

然后您的MatchStatistics表将具有

  Table MatchStatistics
    MatchId   
    MetricId
    MetricValue Decimal

此表上的PK为MatchId和MetricId。 你也可以有一个类似的PlayerStatistics表,除了它有PlayerId而不是MatchId

答案 2 :(得分:1)

您创建体育专用表的想法通常是做什么的。

答案 3 :(得分:0)

如果你跟Astander一起在这里查询你需要获得卡罗莱纳州的所有胜利,当得分更多的达阵然后拦截。

如果你以正确的方式,在列中,你会看到

SELECT * FROM Football_stats  fs
WHERE fs.team_fk = (something that resolves to Carolina)
fs.outcome = 'Win' And fs.touchdowns > fs.interceptions

在EAV世界中你会得到

SELECT game_id FROM football_stats WHERE fs.team_fk = [Carolina] and stat_type = 'Outcome' and stat_value = 'Wins')
INTERSECT
SELECT game_ID FROM 
  (SELECT game_id, stat_value FROM football_stats WHERE fs.team_fk = [Carolina] and stat_type = 'Touchdown' ) tds,
  (SELECT game_id, stat_value FROM football_stats WHERE fs.team_fk = [Carolina] and stat_type = 'Interceptions') ints
WHERE
  tds.stat_value > ints.stat_value

所有这一切都是给你一个满足查询的game_id列表,如果你想要其余的值,比如赞成和反对,那么它就是数据的全新轮次。