19507
コンテンツの表示回数を記録する時のノウハウを教えて下さい。

ブログの記事を例にします。

## 案1

```

    - posts
      - id
    
    - views
      - post_id
      - ip_address
      - created_at
    
```

## 案2

```

    - posts
      - view_count
    
```

`案1`が理想かなと思いますが、ビッグデータになってしまう懸念があります。  
`案2`に関しては、F5アタックなどのいたずらに対応しずらそうという懸念があります。

まだ実装したこともないので、これらの懸念は気にするほどのことではないのかどうかわらず、決めきれません。  
すでに経験のある方にお伺いしたいのですが、どのような基準で判断していけばよいのでしょうか。
CC BY-SA 3.0
2015-12-01T07:29:17.520
19504
2015-12-01T08:12:20.227
9149
question
mysql
コンテンツの表示回数を記録する時のDB設計
案1はアクセス毎の処理はINSERTのみで処理できる一方、ランキングの際にそれらを数え上げる処理が必要です。`ip_address`と言うカラムがありますが、このようにアクセスに紐付いた情報を記録したい場合はこちらの方法しかありません。

案2は`posts`テーブルに直接カウンタを持たせるのはあまり良くないので、`post_counts`テーブルに`post_id`と`value`とかのカウンタ持たせます。カウントアップするためにはpost_idでレコードを検索して更新の2つの処理が必要なので(実際のSQLではUPDATEだけですが内部の話)負荷が増えますが、表示の時には案1のような数え上げは不要です。

一長一短ありますので、どちらかいいかは用途に合わせて選ぶ必要があります。

アクセス数が膨大だとか`posts`がやたらに大量にあるとかランキングにリアルタイム性が求められるかだとRDBではしんどくなります。Redisには「ソート済みセット」というランキング表示のためにあるようなデータ型があるのでそういうのを使うのも方法です。バッチでいいならログから集計するとかいう手もあります。
CC BY-SA 3.0
2015-12-01T08:12:20.227
19507
2015-12-01T08:12:20.227
5793
19504
answer