2010-12-13 18 views
0

私は200.000ページを持つウェブサイトを開発しています。最も人気のある、最高評価の等級の文書を表示する閲覧セクションもあります。しかし、このセクションは、起動後数週間後にほぼ静的なカップルになります。だから私は今週の今月の最も人気のあるアイテムをyoutubeのように表示するフィルタリングシステムを実装したいと思います。ただ、このような日/週/月を使用して人気のある商品をフィルタする

http://www.youtube.com/videos?c=2

どのように私はこの機能を実装する必要がありますか?私は毎日すべての文書のための新しいエントリを持つ別のテーブルが必要ですか?

DOCID、日付、VIEW_COUNT、評価

だから私は一日を使って、フィルタリングのための今日の行を取得、または週使用してフィルタリングのための週(7行)を計算しますか?それは効率的ではないようです。何か提案はありますか?

私は途中でLAMPスタックを使用しています。

おかげで、

+0

セキュリティ上の懸念事項に注意してください。例えば、1人のユーザーが1秒あたり1000回のビューを生成できないようにする場合は、注意が必要です。決定的な攻撃者を止める方法を実装する幸運.. –

答えて

0

私はデートのコード内を計算してから、使用しているSQLに、引数として渡すだろうと思います。

1

テーブル内のレコードにタイムスタンプを設定すると、必要な時間枠にタイムスタンプを制限するwhere句を入れることができるはずです。

結果をキャッシュすることができます。特に長いものは、リクエストを重要でないほど長くキャッシュできます。

EDIT

しかし、おそらくあなたは今日添加したことで最も普及していない、今日最も人気のある意味ですか?

この場合、私は答えがありません。

1

最も直接的なアプローチは、リソースがrecent_views(what, when)に表示されるたびにタイムスタンプとリソースIDを保存することです。 WHERE when > $beginOfPeriod AND when < $endOfPeriodのような適切なWHERE句を使用して日次/週次/月次チャートを作成できます。

パフォーマンス上の理由から、毎晩値を集計し、合計を別のテーブル(daily_views(what, sum)など)に保存し、ソーステーブルを切り捨てることができます。

0

私はコンパイラを使ってやります。トラフィックの量と応答時間を考慮すると、Youtubeもおそらくそれを行います。

原則はわかりやすいです。 page_viewテーブルにすべてのすべてのビューまたは評価を記録します。コンパイルが行われる期間(時間単位、日単位、週単位、月単位)を定義します。あなたは良い時間(一日の例えば:終わりを)打つたびに、あなたは基本的にクエリà-ラを実行し、コンパイラ、...

SELECT * FROM page_view WHERE date > $from_date AND date < $to_date 

を実行...と、結果を格納します。これはおそらくcronジョブでうまく動作します。

次回情報を表示する必要がある場合は、保存された結果をフェッチして、再計算することなく表示できます。さまざまなストレージ方法があります:MySQLテーブル(例:page_view_compiled)、memcachedなど

関連する問題