2013-03-22 6 views
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, receid и сообщение. Проблема в том, что если получатель удалит его сообщение, сообщение также исчезнет из отправителя. Я хочу реализовать структуру, такую ​​как почтовый ящик. Что ты предлагаешь?

P.S. Я разрабатываю проект с ASP.NET MVC 3 и C#.

+1

Возможно, вам нужно создать две копии сообщения , один для отправителя и один для получателя. Что вы пробовали? –

+0

@ DanPuzey, нет, я не пробовал ваше предложение, но я подумал об этом. Сейчас я думаю о хорошем решении этого. – hakan

+0

Если это всегда 1 отправитель и 1 приемник, вы можете просто иметь 2 флажка, было ли сообщение удалено из любого почтового ящика. Таким образом, вы можете избежать дублирования сообщений в своей системе. Если у вас несколько приемников, хотя это не сработает, и вам придется дублировать сообщение. – VARAK

ответ

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 = "Привет". Когда сообщение отправляется (скажем, например, я отправляю его вам), вы создаете две строки в MessageMaibox, одну с сообщением IJ созданного сообщения и MailboxId = 23 (при условии, что 23 соответствует моему «отправленному» maibox в таблица почтовых ящиков), другая с тем же идентификатором messageID и MaiboxId = 42 (предполагается, что 42 - это ваш почтовый ящик в таблице почтового ящика).

Это позволяет отправлять сообщения нескольким получателям (просто добавьте строку в MessageMaibox для каждого почтового ящика, в которое должно поступать сообщение), или даже теоретически, чтобы иметь сообщение с несколькими отправителями, что-то, обычно предоставляют, но приложение, которое вы разрабатываете, возможно, захочет разрешить.

+0

довольно интересно. Не могли бы вы охарактеризовать еще немного? В этом подходе как я могу отправить сообщение? – hakan

+0

@piedpiper расширенное объяснение о том, как отправить –

+1

Я бы расширил эту идею. Вы можете добавить больше данных в таблицу MessageMailbox, например, было ли сообщение прочитано, удалено, отметки времени, если на него был дан ответ, и т. Д. – Shlomo

1

Просто добавьте поле

deleted int default 0 

и добавить в запросах

and deleted = 0 

Кроме того, если вам нужно, вы можете сделать статусы этой области.

Например,

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

Если у вас есть несколько reveivers, ваши таблицы должны быть разными:

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

Мне не нужен механизм восстановления для личных сообщений. Но вы отвечаете легко. Я буду помнить об этом. Но один вопрос. В первом случае, когда нет нескольких приемников, нужно ли добавлять одно сообщение в таблицу сообщений или 2? – hakan

+0

Вы должны добавить одно сообщение. Странно делать 2 копии сообщения. Зачем? – varan

Смежные вопросы