|
|
|
Структура БД для личных сообщений
|
|||
|---|---|---|---|
|
#18+
Всем привет! Прошу совета по созданию структуры БД для реализации личных сообщений на сайте. Сразу напишу, что пользовался поиском по форуму, максимально похожая задача была в ветке /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 - флаг прочтения сообщения получателем. Проблем с выводом сообщений для интерфейса "диалог с конкретным пользователем" не возникает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2012, 16:57 |
|
||
|
Структура БД для личных сообщений
|
|||
|---|---|---|---|
|
#18+
Забыл уточнить, БД - MySQL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2012, 16:58 |
|
||
|
Структура БД для личных сообщений
|
|||
|---|---|---|---|
|
#18+
lleexxaaВот так выглядит придуманная мной структура таблиц: Добавь третью - dialogs - и привязывай сообщения к ней, а не пользователям. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2012, 17:00 |
|
||
|
Структура БД для личных сообщений
|
|||
|---|---|---|---|
|
#18+
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 можно извернуться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2012, 17:17 |
|
||
|
Структура БД для личных сообщений
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovlleexxaaВот так выглядит придуманная мной структура таблиц: Добавь третью - dialogs - и привязывай сообщения к ней, а не пользователям. Тогда придется при добавлении каждого личного сообщения проверять, есть ли диалог между данными пользователями или нет, и если диалога еще нет, добавлять его. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2012, 17:18 |
|
||
|
Структура БД для личных сообщений
|
|||
|---|---|---|---|
|
#18+
lleexxaaпридется при добавлении каждого личного сообщения проверять, есть ли диалог между данными пользователями или нет, и если диалога еще нет, добавлять его. Зачем? Если пользователь жмёт кнопку "новый диалог" он по-любому начинает новый диалог. А если жмёт кнопку "ответить", то это опять же по-любому в старом диалоге. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2012, 18:47 |
|
||
|
Структура БД для личных сообщений
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakovlleexxaaпридется при добавлении каждого личного сообщения проверять, есть ли диалог между данными пользователями или нет, и если диалога еще нет, добавлять его. Зачем? Если пользователь жмёт кнопку "новый диалог" он по-любому начинает новый диалог. А если жмёт кнопку "ответить", то это опять же по-любому в старом диалоге. Возможно, в этом есть правда. Но принципиально, по-моему, ничего не меняется. Если мы сообщения привязываем не к пользователям, а к диалогам, то нужно вытащить все диалоги пользователя с последними сообщениями в них, а также имя собеседника в диалоге. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2012, 20:55 |
|
||
|
Структура БД для личных сообщений
|
|||
|---|---|---|---|
|
#18+
lleexxaaНо принципиально, по-моему, ничего не меняется. Да нет, запросы упрощаются, использование индексов улучшается, скорость растёт, нормальность тоже. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2012, 21:27 |
|
||
|
Структура БД для личных сообщений
|
|||
|---|---|---|---|
|
#18+
lleexxaa, Для сообщений всё же лучше использовать не базу данных, а imap-сервер. Для быстрых сообщений - xmpp. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2012, 21:36 |
|
||
|
Структура БД для личных сообщений
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovlleexxaaНо принципиально, по-моему, ничего не меняется. Да нет, запросы упрощаются, использование индексов улучшается, скорость растёт, нормальность тоже. Вы говорите общими словами, я не могу понять, как простятся запросы. Насчет нормальности тоже смутно представляю. Пусть у нас добавляется таблица dialogs с полями ID, USER_ID_1, USER_ID_2, ведь от привязки сообщений к пользователям (в таблице messages поля SENDER_ID и RECEIVER_ID) не обойтись - нужно же понимать, кто отправитель, а кто получатель (для понимания, входящее ли это сообщение или исходящее). Ну а суть остается та же - нужно вытащить диалоги с последними сообщениями в них. pkorobeinikovlleexxaa, Для сообщений всё же лучше использовать не базу данных, а imap-сервер. Для быстрых сообщений - xmpp. Спасибо за наводку, почитаю поподробнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2012, 23:15 |
|
||
|
Структура БД для личных сообщений
|
|||
|---|---|---|---|
|
#18+
lleexxaaНасчет нормальности тоже смутно представляю. Ну так почитай насчёт нормальных форм. Как минимум - трёх. А для простоты вытаскивания просто храни последнее сообщение прямо в таблице dialogs. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2012, 23:23 |
|
||
|
Структура БД для личных сообщений
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovА для простоты вытаскивания просто храни последнее сообщение прямо в таблице dialogs. Тогда помимо того, чтобы записывать сообщение пользователя в таблицу messages, нужно будет постоянно обновлять запись с диалогом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2012, 09:32 |
|
||
|
Структура БД для личных сообщений
|
|||
|---|---|---|---|
|
#18+
lleexxaaТогда помимо того, чтобы записывать сообщение пользователя в таблицу messages, нужно будет постоянно обновлять запись с диалогом. А в чём проблема? Повесил на неё триггер, который при обновлении сообщения скидывает старое сообщение в историю сообщений и спи спокойно. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2012, 11:01 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=37923643&tid=1541577]: |
0ms |
get settings: |
6ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
152ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
36ms |
get tp. blocked users: |
1ms |
| others: | 207ms |
| total: | 428ms |

| 0 / 0 |
