😁

xやInstagramにある、いいね機能のテーブルの考え方

に公開

like_count カラム

post(投稿)テーブルにあって、いいねの合計数を「パッ」と見せるためのメモ(キャッシュ)です。
毎回 likes テーブルを数える(COUNT(*))のではなく、更新のたびに +1/-1 しておくことで「いいね数」を素早く取得できます。

likes テーブル

誰がどの投稿にいついいねしたか、1件ずつ履歴を残すノートみたいなものです。
ここに post_id と user_id の行を追加することで、
同じ人の二重いいね防止(ユニーク制約をチェックすれば)
誰がいいねしたのかの詳細情報
「○○さんがあなたの投稿をいいねしました!」という通知データ
を扱えます。

補足ポイント

like_count と likes は密接に連動しているけど、役割は別

like_count:数だけをメモする“速攻で見せる”用

likes:履歴や重複チェック、○○さんからいいねされましたのような通知に使う“詳細情報”用

もし履歴がいらないなら、likes テーブルを省いて like_count だけで管理することも理論上は可能ですが、

いいねした「誰」がわからなくなる
二重いいねや取消しのときに数を正しく戻せなくなる
通知も出せなくなる
というデメリットがあります。

まとめると

いいねが起きたときは
likes テーブルに新しい行を INSERT
post.like_count を +1 更新
likes テーブルの情報は、通知機能 や いいねの取消し・重複防止 に必須
like_count は「いいね数」を素早く取得するためのキャッシュ
この3つがセットで動くことで、ユーザーにも運営側にも便利で安全な「いいね機能」が実現できます!

追記

SQL の Trigger を使えば、アプリからは likes テーブルを変更するだけで、DB 側が自動的に post.like_count を更新してくれます。
こうすることでRLSでuppdateを投稿者のみの制限をしていても問題なくlike_countを更新できます

Discussion