ブログなどでよくある「今週の人気記事」のような機能を作りたいと考えています。  
ただ、プログラミング経験はまだ浅いので相談に乗っていただきたくて投稿しました。

現在僕の中でのイメージは以下のようになっています。

posts  
- id  
- title

view_counts  
- id  
- post_id  
- created_at

このようにして`view_counts`に次々とデータを挿入し、その数をカウントして集計するやり方しか思いつきません。  
このやり方で可能ではあると思うのですが、他にスマートで汎用性の高い設計はありますか?

また、カウントの取り方は1リクエストごとにデータベースを更新して大丈夫でしょうか。

賢いやり方や、考え方などを教えていただけると嬉しいです。

よろしくお願いします。
CC BY-SA 3.0
2015-02-02T17:14:00.453
5801
2015-02-03T06:36:17.467
5855
question
mysql
ランキング集計のデータベース設計とカウントの取り方について相談
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を併用されることをお勧めします。
CC BY-SA 3.0
2015-02-03T06:36:17.467
5835
2015-02-03T06:36:17.467
3277
5801
answer