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

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

4

2 回答 2

7

如果您想为每个发件人创建一个收件箱(也可能是一个“已发送消息”邮箱),在规范化数据库中,您可以将其建模为一个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 对应于我在Mailbox 表),另一个具有相同的 messageID 和 MaiboxId=42(假设 42 是您在 Mailbox 表中的收件箱)。

这使您可以将消息发送给多个收件人(只需在 MessageMaibox 中为消息应该到达的每个收件箱添加一行),甚至理论上可以将消息发送给多个发件人,这是电子邮件通常不提供但您正在开发的应用程序可能希望允许。

于 2013-03-22T13:34:39.360 回答
1

只需添加一个字段

deleted int default 0

并添加到您的查询中

and deleted = 0

此外,如果需要,您可以对该字段进行状态。

例如,

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

如果您有多个 revevers,则您的表应该不同:

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)
)
于 2013-03-22T14:41:25.593 回答