2009-12-21 105 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

    這聽起來不錯!並且易於實現。謝謝! –

    相關問題