質問: c.content_id where 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つのカラムに全てを入れるか、なかなか決めることができずにいます。 こういったケースではどのようにデータを保存すべきなのでしょうか。 アドバイス宜しくお願い致します。
回答: 自分なら他の回答にあるように追加は無制限に行って参照時に上位10件だけ取得する方法を取るだろうなと思います。 消してしまった情報は二度と見れないので、安全側に倒すなら全部とっておくという意味で。 ただその履歴が更新される頻度やデータ量、または参照する頻度の問題で、DBへのアクセスがボトルネックになる事が事前にテストしてわかっているのであれば、参照用の別テーブルやDBを分けておくなり、割り切ってどうにか10件に調整するようにバッチやトリガで削除するなり、色んなメンテナンス方法は考えられるでしょうけど。