9599


勉強のため`rails`+`mysql`でブログを作っています。  
人気の記事一覧というものを表示したいのですが、設計についてアドバイスください。

## 機能

ログを元に

  * 日毎
  * 週ごと
  * 月ごと
  * 年ごと
  * トータル

の人気記事をランキング化して取得

## ログの取り方

アクセスがあるたびにログ用のテーブルに保存

= 気になること・わからないこと =

単純にアクセスがあるたびに記録してしまうと、同じユーザがリロードするだけで人気記事になってしまうので、対策をとりたい。

## ログの保存の仕方

ログ用のテーブルを作って、アクセスログとして記録。

= 気になること・わからないこと =

どの程度の規模まで耐えられるか。  
1アクセスごとに1データ挿入されるので、肥大化した際の影響がきになる。

もっと適した方法はないか。

## 集計の仕方

上記のログを元に、指定した期間のログの中でもっともログの多かった記事を計算。

= 気になること・わからないこと =

過去のランキングは再計算する必要がないので、計算結果を記録するべきか。  
その際に気をつけることはあるか。

## ログ用のテーブル設計

  * id
  * post_id
  * created_at

* * *

以上です。  
未熟な部分があると思いますが、アドバイスいただけないでしょうか。


CC BY-SA 3.0
2015-04-27T04:56:48.743
9585
2015-04-27T10:43:19.777
9149
question
ruby-on-rails
アクセス数をもとに人気の記事を取得するには


リレーショナルDB(mydql)は、ログ系のデータを管理するのは苦手です。最近は、アクセスログをfluentd
経由でkibanaやmongodbなどに送って解析するというのが流行りです。とは言え、mysqlだけでも出来なくはないので、注意点を書いておきたいと思います。

  * ログの取り方について  
リロードによる再カウントを防ぐためには、ユーザごとにユニークなIDを生成してcookieに埋め込めば大丈夫です。アクセスログには、cookieのIDを記録します。同じIDのアクセスは、解析時に一つにまとめます。

  * ログの保存の仕方  
定期的に古いデータを削除するようにしないと、解析も遅くなりますし、容量も無駄に消費します。定期的に削除するとして、SQLのDELETEだと結構重くなるので、日付をキーにしてパーティションを区切るというようなことを行うことが多いです。パーティションの削除(DROP)は、高速に動作します。

  * 集計の仕方  
日毎・月毎の集計サマリーを別テーブルに作って保存すると良いと思います。サマリーの作成はバッチで行います。アクセスログを別のDB(mongodb)などに保存する場合でも、サマリーはmysqlで保存します。すべての記事の日別アクセス数を保存しておき、月別サマリーは日別サマリーを合計、年別サマリーは月別サマリーを合計すればよいでしょう。サマリーを計算後は、アクセスログを削除します。

参考になりましたら、幸いです。


CC BY-SA 3.0
2015-04-27T10:43:19.777
9599
2015-04-27T10:43:19.777
9508
9585
answer