Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Структура БД для личных сообщений / 13 сообщений из 13, страница 1 из 1
20.08.2012, 16:57
    #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
20.08.2012, 16:58
    #37923333
lleexxaa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура БД для личных сообщений
Забыл уточнить, БД - MySQL.
...
Рейтинг: 0 / 0
20.08.2012, 17:00
    #37923336
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура БД для личных сообщений
lleexxaaВот так выглядит придуманная мной структура таблиц:

Добавь третью - dialogs - и привязывай сообщения к ней, а не пользователям.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
20.08.2012, 17:17
    #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
20.08.2012, 17:18
    #37923374
lleexxaa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Структура БД для личных сообщений
Dimitry SibiryakovlleexxaaВот так выглядит придуманная мной структура таблиц:

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

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

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

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


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

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

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

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

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

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

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

Тогда помимо того, чтобы записывать сообщение пользователя в таблицу messages, нужно будет постоянно обновлять запись с диалогом.
...
Рейтинг: 0 / 0
21.08.2012, 11:01
    #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]