回答編集履歴

1 SQL修正

m.ts10806

m.ts10806 score 48213

2017/05/26 13:31  投稿

以前、SNSシステムで個別メッセージ機能もあった案件の改修に関わったことがあります。
個人的な意見なのであくまで参考程度にとどめておいてください。
# tbl_boardは不要じゃないかな・・・
田中さんがuser_1で山田さんがuser_2の場合と山田さんがuser_1で田中さんがuser_2の場合で何か違いがあるのであれば別ですが、個別メッセージはあくまで「当人同士のやり取り」で掲示板でいうスレッドが立つのとは意味が違います。
メッセージボードテーブルではひとつひとつのメッセージの削除ではなく、例えば田中さんが山田さんに送ったメッセージ全てを論理削除するということになるのではないでしょうか。
# tbl_messageひとつで管理できそう
メッセージIDをキーとしているのであれば全てメッセージテーブルで管理できそうに思います。
管理すべきは「誰が」「誰に」「どんな内容」を送ったかということです。
|message_id|from_user|to_user|message|read_flg|delete_flg|created_at|
|--:|:--|:--|:--|--:|--:|:--|
|1|山田|田中|こんにちは田中さん|1|0|2017-05-01 00:00:00|
|2|田中|山田|メッセージありがとうございます山田さん|0|0|2017-05-02 00:00:00|
|3|山田|高橋|こんにちは高橋さん|0|0|2017-05-02 00:00:00|
・・・・
メッセージはユーザの画面で見るとして、ログインユーザは「to_user」となります。
集約しても「自分が誰に送信したメッセージか」「自分が誰からメッセージを受け取ったか」というのは取得できると思います。
特定ユーザーとのメッセージやり取りを表示する際には若干コツが必要ですが・・・。
山田さんログインの場合に田中さんとのやり取りをとる場合
※未検証 イメージだけ伝わればと思います
```SQL
select
* -- 省略します
from tbl_message_pre
where (from_user = '山田' or from_user = '山田')
and (from_user = '田中' or from_user = '田中')
where (from_user = '山田' or to_user = '山田')
and (from_user = '田中' or to_user = '田中')
order by created_at desc
```

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る