powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Структура БД для личных сообщений
13 сообщений из 13, страница 1 из 1
Структура БД для личных сообщений
    #37923331
lleexxaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет! Прошу совета по созданию структуры БД для реализации личных сообщений на сайте.

Сразу напишу, что пользовался поиском по форуму, максимально похожая задача была в ветке /topic/861209&pg=1 , но там задача так и не решилась.

Обмен сообщениями будет работать по аналогии с социальной сетью "ВКонтакте". У пользователя должны быть 2 главных интерфейса:
- список диалогов;
- диалог с конкретным пользователем.

Под диалогом понимается переписка Пользователя А с Пользователем Б или наоборот Пользователя Б с Пользователем А (т.е. это все сообщения, отправленные ЛИБО от А к Б, ЛИБО от Б к А).

Загвоздка заключается в написании запроса, который бы вернул список всех диалогов конкретного пользователя (например, Пользователя А ) с текстом последнего сообщения в каждом диалоге. Список диалогов должен сортироваться в порядке убывания даты последнего сообщения (не важно, Пользователь А является получателем или отправителем этого сообщения).

Вот так выглядит придуманная мной структура таблиц:
users (для упрощения приведу только 2 поля):
ID;

NAME.

messages :

ID - id сообщения, первичный ключ;

DATE - дата отправки сообщения;

TEXT - текст сообщения;

SENDER_ID - id пользователя-отправителя;

RECEIVER_ID - id пользователя-получателя;

SENDER_DELETED - флаг удаления сообщения отправителем;

RECEIVER_DELETED - флаг удаления сообщения получателем;

RECEIVER_VIEWED - флаг прочтения сообщения получателем.

Проблем с выводом сообщений для интерфейса "диалог с конкретным пользователем" не возникает.
...
Рейтинг: 0 / 0
Структура БД для личных сообщений
    #37923333
lleexxaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Забыл уточнить, БД - MySQL.
...
Рейтинг: 0 / 0
Структура БД для личных сообщений
    #37923336
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lleexxaaВот так выглядит придуманная мной структура таблиц:

Добавь третью - dialogs - и привязывай сообщения к ней, а не пользователям.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Структура БД для личных сообщений
    #37923370
Cane Cat Fisher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lleexxaaЗагвоздка заключается в написании запроса, который бы вернул список всех диалогов конкретного пользователя (например, Пользователя А ) с текстом последнего сообщения в каждом диалоге. Список диалогов должен сортироваться в порядке убывания даты последнего сообщения (не важно, Пользователь А является получателем или отправителем этого сообщения).


Сначала получить список "контрагентов" (select (if SENDER_ID = Пользователь А then RECEIVER_ID else SENDER_ID) where SENDER_ID = Пользователь А or RECEIVER_ID = Пользователь А), и затем по каждому - последний ID сообщения. Потом уже текст вытащить.

if-then-else приведено условно, думаю, смысл понятен. Что там MySQL сейчас умеет? case when уже сделали? Или через UNION можно извернуться.
...
Рейтинг: 0 / 0
Структура БД для личных сообщений
    #37923374
lleexxaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovlleexxaaВот так выглядит придуманная мной структура таблиц:

Добавь третью - dialogs - и привязывай сообщения к ней, а не пользователям.

Тогда придется при добавлении каждого личного сообщения проверять, есть ли диалог между данными пользователями или нет, и если диалога еще нет, добавлять его.
...
Рейтинг: 0 / 0
Структура БД для личных сообщений
    #37923505
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lleexxaaпридется при добавлении каждого личного сообщения проверять, есть ли диалог между данными
пользователями или нет, и если диалога еще нет, добавлять его.

Зачем? Если пользователь жмёт кнопку "новый диалог" он по-любому начинает новый диалог. А
если жмёт кнопку "ответить", то это опять же по-любому в старом диалоге.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Структура БД для личных сообщений
    #37923643
lleexxaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakovlleexxaaпридется при добавлении каждого личного сообщения проверять, есть ли диалог между данными
пользователями или нет, и если диалога еще нет, добавлять его.

Зачем? Если пользователь жмёт кнопку "новый диалог" он по-любому начинает новый диалог. А
если жмёт кнопку "ответить", то это опять же по-любому в старом диалоге.


Возможно, в этом есть правда. Но принципиально, по-моему, ничего не меняется. Если мы сообщения привязываем не к пользователям, а к диалогам, то нужно вытащить все диалоги пользователя с последними сообщениями в них, а также имя собеседника в диалоге.
...
Рейтинг: 0 / 0
Структура БД для личных сообщений
    #37923671
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lleexxaaНо принципиально, по-моему, ничего не меняется.
Да нет, запросы упрощаются, использование индексов улучшается, скорость растёт,
нормальность тоже.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Структура БД для личных сообщений
    #37923674
pkorobeinikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
lleexxaa,

Для сообщений всё же лучше использовать не базу данных, а imap-сервер.
Для быстрых сообщений - xmpp.
...
Рейтинг: 0 / 0
Структура БД для личных сообщений
    #37923768
lleexxaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovlleexxaaНо принципиально, по-моему, ничего не меняется.
Да нет, запросы упрощаются, использование индексов улучшается, скорость растёт,
нормальность тоже.

Вы говорите общими словами, я не могу понять, как простятся запросы. Насчет нормальности тоже смутно представляю. Пусть у нас добавляется таблица dialogs с полями ID, USER_ID_1, USER_ID_2, ведь от привязки сообщений к пользователям (в таблице messages поля SENDER_ID и RECEIVER_ID) не обойтись - нужно же понимать, кто отправитель, а кто получатель (для понимания, входящее ли это сообщение или исходящее). Ну а суть остается та же - нужно вытащить диалоги с последними сообщениями в них.

pkorobeinikovlleexxaa,
Для сообщений всё же лучше использовать не базу данных, а imap-сервер.
Для быстрых сообщений - xmpp.

Спасибо за наводку, почитаю поподробнее.
...
Рейтинг: 0 / 0
Структура БД для личных сообщений
    #37923771
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lleexxaaНасчет нормальности тоже смутно представляю.

Ну так почитай насчёт нормальных форм. Как минимум - трёх.

А для простоты вытаскивания просто храни последнее сообщение прямо в таблице dialogs.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Структура БД для личных сообщений
    #37923952
lleexxaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovА для простоты вытаскивания просто храни последнее сообщение прямо в таблице dialogs.

Тогда помимо того, чтобы записывать сообщение пользователя в таблицу messages, нужно будет постоянно обновлять запись с диалогом.
...
Рейтинг: 0 / 0
Структура БД для личных сообщений
    #37924106
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lleexxaaТогда помимо того, чтобы записывать сообщение пользователя в таблицу
messages, нужно будет постоянно обновлять запись с диалогом.

А в чём проблема? Повесил на неё триггер, который при обновлении сообщения скидывает
старое сообщение в историю сообщений и спи спокойно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Структура БД для личных сообщений
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]