【问题标题】:What's worse for performance: adding a new column, or adding together an existing column?对性能更不利的是:添加新列还是将现有列加在一起?
【发布时间】:2015-02-07 00:34:24
【问题描述】:

我有一个评论系统,用户可以在其中对 cme​​ts 进行投票。当对评论进行投票时,会创建一个投票(针对该评论),其 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 cmets,每条评论可能平均有 4 票。

【问题讨论】:

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


    【解决方案1】:

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

    app/models/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

    【讨论】:

    • 如果vote 也与其他几个模型多态关联,我可以在vote 上使用counter_cache 吗?如果没有,您认为为此创建一个comment_vote 模型是否值得?
    • 是的,它会起作用的。您只需将count_of_votes 列添加到您的每个其他模型。您可以使用has_many :votes, as: :voteable 创建Voteable 关注点,并将关注点包含在您的可投票模型中。
    • 然后在您的Vote 模型中,确保将您的关联更改为belongs_to :voteable, as: :polymorphic, counter_cache: :count_of_votes
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 1970-01-01
    • 1970-01-01
    • 2021-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多