2009-12-21 106 views
1

我正在创建一个体育统计数据库。有了它,我想编目许多类型的运动类型的比赛/比赛统计。例如,这个数据库可以告诉你卡罗莱纳豹队在09-10赛季(足球)获得多少达阵,或者迈阿密热火队在最后一场比赛(篮球)中有多少次罚球。属性是否可以指定一个表格而不是另一个表格?

我有麻烦叫设计相匹配的更根本的一个表。比赛表有列:(PK match_id)的发挥

  • 日期
  • 标识指的是球队的表现(FK

    • ID(play_date)team_1_performance_id和team_2_performance_id)表中的表现。

    性能表保存:

    • ID(PK perf_id
    • 团队ID(FK TEAM_ID
    • 而且最重要的是,所有其他属性,如:罢工(*)每打
    • 平均冲码(*)
    • 的号码制成的三分球(*)
    • %的

    (*)的问题是,如何才能让相关的各自的运动性能表?例如,棒球比赛有罢工,但足球和曲棍球不会(我也不会想到任何其他运动)。我不希望我的绩效表有一个罢工列,但它只与部分记录相关。

    或者我?也许我的设计应该有所不同呢?你会怎么做呢?

    现在,我不知道这是可能的,但我有一个想法是,也许包括在匹配某种性能比较表ID列是指不同的性能表。因此,当我查询比赛的表现时,它会查看特定的表格。这是这个问题的标题来自哪里(一个属性可以指定一个表而不是另一个?)。试想一下,“选择team_1_performance.strikes从匹配INNER JOIN appropriate_performance_table AS team_1_performance WHERE Matches.performance_table_id =‘棒球’”我怎么会指定appropriate_performance_table,如果这甚至可能吗?

    另一个想法是为所有运动创建比赛表,比如Rugby_Matches或Football_Matches,然后针对这些运动制定相应的表现表,如Rugby_Perfomances或Football_Performances。这看起来像很多代表有些类似的东西的表格。

    如果可以的话,尽量保持你的反应MySQL的具体。

    谢谢!

  • +0

    EAV对程序员来说是诱人的......看起来很简单,看起来很灵活......只有4张桌子,你可以存储所有东西。事实上,为什么还有其他表呢?你所有的球员都可以进去,球队也是。事实上,你制作的每个数据库,从现在开始只能容纳4个表格。您只需要一个实体列表,一个属性列表,两个属性之间的映射以及另一个属性来保存每个属性的值。一个统一所有模型的模型。 –

    回答

    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,如果你想要其余的值,像点和反对,它是整个新的一轮通过数据。

    +0

    我刚刚完成阅读http://www.simple-talk.com/opinion/opinion-pieces/bad-carma/完成了一些关于EAV的研究,就像你建议的那样。意识到我正在遵循同样的死路,这真是令人恐惧。我想你也必须根据你的其他意见阅读它。 对不起其他回答者,但是,我不会建立一个EAV。他们听起来很不错,但使用它们将是一场噩梦。阅读那篇文章,如果你不明白我的意思。 你,女士,回答最好。感谢您的宝贵意见。 –

    +0

    感谢上帝。我希望所有在这里的兰迪(请阅读上面的链接)都会停止提供这个建议。这很危险,而且很明显是错误的。 –

    1

    你的主意,以创建体育特定的表一般是要做的。

    +0

    是的,广泛不长...好计划。 –

    2

    而不是跨越,创建数据下降。

    所以,你将不得不

    性能表保存:

    • ID(PK perf_id
    • 团队ID(FK TEAM_ID
    • 性能统计类型
    • 性能统计值

    或类似的东西。

    你那么也必须创建一个规则表,将链接特定性能Stat的类型来具体运动类型

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

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

    +0

    你的答案和查尔斯布雷塔那的一样。感谢您的建议。特别是关于数据下降,没有跨越。我没有这样想,但在这种情况下,这很有意义。 –

    +0

    请不要这样做。这被称为EAV ...在本网站和其他网站上查找EAV的所有问题。考虑这个问题。去年多少球队比拦截得分更多。 –

    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

    +0

    这听起来不错!并且易于实现。谢谢! –

    相关问题