5

小さなメール/メッセージ送信データベース スキーマを作成しています。これは実際のメール システムではなく、組織内の一種のメッセージング ポータルであり、次のユース ケースがあります。

  1. 従業員はすべての従業員にメッセージをブロードキャストできます
  2. 従業員同士がメッセージを送信できる
  3. 従業員は受け取ったメッセージに返信できます
  4. 従業員は、受信ボックスの「タイムスタンプ」列に返信が表示されることで、返信したメールを表示できます (つまり、このメールが返信されたときのタイムスタンプを表示する「repliedat」列が受信ボックスにある必要があります。そうでない場合は空にする必要があります)
  5. 特定のメッセージを開くと、メッセージのスレッド ビューが表示され、最新のメッセージが一番上に表示されます。

私の質問 特定のメッセージがメールのメッセージへの返信であるかどうかを追跡するにはどうすればよいですか。ヘッダーに埋め込まれていると思います。返信である別のメッセージを指す「repliedto」id フィールドを保持しますか?

スレッドまたはチェーンを作成するにはどうすればよいですか?

4

1 に答える 1

7

元の電子メールを指すデータベース テーブルにフィールドを保持します。各電子メールには先行者 (または「父」) が 1 人しかいないのに対し、どの電子メールにも後続者 (または「息子」) は存在しません。したがって、前任者が何であったかを記録しておくことが最善です。

これは、スレッドまたはチェーンを作成する方法でもあります。スレッド内の最初のメッセージの「親」フィールドは 0 になりますが、後のメッセージでは、このフィールドに他の値が含まれます。「スレッド」または「会話」と呼ばれるフィールドを維持すると、どのメッセージがどのスレッドに接続されているかを簡単に知ることができます。

興味深いのは、リンクをチェーンに格納する方法ではなく、チェーンをどのようにトラバースするかです。

以下は単純なデータスキーマです

USERS
id - autoinc
name - varchar

THREADS
id - autoinc
name - varchar

STATUSES
id - autoinc
name - varchar

MESSAGES
msg_id - autoinc
from_id (fk to users table) - int
datesent - date
thread (fk to threads table) - int
father (pointer to previous message in this thread) - int
text - varchar

RECIPIENTS
id - autoinc
msg_id (fk to messages table) - int
to_id (fk to users table) - int
status (fk to statuses table) - int 
dateread - date

1 つのメッセージを多くの人に送信できるため、MESSAGE と RECIPIENTS の間には 1 対多の関係が存在します。各受信者は、異なる時間にメッセージを読み、異なるステータス (未読、既読、削除済み、未読削除など) を持ちます。

于 2012-10-31T12:33:01.713 に答える