如何在用户之间实现消息传递系统
本文关键字:实现 消息传递 系统 之间 用户 | 更新日期: 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)
)