2011-11-07 28 views
0

我目前正在爲一個網站開發一個PM系統,用戶必須能夠將PM發送到多個收件人。當然,這意味着如果消息已經發送給用戶A,B和C,則用戶C可以刪除該消息,而用戶A和B不會。 問題是這樣一個系統最好的數據庫表結構是什麼,當然要避免一個消息的多個副本。 目前,我認爲這表結構:具有多個收件人表結構的PHP/MySQL PM系統?

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

這將是唯一的表。線程是基於parentid創建的(如果沒有parentid消息是線程中的第一個線程),並按時間戳排序。收件人以逗號分隔存儲在一列中,並使用WHERE userid IN(msg.receipients)進行檢查。 deletedby列包含已刪除郵件的所有用戶名(以逗號分隔),就像readby列一樣。

但是我不確定這是否是理想的表格結構。在我開始編碼之前,我想聽聽你的想法。如果你有更好的主意,請告訴我。

感謝

回答

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 

...或類似的東西。

+0

好的,簡而言之,你建議有兩個表格,一個是消息,一個是爲每個接收者插入一行,對嗎? – carlo

+0

是的。如果您需要修改列表,在字段中使用逗號分隔值非常痛苦。搜索並不是很糟糕,因爲mysql具有find_in_set(),但在其他數據庫系統中,它變得很難看。無論底層系統如何,從csv中刪除特定值都是痛苦的。 –

+0

好的,謝謝。你對線程系統有什麼看法?我的例子中的parentid和時間戳排序模型是否可以? – carlo