1

統計という名前のテーブルがあります

player_id team_id match_date ゴールアシスト`  
        1 8 2010-01-01 1 1
        1 8 2010-01-01 2 0
        1 9 2010-01-01 0 5
  ...

選手がマイルストーンに到達した時期を知りたい (例: 100 ゴール、100 アシスト、500 ゴールなど)
チームがマイルストーンに到達した時期も知りたい。
100 ゴールを最初、2 番目、3 番目に達成した選手またはチームを知りたい...

テーブルでトリガーを使用して合計を累積することを考えました。
テーブル player_accumulator (および team_accumulator) テーブルは

player_id total_goals total_assists
        1 3 6


team_id total_goals total_assists
      8 3 1
      9 0 5

行が統計テーブルに挿入されるたびに、トリガーが player_accumulator および team_accumulator テーブルを挿入/更新します。
このトリガーは、プレーヤーまたはチームが数値を含むマイルストーン テーブルのマイルストーンに到達したかどうかを確認することもできます。

マイルストーン
      100
      500
     1000
      ...

テーブル player_milestone には、プレーヤーが到達したマイルストーンが含まれます。

player_id stat マイルストーンの日付
        1 ゴール 100 2013-04-02
        1アシスト 100 2012-11-19


「マイルストーン」を実装するより良い方法はありますか?
トリガーなしで最も簡単な方法はありますか?

私はPostgreSQLを使用しています

4

1 に答える 1

3

得点した選手と得点したチームのすべてのゴールとアシストを数えるだけです。

クライアント側で次のように (疑似コードで):

function insert_stat(player_id, team_id, match_date, goals, assists)
{
  if (goals>0) {
    player_goals_before = query('select count(goal) from stats where player_id=?',player_id);
    team_goals_before = query('select count(goal) from stats where team_id=?',team_id);
  }
  if (assists>0) {
    player_assists_before = query('select count(assist) from stats where player_id=?',player_id);
    team_assists_before = query('select count(assist) from stats where team_id=?',team_id);
  }
  query("insert into stats (player_id, team_id, match_date, goal, assist)\n"
    +"values (?, ?, ?, ?, ?)", player_id, team_id, match_date, goal, assist);

  if (goals>0) {
    if ( has_milestone(player_goals_before+goals) and !has_milestone(player_goals_before) ) {
      alert("player " + player_id + " reached milestone!")
    }
    if ( has_milestone(team_goals_before+goals) and !has_milestone(team_goals_before) ) {
      alert("team " + team_id + " reached milestone!")
    }
  }
  // etc
}

データベースが非正規化されるため、マイルストーン テーブルを維持しないでください。これは時期尚早の最適化だと思います。上記が実際には十分に高速でない場合 (たとえば、stats が player_id または team_id ごとに数千行を超える場合) にのみ、マイルストーン テーブルを維持することを考えることができます。

于 2010-04-07T12:27:50.987 に答える