Rails 3 - ActiveRecord, что более эффективно (обновление против счета)? - PullRequest
3 голосов
/ 04 сентября 2011

Хорошо, допустим, у меня есть 2 разные модели:

  1. Опрос (has_many: голоса)
  2. Голосование (принадлежит_:опрос)

Итак, один опрос может иметь много голосов.На данный момент я показываю список всех опросов, включая его общее число избирателей в поле.Каждый раз, когда кто-то голосует за опрос, я собираюсь обновлять общее количество голосов в конкретном опросе, используя:@poll = Poll.update(params[:poll_id], :vote_count => vote_count+1)Для извлечения count_count я использую: @poll.vote_count, который работает нормально.Допустим, я получил огромное количество опросов (в моем БД), и многие люди проголосовали бы за один и тот же опрос одновременно. Вопрос: Разве не было бы более эффективно удалить элемент voice_count из таблицы опроса и использовать:@vote_count = Poll.find(params[:poll_id]).votes.countдля получения общего voice_count вместо этого?Какая операция (обновление или подсчет) будет иметь больше смысла в этом случае?(Я использую postgresql в производстве)

Спасибо за помощь!

Ответы [ 3 ]

4 голосов
/ 04 сентября 2011

Рассматривали ли вы использовать кеш счетчика (см. Параметр counter_cache) ?Rails имеет эту встроенную функциональность для обработки всех возможных обновлений ассоциации и того, как это повлияет на счетчик.

Это так же просто, как добавить инициализированный целочисленный столбец 0 с именем #{attribute.pluralize}_count (в вашем случае votes_count) в таблице от одной ко многим сторонам ассоциации (в вашем случае опрос).

А затем на другой стороне ассоциации добавьте аргумент :counter_cache => true в оператор принадлежности.

belongs_to :poll, :counter_cache => true

Теперь это не дает точного ответа на ваш вопрос, и правильный ответ будет зависеть от формы ваших данных и настроенных вами индексов.Если вы ожидаете, что ваша таблица голосов будет исчисляться миллионами, разбросанными по тысячам опросов, тогда используйте счетчик кэша, в противном случае просто подсчитайте ассоциации.

1 голос
/ 04 сентября 2011

Это большой вопрос, поскольку он затрагивает фундаментальную проблему хранения сводной и сводной информации.

Как правило, это не очень хорошая идея, так как вещи могут легко потерять синхронизацию по мере роста систем.

Иногда бывают случаи, когда вам нужна сводная информация, но это более специализированные случаи, такие как открытые для чтения базы данных, которые используются только для отчетов и обновляются один раз в день в полночь.
В этих случаях сводные сводные отчетыне только хорошо, но и предпочтительнее, чем повторный расчет сводной / сводной информации, который в противном случае был бы сделан с каждым запросом.Это также будет зависеть как от использования, так и от размера, например, если есть 300 запросов в день (по сравнению с базой данных, обновляемой один раз в день, только для чтения), и все они должны вычислять одинаковые итоги, и каждый запрос читает 20 000 строк, это большеэффективно сделать это один раз и сохранить этот расчет.Поскольку данные и запросы растут, это может быть единственным практическим способом предоставления сложных отчетов.

0 голосов
/ 04 сентября 2011

Для меня не имеет смысла в таком простом случае использовать элемент voice_count в опросе. Подсчет строк действительно быстрый, и если вы добавите голос и забудете увеличить значение элемента_счета, данные будут разбиты ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...