2011-01-30 6 views
2

私はすべての私の友人と私のゴルフスコアを格納するデータベースを設計しようとしています。ご存じのように、ゴルフスコアは18ホールの個人スコアで構成されています。 、テーブルは他のテーブルを参照FKのplayer_id、round_idとCourse_IDにを有し、各穴(H18に例えばH1)のための1つのカラムを持つテーブルを作成ゴルフスコアを保存するためのスケーラブルなデータベーススキーマを作成

  1. :私はスキーマを設計するには、2つの方法を考えることができます。それには列h1〜h18の合計である合計列があります。穴のスコアを変更すると、私は手動で合計列を更新する必要があります。

  2. ホールスコアの列、ホールインデックスの列、player_id、course_id、およびround_idの列を持つテーブルを作成します。ラウンドの合計スコアを取得するには、round_id、player_idでSUMクエリを実行する必要があります。

今のところ、データベースには20人未満のスコアが格納される可能性があるため、どちらのアプローチでも問題ありません。しかし、私が2万人の人々のためにスコアを保存したいのであれば、アプローチはよりスケーラブルですか?

私はPHP5でMySQL 5を使用しています。ありがとう。

Update>クエリの例: 1.すべてのプレイヤーから9/18得点を読んで、スコアカードを作成します。 2.最後のXラウンドのプレイヤーの最低/平均/最高合計スコアのような基本統計。 3.最後のX回のホールの平均得点などの高度な統計。

+0

も明白なことは、第二のアプローチが起こっているということです各round_idには各穴に対応する18個の行があるため、行数は18xになります。しかし、私はそれが本当にあなたがどのようにデータを照会しているかにかかっていると思います。 –

+0

情報へのアクセス方法に関する質問を少し更新してもらえますか?これにより、より良い答えが得られます。 – christophmccann

+0

20,000人のユーザーのためにスコアを格納することを含むデータベースほど小さいデータベースであれば、最も簡単な方法はコード作成が最も簡単です。スコアが20万であれば、同じことをします。 20,000,000点のスコアがある場合は、パフォーマンスについて心配する必要があります。間のどこかに、心配する場所があります。 –

答えて

2

ゴルフのルールはあまり頻繁に変更されないため、2番目のアプローチは私の好みですが、この場合は最初のデザインが有効です。合計列は、選択する場合は、トリガーを使用して計算できます。

ただし、あなたとあなたの友人が9ホールまたは36ホールのラウンドに行くことを決めた場合は、その状況を処理する必要があります。追加のホール情報を保存する方法についても問題があります。プレーヤが演奏する各ホールの行を持つ別々のテーブルを持つスキーマは、保守がずっと簡単です。

常に最良の解決策は、データの使用、更新、およびクエリの方法に依存します。唯一のユースケースでは合計スコアとハイスコアを表示する必要がある場合、最初のアプローチが有効です。

特定のホールに関連する情報を処理するユースケースが発生すると、アプリケーションコードやSQLは、書き込みやメンテナンスが難しくなります。たとえば、すべての試合の特定のホールの平均スコアを取得します。

どちらの場合でも、別のテーブルに2番目の選択肢と1穴あたりのスコアを格納することをおすすめします。同じテーブルにすべてのスコアを持たせることのパフォーマンス上の利点は、おそらくそれを維持し、クエリを書くことによる問題より重要ではありません。

+0

ありがとうございます。私は9番ホール、18ホール、27ホールのラウンドが可能なので、アプローチ#2にも傾いていました。固定された27列テーブルは、このような状況に対処するための醜い方法です。 – azgolfer

4

私の平均、最高、最低スコアは?

シナリオ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となるだろう

シナリオ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) 

:)

関連する問題