簡體   English   中英

創建可伸縮的數據庫架構以存儲高爾夫分數

[英]Create a scalable database schema for storing golf scores

我正在設計一個數據庫來存儲我所有的朋友和我的高爾夫比分。 您可能知道,高爾夫球得分由18洞個人得分組成。 我可以想到兩種設計架構的方法:

  1. 創建一個每個孔有一列的表(例如h1到h18),該表有FK player_id,round_id和引用其他表的course_id。 它有一個總列,它是列h1到h18的總和。 如果我更改了一個得分,我將需要手動更新總列數。

  2. 創建一個表,其中包含用於孔得分的列,用於孔索引的列,用於player_id的列,course_id和round_id。 要獲得一輪的總分,我需要在round_id,player_id上進行SUM查詢。

目前,數據庫可能會存儲少於20人的分數,因此任何一種方法都應該沒問題。 但是,如果我想為20,000人存儲分數,哪種方法更具可擴展性呢?

我正在使用MySQL 5,PHP5。 謝謝。

更新>查詢示例:1。閱讀所有玩家的9/18分數並建立記分卡。 2.基本統計數據,例如查找最后X輪的玩家的最低/平均/最高總得分。 3.更高級的統計數據,比如最后X輪的任何球洞的平均得分。

我的平均分,最高分和最低分是多少?

場景1。

select (h1+h2+h3+h4+h5+h6+h7+h8+h9+h10+h11+h13+h14+h15+h16+h17+h18) / 18 as avg_score
      ,greatest(h1,h2,h3,h4,h5,h6,h7,h8,h9,h10,h11,h12,h13,h14,h16,h17,h18) as highest
      ,least(h1,h2,h3,h4,h5,h6,h8,h8,h9,h10,h11,h12,h13,h14,h16,h17,h18) as lowest
  from scores
 where player_id = 1;

select avg(score) as avg_score
      ,max(score) as highest
      ,min(score) as lowest
  from scores
 where player_id = 1;

哪個洞最差?

情景2。

select case when h1 = greatest(h1,h2,h3,h4,h5,h6,h8,h8,h9,h10,h11,h12,h13,h14,h16,h17,h18)  then 'H1'
            when h2 = greatest(h1,h2,h3,h4,h5,h6,h8,h8,h9,h10,h11,h12,h13,h14,h16,h17,h18)  then 'H2'
            when h3 = greatest(h1,h2,h3,h4,h5,h6,h8,h8,h9,h10,h11,h12,h13,h14,h16,h17,h18)  then 'H3'
            when h4 = greatest(h1,h2,h3,h4,h5,h6,h8,h8,h9,h10,h11,h12,h13,h14,h16,h17,h18)  then 'H4'
            when h5 = greatest(h1,h2,h3,h4,h5,h6,h8,h8,h9,h10,h11,h12,h13,h14,h16,h17,h18)  then 'H5'
            when h6 = greatest(h1,h2,h3,h4,h5,h6,h8,h8,h9,h10,h11,h12,h13,h14,h16,h17,h18)  then 'H6'
            when h7 = greatest(h1,h2,h3,h4,h5,h6,h8,h8,h9,h10,h11,h12,h13,h14,h16,h17,h18)  then 'H7'
            when h8 = greatest(h1,h2,h3,h4,h5,h6,h8,h8,h9,h10,h11,h12,h13,h14,h16,h17,h18)  then 'H8'
            when h9 = greatest(h1,h2,h3,h4,h5,h6,h8,h8,h9,h10,h11,h12,h13,h14,h16,h17,h18)  then 'H9'
            when h10 = greatest(h1,h2,h3,h4,h5,h6,h8,h8,h9,h10,h11,h12,h13,h14,h16,h17,h18) then 'H10'
            when h11 = greatest(h1,h2,h3,h4,h5,h6,h8,h8,h9,h10,h11,h12,h13,h14,h16,h17,h18) then 'H11'
            when h12 = greatest(h1,h2,h3,h4,h5,h6,h8,h8,h9,h10,h11,h12,h13,h14,h16,h17,h18) then 'H12'
            when h13 = greatest(h1,h2,h3,h4,h5,h6,h8,h8,h9,h10,h11,h12,h13,h14,h16,h17,h18) then 'H13'
            when h14 = greatest(h1,h2,h3,h4,h5,h6,h8,h8,h9,h10,h11,h12,h13,h14,h16,h17,h18) then 'H14'
            when h15 = greatest(h1,h2,h3,h4,h5,h6,h8,h8,h9,h10,h11,h12,h13,h14,h16,h17,h18) then 'H15'
            when h16 = greatest(h1,h2,h3,h4,h5,h6,h8,h8,h9,h10,h11,h12,h13,h14,h16,h17,h18) then 'H16'
            when h17 = greatest(h1,h2,h3,h4,h5,h6,h8,h8,h9,h10,h11,h12,h13,h14,h16,h17,h18) then 'H17'
            when h18 = greatest(h1,h2,h3,h4,h5,h6,h8,h8,h9,h10,h11,h12,h13,h14,h16,h17,h18) then 'H18'
        end as hole_highest_score      
  from scores
 where player_id = 1;

select hole, score
  from scores s1
 where player_id = 1
   and score = (select max(score)
                  from scores s2
                 where s2.player_id = s1.player_id)

我會隨時使用方案2 :)

盡管第二種方法是我的首選方法,但由於高爾夫規則可能不會經常改變,因此第一種設計可能適用於這種情況。 如果您選擇使用sum列,則可以使用觸發器計算sum列。

但是,當你和你的朋友決定進入9洞或36洞的比賽時,你必須處理這種情況。 如果有任何問題,還存在如何存儲額外的每洞信息的問題。 具有單獨表格的模式將為玩家所玩的每個洞提供一行,這將更容易維護。

與往常一樣,最佳解決方案取決於您將如何使用,更新和查詢數據。 如果您的唯一用例涉及顯示總分和高分,則第一種方法可行。

一旦用例處理與特定漏洞相關的信息,您的應用程序代碼和/或SQL就會更難編寫和維護。 比如獲得所有比賽的特定洞的平均得分。

在任何情況下,我建議使用第二個替代方案並在單獨的表中存儲每孔分數。 在同一個表中獲得所有分數的性能優勢可能不會超過維護它並向其編寫查詢的麻煩。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM