性能更差:添加新列,或将现有列添加到一起?

时间:2015-02-07 00:34:25

标签: ruby-on-rails ruby performance ruby-on-rails-4 load

我有一个评论系统,用户可以对评论进行投票。当对注释进行投票时,将创建一个投票(对于该注释),其ip等于用户的IP地址。然后,当用户重新加载页面时,我的服务器会查看每个评论的现有投票,并检查投票是否包含用户的IP地址,如果是,则不允许用户投票。

comment.rb

has_many :votes

votes.rb

belongs_to :comment

schema.rb

create_table "votes", force: true do |t|
t.string   "ip"

查看

<% @ip_array = comment.votes.pluck(:ip).to_a %>
<% if !(@ip_array.include? request.remote_ip) %>
  <!--allow to vote-->

我的问题是:这两种方案中的哪一种在服务器上会更容易?

1:)我为评论创建了一个名为“vote_count”的单独属性,每次投票时,@comment.vote_count都设置为@comment.vote_count + 1

2:)服务器只是将所有投票加在一起:@comment.votes.all


我可能会在页面加载时提交大约50条评论,每条评论可能平均有4票。

1 个答案:

答案 0 :(得分:1)

就个人而言,我会使用选项#1并使用计数器缓存。随着您的应用程序变得越来越大,检索并添加所有这些投票将降低性能。

应用/模型/ vote.rb

class Vote
  belongs_to :comment, counter_cache: :count_of_votes
end

count_of_votes列添加到您的comments表格中:

rails generate migration AddCountOfVotesToComments count_of_votes:integer

您可能希望编辑迁移并为该列添加默认值:

t.integer :count_of_votes, default: 0

您可以在Rails指南中了解有关计数器缓存的更多信息:

http://guides.rubyonrails.org/association_basics.html