2011-05-16 109 views
0

我在尋找一些關於如何爲電子郵件式應用程序設計數據庫的建議,特別是如何處理向多個用戶發送消息,以及顯示發送給用戶的消息。電子郵件式應用程序的數據庫設計

這是我到目前爲止有:

消息(主鍵是ID)

  • ID(身份)
  • SenderId(外鍵Users.Id)
  • <消息數據>

ReceivedMessages(主鍵的MessageId + RecipientId)

  • 的MessageId(外鍵Messages.Id)
  • RecipientId(外鍵Users.Id)
  • IsRead

所以對於發送的每條消息,消息中都會有一行,包含數據,然後是ReceivedMessages中每個收件人的一行。

但是,如果我想查看用戶發送的所有消息以及他們發送給誰的信息呢?對於每條消息,我需要找到該消息的所有ReceivedMessages行,並將所有這些消息與用戶表連接起來,然後以某種方式將所有名稱連接起來(例如:Concatenate many rows into a single text string?)。這可能導致擴展問題,或者它不是真的擔心什麼?

有什麼想法/建議嗎?謝謝。

回答

2

我認爲您的設計沒有問題,並且不會在您的表格上正確建立索引(除非您正在討論大規模,例如gmail,Yahoo郵件等),否則無法預測和擴展問題。

就連接收件人名稱而言,我建議您在應用程序端而不是SQL中執行此操作,或者確定是否需要執行此操作(您可能希望顯示列表而不是連接字符串)。

1

所有用戶發送的消息,以及他們是誰發送到

你可以做到這一點作爲一個彙總查詢,像:

SELECT u1.user_name, m.message, GROUP_CONCAT(DISTINCT u2.user_name) 
FROM messages m JOIN users u1 ON (m.senderID=u1.user_id) 
       JOIN receivedmessages r ON (m.id=r.messageId) 
       JOIN users u2 ON (r.RecipientId=u2.user_id) 
GROUP BY u1.user_name, m.message; 

但由於收件人基本上是無限制,您可以在GROUP_CONCAT上針對字符串長度限制運行。

所以它很可能更好的顯示做一個未聚集的選擇和處理記錄在應用程序層:

SELECT u1.user_name, m.message, DISTINCT u2.user_name 
FROM messages m JOIN users u1 ON (m.senderID=u1.user_id) 
       JOIN receivedmessages r ON (m.id=r.messageId) 
       JOIN users u2 ON (r.RecipientId=u2.user_id) 
ORDER BY u1.user_name, m.sent_date, u2.user_name; 
0

更改用戶名和電子郵件,而不是他們的登錄。考慮模仿基於unix的郵箱中發生的事情(例如,鬆)代替:

received_messages (
    user_id, 
    message_id, 
    message_date, 
    message_title, 
    message_content, 
    message_sender, 
    message_recipient, 
    message_is_read 
) 

並且沿着相同的路線sent_messages,即每個用戶的兩個「文件」。

甚至將後兩者與發送/接收的標誌合併。

0

我面臨着爲網站創建電子郵件或消息系統的相同挑戰......你們忘了一件事...... IsRead,IsDraft,IsFlagged,IsReply,IsTrash等......需要在單獨的表格,因爲相同的信息將被兩個或多個人標記,讀取或未讀!因此,我們必須有一個狀態表如下所示...

StatusID int  
MessageID int 
MemberID int 
DateTime datetime  
IPAddress varchar(65) 
IsRead char(1) 
IsDraft char(1) 
IsFlagged char(1) 
IsForwarded char(1) 
IsReply char(1) 
IsTrash char(1) 

您需要除了會員或用戶表中至少有三個表:

mail 
folders 
status 
attachment 
log 

如果這是一個現有的網站...如果你希望這個郵件系統有很多活動,我會把郵件系統分成一個單獨的數據庫。

相關問題