什么对性能更差:添加新列,还是将现有列加在一起?
What's worse for performance: adding a new column, or adding together an existing column?
我有一个评论系统,用户可以在其中对评论进行投票。当对评论进行投票时,将创建一个投票(针对该评论),其 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 并使用计数器缓存。随着您的应用程序变得越来越大,检索并累加所有这些投票会降低性能。
app/models/vote.rb
class Vote
belongs_to :comment, counter_cache: :count_of_votes
end
将 count_of_votes
列添加到您的 comments
table:
rails generate migration AddCountOfVotesToComments count_of_votes:integer
您可能想要编辑迁移并为列添加默认值:
t.integer :count_of_votes, default: 0
您可以在 Rails 指南中了解有关计数器缓存的更多信息:
我有一个评论系统,用户可以在其中对评论进行投票。当对评论进行投票时,将创建一个投票(针对该评论),其 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 并使用计数器缓存。随着您的应用程序变得越来越大,检索并累加所有这些投票会降低性能。
app/models/vote.rb
class Vote
belongs_to :comment, counter_cache: :count_of_votes
end
将 count_of_votes
列添加到您的 comments
table:
rails generate migration AddCountOfVotesToComments count_of_votes:integer
您可能想要编辑迁移并为列添加默认值:
t.integer :count_of_votes, default: 0
您可以在 Rails 指南中了解有关计数器缓存的更多信息: