2013-03-22 154 views
0

我需要在網站上實現消息傳遞系統。有用戶,這些用戶可以發送消息給彼此。我怎樣才能做到這一點?我需要什麼樣的數據庫結構?如何在用戶之間實現消息傳遞系統?

我現在要做的是這樣的:

CREATE TABLE `message` (
    `Id` int(11) NOT NULL AUTO_INCREMENT, 
    `SenderId` int(11) NOT NULL, 
    `ReceiverId` int(11) NOT NULL, 
    `MessageContent` varchar(2000) COLLATE utf8_turkish_ci NOT NULL, 
    `MessageDate` datetime NOT NULL, 
    `Viewed` bit(1) NOT NULL DEFAULT b'0', 
    PRIMARY KEY (`Id`), 
    KEY `FK_Message_User_idx` (`SenderId`), 
    KEY `FK_Message_Receiver_idx` (`ReceiverId`), 
    CONSTRAINT `FK_Message_Sender` FOREIGN KEY (`SenderId`) REFERENCES `user` (`Id`) ON DELETE CASCADE ON UPDATE NO ACTION, 
    CONSTRAINT `FK_Message_Receiver` FOREIGN KEY (`ReceiverId`) REFERENCES `user` (`Id`) ON DELETE CASCADE ON UPDATE NO ACTION 
) ENGINE=InnoDB AUTO_INCREMENT=3 

這是MySQL的創建表的腳本。基本上,我存儲senderid,receiverid和消息。問題是,如果接收者將刪除他的消息,消息也將從發送者消失。我想實現一個像電子郵件框這樣的結構。你有什麼建議?

P.S.我正在用ASP.NET MVC 3和C#開發項目。

+1

也許你需要創建郵件的兩個副本,一個發件人和一個接收人。你有什麼嘗試? – 2013-03-22 13:28:40

+0

@DanPuzey,不,我沒有試過你的建議,但是我想過了。現在我正在考慮一個很好的解決方案。 – hakan 2013-03-22 13:34:22

+0

如果它始終是1個發件人和1個接收者,那麼您只需擁有兩個標誌,即是否從任一郵箱中刪除了郵件。這樣可以避免在系統中出現重複的消息。如果你有多個接收器,但這不起作用,你將不得不復制該消息。 – VARAK 2013-03-22 14:39:01

回答

7

如果你想爲每個發件人(也可能是「發送郵件」郵箱)的收件箱,在規範化的數據庫中,你可以將它建模爲Mailbox表。然後

Mailbox 
______ 
MailboxId 
UserId -- who the mailbox belongs to 
MailboxTypeId -- is it an inbox, sent, drafts box... 

您的留言表將有一個用戶的郵箱發送,一個用戶的收件箱多對一對多的關係。這種關係被建模爲MessageMailbox表。

Message 
_______ 
MessageId 
MessageText 
-- .. other fields, e.g. MessageDate 


MessageMailbox 
______________ 
MailboxId 
MessageId 

當你從郵箱中刪除一條消息,你就可以刪除,指出該消息是在你想從它刪除郵箱MessageMailbox行。

要創建消息,請將消息保存在Message表中,以便您具有MessageId = 2和MessageText =「Hi」。當發送消息時(比如說我將它發送給你),你在MessageMaibox中創建了兩行,一行包含創建消息的messageId和MailboxId = 23(假設23對應於我的「已發送」maibox郵箱表),另一個具有相同的messageID和MaiboxId = 42(假設42是郵箱表中的收件箱)。

這讓您可以向多個收件人發送消息(只需在MessageMaibox中爲消息應該到達的每個收件箱添加一行),或者甚至理論上可以向多個發件人發送消息,這是電子郵件不會通常會提供,但您正在開發的應用程序可能需要允許。

+0

挺有意思的。你可以進一步描述一下嗎?在這種方法中,我將如何發送消息? – hakan 2013-03-22 13:53:14

+0

@piedpiper擴充說明如何發送 – 2013-03-22 14:32:15

+1

我會擴展這個想法。您可以在MessageMailbox表中添加更多數據,例如郵件是否已被讀取,刪除,時間戳,是否回覆等。 – Shlomo 2013-03-22 14:48:27

1

只需添加一個字段

deleted int default 0 

,並添加到您的查詢

and deleted = 0 

此外,如果你需要,你可以讓狀態到該領域。

例如,

deleted = 1 - deleted by sender 
deleted = 2 - delted by reciever 
deleted = 3 - deleted by both 

如果你有幾個reveivers,你的表應該是不同的:

CREATE TABLE `message` (
    `Id` int(11) NOT NULL AUTO_INCREMENT, 
    `SenderId` int(11) NOT NULL, 
    `MessageContent` varchar(2000) COLLATE utf8_turkish_ci NOT NULL, 
    `MessageDate` datetime NOT NULL, 
    PRIMARY KEY (`Id`) 

CREATE TABLE recieversmessages (
    receiverId int, 
    messageId int, 
    viewed int, 
    primary key(receiverId, messageId) 
) 
+0

我不需要私人郵件的恢復機制。但你的回答很容易實現。我會牢記這一點。但有一個問題。在沒有多個接收器的第一種情況下,是否必須將單個消息添加到消息表或2? – hakan 2013-03-22 14:46:45

+0

你必須添加單個消息。製作2個消息副本很奇怪。做什麼的? – varan 2013-03-23 10:56:58