質問: 過去のランキングは再計算する必要がないので、計算結果を記録するべきか。 その際に気をつけることはあるか。 ログ用のテーブル設計 ---------- * id * post_id * created_at --- 以上です。 未熟な部分があると思いますが、アドバイスいただけないでしょうか。
回答: リレーショナルDB(mydql)は、ログ系のデータを管理するのは苦手です。最近は、アクセスログをfluentd 経由でkibanaやmongodbなどに送って解析するというのが流行りです。とは言え、mysqlだけでも出来なくはないので、注意点を書いておきたいと思います。 * ログの取り方について リロードによる再カウントを防ぐためには、ユーザごとにユニークなIDを生成してcookieに埋め込めば大丈夫です。アクセスログには、cookieのIDを記録します。同じIDのアクセスは、解析時に一つにまとめます。 * ログの保存の仕方 定期的に古いデータを削除するようにしないと、解析も遅くなりますし、容量も無駄に消費します。定期的に削除するとして、SQLのDELETEだと結構重くなるので、日付をキーにしてパーティションを区切るというようなことを行うことが多いです。パーティションの削除(DROP)は、高速に動作します。 * 集計の仕方 日毎・月毎の集計サマリーを別テーブルに作って保存すると良いと思います。サマリーの作成はバッチで行います。アクセスログを別のDB(mongodb)などに保存する場合でも、サマリーはmysqlで保存します。すべての記事の日別アクセス数を保存しておき、月別サマリーは日別サマリーを合計、年別サマリーは月別サマリーを合計すればよいでしょう。サマリーを計算後は、アクセスログを削除します。 参考になりましたら、幸いです。