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

本文关键字:实现 消息传递 系统 之间 用户 | 更新日期: 2023-09-27 18:05:23

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

我现在的文件是这样的:

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创建表的脚本。基本上,我存储发送id,接收id和消息。问题是,如果接收者删除了他的信息,那么信息也会从发送者那里消失。我想实现一个类似电子邮箱的结构。你有什么建议?

注:我正在开发项目与ASP。. NET MVC 3和c# .

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

如果您想为每个发件人创建一个收件箱(也可能是一个"已发送消息"的邮箱),您可以将其建模为Mailbox表。

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

您的Message表将与一个用户的发送邮箱和一个用户的收件箱具有多对多关系。这个关系被建模为一个MessageMailbox表。

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

MessageMailbox
______________
MailboxId
MessageId

当您从邮箱中删除邮件时,您可以删除MessageMailbox中表示该邮件在您想要删除它的邮箱中的行。

要创建消息,您将消息保存在Message表中,因此您有MessageId=2和MessageText="Hi"。当发送消息时(例如,我将它发送给您),您在MessageMaibox中创建两行,其中一行具有已创建消息的messageId和MailboxId=23(假设23对应于邮箱表中我的"已发送"邮箱),另一行具有相同的messageId和MaiboxId=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

如果你有几个接收器,你的表应该是不同的:

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