小さなメッセージングシステムを作ろうとしています。次のプロパティが必要です。
現在のデータベース設計は次のようになります。
テーブルPrivate Messageは、メッセージのコンテンツのみを保存します。
テーブルUser Private Messageは、送信されたメッセージを追跡するために使用されます。 "idUser from"および"idUser to"の列があり、メッセージを送信したユーザーとメッセージを受信したユーザー(複数の場合もあります)を示します。
テーブル「ユーザー」と「ユーザープライベートメッセージ」の関係の適切なタイプを選択するのが難しい(最初から全体の概念が正しい場合)。次のように、テーブル 'User'と 'User Private Message'には2つの別々の関係があるはずです。
User
.idUser
とUser Private Message
.idUser from
を接続する1対1の関係User
.idUser
とUser Private Message
.idUser to
を接続する1対多の関係ここで使用する関係について教えてください。この種の問題に簡単に対処する方法について何か提案があれば、私はそれをさらに感謝します。
いつもありがとうございました。
メッセージのスレッドを追跡しようとしていないと仮定すると、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にレコードを作成します。
送信されたメッセージ(誰がメッセージを誰に送信したか)の追跡があるはずです。
このデータモデルはそれをサポートしています。例:
(ユーザーテーブルの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'