0

私は現在、ユーザーが複数の受信者にPMを送信できる必要があるWebサイト用のPMシステムを開発しています。当然、これは、メッセージがユーザーA、B、およびCに送信された場合、ユーザーCはメッセージを削除できますが、ユーザーAとBは削除しないことを意味します。問題は、そのようなシステムに最適なデータベーステーブル構造は何か、もちろん1つのメッセージの複数のコピーを回避することです。現在、私はこのテーブル構造について考えました:

msgid (int),
parentid (int),
timestamp (timestamp),
senderid (int),
recipients (varchar),
subject (varchar)
text (text),
deletedby (varchar),
readby (varchar)

これが唯一のテーブルになります。スレッドは、親IDに基づいて作成され(親IDがない場合は、メッセージがスレッドの最初になります)、タイムスタンプ順に並べられます。受信者は1つの列にコンマ区切りで保存され、WHEREユーザーID IN(msg.recipients)を使用してチェックされます。deleteby列には、readby列と同様に、メッセージを削除したユーザーのすべてのID(コンマ区切り)が含まれます。

ただし、これが理想的なテーブル構造であるかどうかはわかりません。コーディングを始める前に、改善のためのあなたの考えを聞きたいと思います。

4

1 に答える 1

4

CSV値を単一のフィールドに保存することは、常に悪い設計であり、ひどい痛みを引き起こすだけです。システムを本番環境にロールアウトする前に、ここで設計を正規化します。受信者リストを子テーブルに配置し、子レコードに「削除済み」フラットを配置して、特定の受信者がメッセージを削除したかどうかを示します。

recipientsTable

messageID    int -> foreign key to messages table
recipientID   int -> foreign key to users table
read     bit - t = read, f = unread
deleted   bit - t = deleted, f = still there.
readON    date - timestamp of when recipient read message

...または同様のもの。

于 2011-11-07T17:00:13.703 に答える