Для простой системы обмена сообщениями я должен создать таблицу БД для отправленных и полученных сообщений или только одну таблицу для обработки обоих? - PullRequest
1 голос
/ 13 декабря 2011

Я хочу создать простую систему обмена сообщениями на моем сайте LAMP. Не система обмена мгновенными сообщениями, а асинхронная система обмена сообщениями, как очень простая форма электронной почты.

В базе данных я должен:

A) создайте одну таблицу для папки «Входящие» (получатель) и одну таблицу для «Отправлено» (отправитель), чтобы, когда получатель удалял сообщение из папки «Входящие», отправитель мог видеть его в папке «Отправленные»,

или

B) создать только одну таблицу, а затем добавить столбец для того, удалил ли ее Получатель / Отправитель или нет, а затем отобразить ее соответственно каждому пользователю на основании этого?

Я также хотел бы отслеживать, прочитал ли получатель это и ответили ли они на это или нет.

Вариант B кажется более эффективным, поскольку вы по сути не дублируете таблицу, но мне интересно, есть ли потенциальные проблемы с этим методом, о которых я не думаю.

Итак, какой вариант вы рекомендуете, A), B) или что-то еще, и почему?

Ответы [ 3 ]

4 голосов
/ 13 декабря 2011

Я бы создал ее как одну таблицу с чем-то вроде:

ID
FromID
ToID
Message

Дополнительная таблица, которая связывала бы пользователей с сообщениями, использовалась бы для определения того, кто что прочитал (отправитель автоматически связывается с этим сообщением)., например).

UserID
MessageID

По сути, если пользователь прочитал сообщение, у него будет запись в этой таблице.

Выполнение этого способа дает нам единое представление длявсе пользователи.Чьи-то входящие сообщения - это, в основном, любое сообщение в таблице, в которой они являются получателем, а в отправленном поле - любое сообщение, в котором они являются отправителем.

Мой входной ящик:

SELECT * FROM Messages WHERE FromID = @MyID

Мой исходящий ящик:

SELECT * FROM Messages WHERE ToID = @MyID

Мои непрочитанные сообщения:

SELECT * FROM Messages
WHERE ToID = @MyID
AND ID NOT IN (SELECT MessageID FROM MessagesRead WHERE UserID = @MyID)

Это гораздо проще, имхо, чем пытаться использовать две таблицы, которые в основном делают одно и то же.И вы будете реплицировать From и To в обеих таблицах, но в обратном порядке, и у нас будет 2 копии сообщения, которые будут перемещаться, когда нам понадобится только одна.Использование дополнительной таблицы MessagesRead позволяет отслеживать, кто что прочитал.

1 голос
/ 13 декабря 2011

При первой же мысли у меня возникнет соблазн иметь таблицу «Сообщение», а затем таблицу связи между сообщением и пользователем.Таким образом, вы всегда можете иметь несколько получателей на более поздней стадии, если хотите - например, групповой чат.

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

Надеюсь, что это имеет смысл.

Под «таблицей ссылок» я подразумеваю таблицу, которая эффективно обеспечивает отношение «многие ко многим» между сообщением и пользователем

0 голосов
/ 13 декабря 2011

Обычно у вас есть одна таблица, столбец sender_id и столбец recipient_id.

При удалении вам потребуется средство «мягкого удаления», чтобы сообщение оставалось в центре сообщений другого человека, как вы упомянули. Для этого у вас может быть таблица deleted_messages с внешним ключом на message_id, deleting_user_id, и вы также можете хранить другую информацию, такую ​​как отметка времени, чтобы вы знали, когда пользователь удалил сообщение. Затем, когда вы отображаете почтовый ящик пользователя (или отправленные элементы), вы просто выбираете все сообщения из вашей таблицы messages, за исключением сообщений, которые появляются в вашей таблице deleted_messages.

...