質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.23%

会員同士のメッセージやりとりのDB設計方法について教えて下さい。

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 2,781

shimayu

score 35

現在、PHPとMySQLを使用した会員サイトを勉強の為に制作しています。

会員種別は販売会員と購入会員の2種類存在しています。
販売会員・購入会員共に掲示板に投稿出来ます。投稿のページは完全に分かれています。
(販売情報掲示板、購入希望掲示板)

記事を見て興味があった場合には直接記事を書いた人にメッセージを送ることが出来る。
メッセージはマイページから確認ができ、そこで直接やり取りが出来る。

以上のような簡易SNSを作っています。
会員種別ごとに会員登録をする、会員種別ごとに記事を投稿する、というところまではできました。

この後が悩んでいます。Aさんが書いた記事にBさんがメッセージを出したとします。
するとAさんのマイページにBさんからのメッセージが届き、備考欄などに「(掲示板タイトル)からのメッセージ」と記載します。
その後はマイページ上でAさんとBさんのやり取りが始まる流れです。

このAさんとBさんのやり取りをDBでどのように設計するのが良いのでしょうか。
(もちろんやり取りはAさんとCさんとか、CさんとBさんなど色々あります。)

現在の私の稚拙な知識では、メッセージやりとり用のテーブルを1つ作り、
自分のIDの記事を抜き出し一覧表示させる、という方法かなと思っています。

掲示板の方のDBは

message_id / user_id / message_subject / message_txt / message_date / access_count /

というのを、販売者用、購入者用で2つ用意しました。
「メッセージを送る」ボタンを押すと、user_idに対してmessage_subjectを付けて返信を送るような仕組みです。

この後の流れをヒントでも良いので教えて下さい。
どうぞよろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

今のままでも出来ると思いますが、
「誰から送られたのかがわからない」
という制約がついてしまいますね。
そのため、本題である
「AさんとBさんがやり取りをする」
という機能に落とし込むのが難しいと思います。

テーブル構造としては

  • 送信者のユーザID
  • 受信者のユーザID
  • その他機能的に必要な情報

という構成にして、
やり取りを見る場合は、
閲覧者のユーザIDが送信者もしくは受信者に一致する
という条件で絞り込めば、自分の関係するメッセージが取得できます。
それを個別のやり取りで表示する場合はさらにやり取り相手のユーザIDで絞り込むような感じですね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/03 13:38

    ご回答ありがとうございます。

    メッセージ用のテーブルとしては、

    message_id / sender_id / receiver_id / original_message_id / message_subject / message_txt /

    こんなところでしょうか。
    original_message_id で掲示板のどのメッセージから来たのが分かりますし、そこから掲示板のタイトルも取れますね。

    キャンセル

  • 2016/07/03 13:43

    そうですね。
    良いと思います。
    RDBMSのデータベース設計は具体的な機能やオブジェクトの情報を関連のある表に落とし込んでいく作業なので、
    この機能を実現するためにはこの情報が必要
    というのを整理していくと捗るかと思います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.23%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる