質問: ブログなどでよくある「今週の人気記事」のような機能を作りたいと考えています。 ただ、プログラミング経験はまだ浅いので相談に乗っていただきたくて投稿しました。 現在僕の中でのイメージは以下のようになっています。 posts - id - title view_counts - id - post_id - created_at このようにして`view_counts`に次々とデータを挿入し、その数をカウントして集計するやり方しか思いつきません。 このやり方で可能ではあると思うのですが、他にスマートで汎用性の高い設計はありますか? また、カウントの取り方は1リクエストごとにデータベースを更新して大丈夫でしょうか。 賢いやり方や、考え方などを教えていただけると嬉しいです。 よろしくお願いします。
回答: view_countsテーブルにvalueというカラムを追加して、俗に言うUpsertを行う方法があります。 MySQLの場合は以下のSQL文で実現できると思います。 post_idカラムをprimary key(またはunique key)に設定しておいて下さい。 ``` -- 記事ID12345のcounterを更新する。 INSERT INTO view_counts (post_id, value, created_at) VALUES (12345, 1, NOW()), ON DUPLICATE KEY UPDATE value = value + 1 ; ``` > > カウントの取り方は1リクエストごとにデータベースを更新して大丈夫でしょうか。 > > > 一般的にはリクエストごとに更新することになると思います。 ただしPVが桁違いに多く、リクエストごとにDBにアクセスしたくない場合は、NOSQLを併用されることをお勧めします。