人気記事(ランキング)表示に関するDB設計や方法
DBのテーブル設計と実装について教えて頂けると嬉しいです。
登録制サイトで、記事を投稿して閲覧者がお気に入りに登録できるような仕組みを作っています。
トップページ等で「人気の記事」を表示する際、お気に入り登録数が多いものを表示させたいと思っています。
このような場合、どのようなテーブル設計や方法を取るのが良いのでしょうか?
3つ方法を思いつきますが、どれも一長一短なのかなという気がしています。
(テーブル設計の例)
「posts」テーブル : post_id, user_id, text
「favorites」テーブル: favorites_id, user_id, post_id
「users」テーブル : user_id, user_name
(方法1)お気に入り登録数をテーブルに持たない(都度カウント処理する)
トップページ表示の都度、「favorites」各記事のお気に入り登録数をカウントして(post_id で group byしてcountする)、登録の多い記事を表示させます。シンプルな方法ですが、レコード数が多い場合の負荷を心配しています。
(方法2)お気に入り登録数をテーブルに持つ
お気に入り登録数を「posts」テーブル内に保持させます。
「posts」テーブル : post_id, user_id, text, favorite_count
閲覧者がお気に入り登録した場合は「favorites」テーブルへの追加を行うと供に「posts」テーブルの「favorite_count」を更新します。トップページ表示の際は「posts」テーブルの「favorites_count」を見に行って多いものを表示させるだけなので負荷の心配は減ります。しかし、冗長な?データをテーブルに持つのは何か嫌な気がしますし、またプログラム実装が少し困難になります。
(方法3)人気の記事テーブルを別に持つ
バッチ処理を1日1回等走らせ、登録数の多い記事をサーチして「人気の記事」テーブルに格納します。トップページでは、この「人気の記事」テーブルを見に行って表示させるだけになりますので負荷が減ります。しかし、リアルタイムな情報を表示できないのが残念です。
環境は、MySQL5.1、PHP5.2.17 となります。
アドバイス等頂けましたら嬉しいです。