2013-03-22 150 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