web-dev-qa-db-ja.com

このメッセージングシステムに使用する関係の種類は何ですか?

小さなメッセージングシステムを作ろうとしています。次のプロパティが必要です。

  • 1人のユーザーが1人または複数のユーザーにメッセージを送信できます
  • メッセージは登録済みのユーザー(つまり、既存の「idUser」レコード)にのみ送信できます
  • 送信されたメッセージ(誰がメッセージを誰に送信したか)の追跡があるはずです。

現在のデータベース設計は次のようになります。

enter image description here

テーブルPrivate Messageは、メッセージのコンテンツのみを保存します。

テーブルUser Private Messageは、送信されたメッセージを追跡するために使用されます。 "idUser from"および"idUser to"の列があり、メッセージを送信したユーザーとメッセージを受信したユーザー(複数の場合もあります)を示します。

テーブル「ユーザー」と「ユーザープライベートメッセージ」の関係の適切なタイプを選択するのが難しい(最初から全体の概念が正しい場合)。次のように、テーブル 'User'と 'User Private Message'には2つの別々の関係があるはずです。

  • User.idUserUser Private Message.idUser fromを接続する1対1の関係
  • User.idUserUser Private Message.idUser toを接続する1対多の関係

ここで使用する関係について教えてください。この種の問題に簡単に対処する方法について何か提案があれば、私はそれをさらに感謝します。

いつもありがとうございました。

5

メッセージのスレッドを追跡しようとしていないと仮定すると、IE N人にメッセージを送信しても、N人は返信できません。

1)ユーザーは他のテーブルへの参照を必要としません
2)メッセージにはID(明らかに)と、それを最初に送信したユーザーへの参照が必要です
3)次のような単一のメッセージとその受信者(ユーザー)を接続するテーブルが必要です:message_recipients {user_id、message_id}ここで、主キーは2つのフィールドの組み合わせです。これにより、1つのメッセージに多数の受信者を含めることができ、ユーザーをさまざまなメッセージの受信者にすることができます。

1人のユーザーが1人または複数のユーザーにメッセージを送信できます

これは、message_recipientsテーブルを介して行われます

メッセージは登録済みのユーザー(つまり、既存の「idUser」レコード)にのみ送信できます

アプリケーションロジックでもこれを処理する必要がありますが、(必要に応じて)外部キーと(DBMSによっては)NOT NULL制限をmessage_recipientsテーブルの各列に追加すると、可能になります受信者が存在しない状態でmessage_recipientsにレコードを作成します。

送信されたメッセージ(誰がメッセージを誰に送信したか)の追跡があるはずです。

このデータモデルはそれをサポートしています。例:

ユーザーMike Johnsonから送信されたメッセージのすべての受信者の名前を検索します

(ユーザーテーブルの2つの異なる使用法により良いエイリアスを与えるために編集されました)

SELECT recipient.firstname, recipient.lastname
FROM user recipient
JOIN message_recipient mr ON recipient.id = mr.user_id
JOIN message m ON m.id = mr.message_id
JOIN user sender ON m.user_id = sender.id
WHERE sender.firstname = 'Mike' and sender.lastname = 'Johnson'
3
Petter Brodin