Как внедрить систему, чтобы определить, достигнут ли этап - PullRequest
1 голос
/ 05 апреля 2010

У меня есть таблица с именем stats

player_id team_id match_date  goal assist`  
        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 голов первым, вторым, третьим ...

Я думал использовать триггеры с таблицами для накопления итогов.
Таблица Таблица 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.
Этот триггер также может проверить, достиг ли игрок или команда вехи в таблице этапов, содержащей цифры

milestone
      100
      500
     1000
      ...

Таблица player_milestone будет содержать веху, достигнутую игроком:

player_id  stat    milestone          date
        1  goal          100    2013-04-02
        1  assist        100    2012-11-19

<ч /> Есть лучший способ реализовать "веху"?
Есть самый простой способ без триггеров?

Я использую PostgreSQL

1 Ответ

3 голосов
/ 07 апреля 2010

Я бы просто посчитал все голы и голы игрока, который забивает, и команды, которая забивает.

Как на стороне клиента (в псевдокоде):

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
}

Не обслуживать таблицу этапов, поскольку это приводит к денормализации базы данных. Я думаю, что это преждевременная оптимизация. Только когда вышеприведенное действительно недостаточно быстро (например, когда статистика будет иметь более нескольких тысяч строк на player_id или team_id), вы можете подумать о поддержании таблицы этапов.

...