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

C# 如何在用户之间实现消息传递系统?,c#,mysql,asp.net-mvc,database,architecture,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_tu

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

我现在的情况是这样的:

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。问题是,若接收者将删除他的消息,那个么消息也将从发送者那个里消失。我想实现一个类似邮箱的结构。你有什么建议


另外,我正在用ASP.NET MVC 3和C#开发一个项目。

如果您想为每个发件人创建一个收件箱(也可能是一个“已发送邮件”的邮箱),在一个规范化的数据库中,您可以将其建模为一个
邮箱

Mailbox
______
MailboxId
UserId -- who the mailbox belongs to
MailboxTypeId -- is it an inbox, sent, drafts box...
Message
_______
MessageId
MessageText
-- .. other fields, e.g. MessageDate


MessageMailbox
______________
MailboxId
MessageId
然后,您的邮件表将与一个用户的已发送邮箱和一个用户的收件箱建立多对多关系。此关系建模为
MessageMailbox

Mailbox
______
MailboxId
UserId -- who the mailbox belongs to
MailboxTypeId -- is it an inbox, sent, drafts box...
Message
_______
MessageId
MessageText
-- .. other fields, e.g. MessageDate


MessageMailbox
______________
MailboxId
MessageId
从邮箱中删除邮件时,可以删除
MessageMailbox
中表示邮件位于要从中删除邮件的邮箱中的行

要创建消息,请将消息保存在
message
表中,这样您就有了MessageId=2和MessageText=“Hi”。 发送邮件时(例如,我正在发送邮件给您),您将在MessageMaibox中创建两行,一行使用已创建邮件的messageId和MailboxId=23(假设23对应于邮箱表中我的“已发送”maibox),另一行使用相同的messageId和MailboxId=42(假设42是邮箱表中的收件箱)

这使您可以向多个收件人发送邮件(只需在MessageMaibox中为邮件应到达的每个收件箱添加一行),或者从理论上讲,让邮件具有多个发件人,这是电子邮件通常不提供的功能,但您正在开发的应用程序可能希望允许的功能。

只需添加一个字段即可

deleted int default 0
并添加到您的查询中

and deleted = 0
此外,如果需要,可以对该字段进行状态设置

比如说,

deleted = 1   -  deleted by sender
deleted = 2   -  delted by reciever
deleted = 3   -   deleted by both
如果您有多个Reveiver,则您的表格应不同:

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


也许您需要创建消息的两个副本,一个用于发送方,另一个用于接收方。你试过什么?@DanPuzey,不,我没有试过你的建议,但我考虑过了。现在我正在考虑一个很好的解决方案。如果它总是一个发送者和一个接收者,那么你就可以有两个标志来判断邮件是否已从任一邮箱中删除。这样可以避免系统中出现重复消息。如果您有多个接收者,但这不起作用,您必须复制消息。@VARAK不需要多个接收者。是1比1。你能为你的建议写一个小的答案吗?很有趣。你能再描述一下吗?在这种方法中,我将如何发送消息?@piedpiper对如何发送进行了详细解释,我将进一步阐述这个想法。您可以在MessageMailbox表中添加更多数据,例如邮件是否已被读取、删除、时间戳、是否已回复等。@Shlomo绝对!使用您提到的相同机制,您也可以添加标记或“紧急”标志。。。但是这种数据库结构也使得用户可以相对容易地添加他们自己的个性化文件夹(例如“归档”):您只需添加一个新的邮箱类型,并将一个新邮箱与新的邮箱类型关联到一个用户。归档邮件后,只需更改MessageMailbox中相应的行即可。这是一种很好的方法。但有一个问题。。当您想在收件箱中查看邮件时,如何知道是谁发送给您的?我建议MessageMailbox有一个引用列来保存发件人(如果是“收件箱”邮件)或收件人(如果是“已发送”邮件)。我不需要私人邮件的恢复机制。但你的答案很容易实现。我会记住这一点。但有一个问题。在没有多个接收者的第一种情况下,我是否必须将单个消息添加到消息表或2?您必须添加单个消息。复制两份邮件真奇怪。为何