###知りたいこと
ユーザーの閲覧履歴をどこに保存すべきかで悩んでいます。
・履歴は10件まで
・当人だけが見れるページに表示するときにしか取得しない
という設計なので、全ユーザーの履歴を保存したテーブルを作るべきか、それとも当人のレコードの1つのカラムに全てを入れるか、どちらにすべきか決められません。
自分が考えらえるメリットとデメリットを以下に書いていきますので、あっているところや間違っているところなど、そしてどうすべきかにについてアドバイス頂けませんでしょうか。
###全ユーザーの履歴を保存したテーブルを作る
テーブルを作るとしたら、すでにあるcontents(コンテンツのテーブル)に加えて、histories(閲覧履歴のテーブル)を作ることになります。
▼ contents(コンテンツのテーブル)
content_id | val |
---|---|
1 | val1 |
2 | val2 |
3 | val3 |
4 | val4 |
5 | val5 |
6 | val6 |
▼ histories(閲覧履歴のテーブル)
|history_id|user_id|target_content_id|visit_date|
|:--|:--|
1|3|6|2020-01-05|
2|1|3|2020-01-04|
3|3|2|2020-01-03|
4|2|8|2020-01-02|
5|2|4|2020-01-01|
このメリットは、SQLでINNER JOINをかければ次のように閲覧履歴が簡単に取得できる点です。
SQL
1/*(例)user_id=3の閲覧履歴はこのように簡単に取得できる*/ 2select 3 c.content_id, 4 c.val, 5 h.visit_date 6from contents c 7inner join histories h on 8h.target_content_id = c.content_id 9where 10 h.user_id=3
ですが、デメリットとしては、データの保存が煩雑そうに思える点です。
例えば保存する前にまず当人のレコードを数えて、それが10件以内ならそのまま保存し、10件以上なら一番古いレコードを削除してから保存する。という処理が煩雑に思えます。
###当人のレコードの1つのカラムに全てを入れる
上記に比べて当人のレコードの1つのカラムに全てを入れることもできると思います。
users(ユーザーのテーブル)のhistoriesに入れるということです。
▼ users(ユーザーのテーブル)
content_id | name | his_histories |
---|---|---|
1 | aくん | "[{"target_content_id":3,"date":"2020-01-04"}]" |
2 | bくん | "[{"target_content_id":4,"date":"2020-01-01"},{"target_content_id":8,"date":"2020-01-02"}]" |
3 | cくん | "[{"target_content_id":6,"date":"2020-01-05"},{"target_content_id":2,"date":"2020-01-03"}]" |
こちらはSQLでINNER JOINとはいかず、まずhis_historiesを取得してそのIDを配列にしてカンマ区切りの文字列(2,3,4,6,8...)にして、SQLでcontents(コンテンツのテーブル)を対象にINで検索するという流れになると思うので、取得が煩雑そうなのがデメリットかと思います。
ですが、メリットとしてはデータの保存が楽そうで、his_historiesを取得したらPHPで10件かどうか数えて処理新しい履歴と合体した結果をhis_historiesに入れなおせばいいので、SQLの実行はそのINSERTの1回で済みそうに思えます。
....
長くなってしまってすみません。
このように考えていて、全ユーザーの履歴を保存したテーブルを作るべきか、それとも当人のレコードの1つのカラムに全てを入れるか、なかなか決めることができずにいます。
こういったケースではどのようにデータを保存すべきなのでしょうか。
アドバイス宜しくお願い致します。
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/24 05:43