Обновление большого количества записей - оптимизация производительности

У меня есть инструмент для бейсбола, который позволяет пользователям анализировать статистику ударов игрока за прошлые периоды. Например, сколько ударов у A-Rod за последние 7 дней в ночное время? Я хочу расширить временные рамки, чтобы пользователь мог анализировать статистику ударов игрока до 365 дней. Однако для этого требуется серьезная оптимизация производительности. Вот мой текущий набор моделей:

class AtBat < ActiveRecord::Base
  belongs_to :batter
  belongs_to :pitcher
  belongs_to :weather_condition

  ### DATA MODEL ###
  # id
  # batter_id
  # pitcher_id
  # weather_condition_id
  # hit (boolean)
  ##################
end

class BattingStat < ActiveRecord::Base
  belongs_to :batter
  belongs_to :recordable, :polymorphic => true # e.g., Batter, Pitcher, WeatherCondition

  ### DATA MODEL ###
  # id
  # batter_id
  # recordable_id
  # recordable_type
  # hits7
  # outs7
  # at_bats7
  # batting_avg7
  # ...
  # hits365
  # outs365
  # at_bats365
  # batting_avg365
  ##################
end

class Batter < ActiveRecord::Base
  has_many :batting_stats, :as => :recordable, :dependent => :destroy
  has_many :at_bats, :dependent => :destroy
end

class Pitcher < ActiveRecord::Base
  has_many :batting_stats, :as => :recordable, :dependent => :destroy
  has_many :at_bats, :dependent => :destroy
end

class WeatherCondition < ActiveRecord::Base
  has_many :batting_stats, :as => :recordable, :dependent => :destroy
  has_many :at_bats, :dependent => :destroy
end

Чтобы сохранить разумную длину моего вопроса, позвольте мне рассказать, что я делаю для обновления таблицы batting_stats вместо копирования кучи кода. Начнем с 7 дней.

  1. Получить все записи at_bat за последние 7 дней.
  2. Итерировать по каждой записи at_bat…
  3. Для данной записи at_bat, взять связанный тестирующий элемент и связанное с ним weather_condition, найти правильную запись batting_stat (BattingStat.find_or_create_by_batter_and_recordable (batter, weather_condition), затем обновите запись batting_stat.
  4. Повторите шаг 3 для жидкого теста и кувшина (записываемые).

Шаги 1-4 повторяются и для других периодов времени - 15 дней, 30 дней и т. Д.

Теперь я представляю, насколько трудоемким было бы запускать сценарий каждый день для внесения этих обновлений, если бы я расширить периоды времени с 7/15/30 до 7/15/30/45/60/90/180/365.

Итак, мой вопрос: как вы подойдете к тому, чтобы это работало с максимальной производительностью?

6
задан Trott 24 November 2011 в 23:15
поделиться