2011-11-07 12 views
0

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

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

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

しかし、これが理想的なテーブル構造であるかどうかはわかりません。コーディングを開始する前に、あなたの考えを聞きたいと思います。より良いアイデアがあれば教えてください。単一のフィールドにCSV値を格納する

おかげ

答えて

4

は常に悪いデザインで、あなたに激しい痛みの原因となります。生産のためにシステムをロールアウトする前に、設計を標準化します。受信者リストを子テーブルに置き、子レコードに「削除済み」フラットを入れて、その特定の受信者がメッセージを削除したかどうかを示します。

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 

...または類似のもの。

+0

OKつまり、メッセージを持つテーブルと受信者ごとに行が挿入されるテーブルの2つのテーブルを用意することをお勧めします。 – carlo

+0

はい。フィールドをカンマ区切りにしておくと、リストを変更する必要がある場合は非常に苦労します。 mysqlにはfind_in_set()があるので、検索はそれほど悪くはありませんが、他のDBシステムでは醜い速度になります。 csvから特定の値を削除することは、基盤となるシステムにかかわらず苦労します。 –

+0

さて、ありがとう。スレッドシステムについてはどう思いますか?私の例の親子とタイムスタンプのオーダーモデルは大丈夫ですか? – carlo

関連する問題