2010-06-27 143 views
0

如果有人要複製twitter的DM功能,你將如何去設計它的模式?我可以發送和回覆郵件,但我的問題是如何跟蹤發送的郵件?如果鮑勃向艾米發送消息,艾米會看到鮑勃的消息。鮑勃還在他的「發送文件夾」中有他的消息副本。MongoDB:私人消息系統...如何跟蹤發送的消息

現在,每封郵件都有一個「收件人」和「發件人」。起初我以爲我認爲這是因爲我可以查詢發件人是誰,從而在用戶的「發送」選項卡中顯示消息。但是,艾米可能想要刪除該消息,那麼是什麼?我不想擺脫這個消息,因爲鮑勃無論出於何種原因仍然可能在發送的存檔中需要它。

我能想到的唯一的其他選擇是保存消息兩次,這是愚蠢的,可能會失去控制。

+0

爲什麼要保存消息兩次愚蠢?磁盤空間很便宜。非規範化存儲在nosql系統中並不罕見。 – TTT 2010-06-28 03:27:19

回答

0

我能想到的唯一的其他選擇是保存消息兩次,這是愚蠢的,可能會失去控制。

事實上,這與愚蠢完全相反。保存消息兩次正是在這裏預期的。在這些類型的非關係數據庫中預計會出現去規範化。

然後看看你自己的描述。

Bob還在他的「發送文件夾」中有一條他的消息的副本。

好了,Bob有「副本」的消息的,似乎相當合理的這種「複製」是在數據庫中不同的文檔。

0

2解決方案,我能想到的是:消息的

  1. 保存2份。這可能看起來很浪費,但運行良好,尤其是在需要跨多個服務器進行分片時 - 所有用戶的詳細信息都會一起存儲。 (注意:這是電子郵件的工作方式 - 一個非常分散的模型)

  2. 保存與發件人/接收器一個副本,因爲你已經提到,但讓你的刪除功能「軟」刪除 - 即。將郵件標記爲已刪除,而不是實際刪除郵件。如果您希望發件人和收件人能夠獨立刪除郵件,則可能需要2個標誌。

1

確定它的晚,但只是爲讀者晚:我覺得這是更好地2個字段添加到每個消息:

inbox (default = 1) 
outbox (default = 1) 

當收件人刪除他的信息,收件箱變爲= 0

時發件人刪除他的消息,發件箱成爲= 0

如果收件箱= 0和發件箱= 0,那麼你可以從數據庫中刪除消息。

此外,添加名稱爲「new」= 1/0的字段也很不錯 - 它顯示收件人是否已閱讀郵件。