😖

【感想 / Rails】エラーからの学び

2023/08/09に公開

投稿へのいいねとコメントへのいいねを1つのテーブルで管理しようとした際の問題

背景

①投稿、②投稿へのコメント、の両方にいいねができるようにしたいと考え、1つのテーブル(Favorite)でそれらの情報を管理しようとしていた。テーブルのカラムには、投稿ID(post_id)とコメントID(comment_id)を入れた。

発生したエラー

実装時は、投稿へのいいねをつける際に、コメントIDがnullになり、いいねが反映されなかった。
理由としてはcomment_idカラムにNOT NULL制約を設定していたため、そのカラムの値がNULLである状態でデータベースに新しいレコードを挿入しようとしたため発生していた。

問題点

1つのテーブルで実装しようと色々頑張ってはみたけど、データベースを考えるのが混乱するのと、コード管理も複雑になってしまったので諦めた、、、笑
1つのテーブル管理しようとすると以下の問題もある。

  • データ整合性の問題
    1つのテーブルで同時に管理すると、データ整合性が保たれにくくなる。例えば、投稿IDとコメントIDが同時に存在してしまった場合、以下表のようにどちらのいいねなのかがわかりにくくなってしまう。
いいねID user_id post_id comment_id 内容
1 User A 1 NULL User Aの投稿へのいいね
2 User B NULL 1 User Bのコメントへのいいね
3 User C 1 1 User Cのコメントへのいいね

俺が作ったテーブルでは、いいねのレコードが user_id、post_id、comment_id の3つのカラムを持っていた。
User Cのいいねは、投稿1に対していいねしたのか、それともコメント1に対していいねしたのかが区別しにくく、データ整合性に問題がでる。

解決策

投稿用のいいねとコメント用のいいね、テーブルを2つに分けて管理するようにした。そうすると、それぞれのいいねが明確に区別されるし、実装もわかりやすい。

まとめ

実装アクションは増えるけど、1つのテーブルで管理するより2つのテーブルに分けた方が結果としてわかりやすい設計になったし管理もしやすくなったという学びだった。


かなりの時間つかってしまったけど自分で解決できたことはよかった。初歩的なところかもしれないけど、失敗からの学びってなんでこうなったかをじっくり考えることで、深い学びになるなと思う。問題点に向き合い理解していくことで、きっと将来の対応力があがっていくはず!

Discussion