如何在用户之间实现消息传递系统?

时间:2013-03-22 13:25:17

标签: c# mysql asp.net-mvc database architecture

我需要在网站上实现消息传递系统。有用户和这些用户能够互相发送消息。我怎样才能做到这一点?我需要什么样的数据库结构?

我现在所拥有的是这样的:

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和message。问题是,如果接收方将删除他的消息,消息也将从发送者消失。我想实现像电子邮箱这样的结构。你有什么建议?

P.S。我正在使用ASP.NET MVC 3和C#开发项目。

2 个答案:

答案 0 :(得分: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中为邮件应该到达的每个收件箱添加一行),或者甚至理论上要发送包含多个发件人的邮件,这通常不是电子邮件提供但您正在开发的应用程序可能允许。

答案 1 :(得分:1)

只需添加一个字段

deleted int default 0

并添加到您的查询

and deleted = 0

此外,如果需要,您可以为该字段创建状态。

例如,

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

如果你有几个灵感,你的表应该是不同的:

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)
)