0

多くの Movie_Categories のユーザー、コメントの数を保持する Rails アプリがあります。モデルは次のようになります。

class User < ActiveRecord::Base
  has_many :comments
end

class Movie < ActiveRecord::Base
  belongs_to :movie_category

  has_many :comments
end

class MovieCategory < ActiveRecord::Base
  has_many :movies  
end

class Comment < ActiveRecord::Base
  belongs_to :movie
  belongs_to :user
end

もちろん、各 MovieCategory に対して次のようなことを行うと、MovieCategory ごとにユーザーのコメント数を見つけることができます。

@user.comment.where("movie_category_id =?", movie_category_id)

ただし、この呼び出しを頻繁に行う必要がある場合、サーバーに多くの負荷がかかるため、すべての Movie_Categories のすべてのユーザーに対して 1 時間に 1 回 (バックグラウンド ジョブで) 計算を行い、カウントを保存することを考えていました。ユーザー テーブルでは、各ムービー カテゴリに独自の列があります。そうすれば、ユーザーごとに計算を頻繁に実行する必要がなくなり、User テーブルからカウントにアクセスするだけで済みます。

私が疑問に思っているのは、これを行うためのよりドライな方法があるかどうかということです。なぜなら、いつ Movie_Categories の成長が止まるかわからないからです (そして、そのたびに新しいテーブル フィールドが追加されます)。ユーザー表示ビュー (これらのカウントが表示される場所) をキャッシュすることも考えましたが、それでも、ユーザー テーブルにこれらの列がない場合、新しいユーザー ページが読み込まれる (またはキャッシュされた期限が切れる) たびに、ユーザーのコメント数については、これらすべてを再度計算する必要があります。

サーバーに負担をかけすぎないように、私が直面している問題に対するより良いアプローチはありますか?

4

1 に答える 1

0

現時点で開発中であるというコメントを考えると、心配する必要があるまでは心配しないでください。ただし、事前に計画を立てたい場合は、フラグメント キャッシングと外部キーのインデックスを使用することをお勧めします。

あなたのサイトがあなたが話しているサイズに成長した場合、移行を実行してユーザー テーブルにフィールドを追加するには、かなりの時間がかかる可能性があります。

質問でキャッシングについて言及したことに注意してください。キャッシングに広く精通していると仮定しますが、次のような見解が与えられています。

<ul>
  <li>Action Movies: 23 Comments</li>
  <li>Comedy Movies: 14 Comments</li>
</ul>

cacheこれをブロックでラップします。

<% cache "user-#{user.id}-comments", @user.comments.last.created_at.to_i  do %>
  ...
<% end %>

これにより、カウントを表示するフラグメントがキャッシュされ、そのユーザーが新しいコメントを投稿するたびに自動的に期限切れになります。<li>それぞれをキャッシュし、コメントがそのカテゴリに投稿されたときにのみ期限切れになるようにすることで、より詳細な詳細を取得できますが、初期の段階ではやり過ぎになる可能性があります.

外部キーのインデックスについては、次の構文を使用して移行に追加できます。

add_index :comments, :movie_category_id

実行するクエリがそれほど悪いとは思いませんが、本番環境に到達してスケールするまで、それがどのような影響を与えるかはわかりません。

于 2013-02-19T11:17:25.483 に答える