С Новым годом! Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.57/49: Рейтинг темы: голосов - 49, средняя оценка - 4.57
 Аватар для stashappy
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625

Диалоги между пользователями

07.02.2014, 12:33. Показов 12771. Ответов 58

Студворк — интернет-сервис помощи студентам
Добрый день. Помогите пожалуйста решить логическую задачу. У себя пытаюсь реализовать что-то наподобие диалогов между пользователями. Примерно как вконтакте. Итак, сделал две таблицы. Одну для диалогов, другую для сообщений. Таблица для сообщений, представлена на рисунке. Вопрос. Как построить таблицу для диалогов? Какие поля там должны быть?
Миниатюры
Диалоги между пользователями  
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.02.2014, 12:33
Ответы с готовыми решениями:

Перевод между пользователями
Доброго времени суток! Есть простенький личный кабинет(авторизация, регистрация) как добавить поля допустим для виртуальной валюты...

Сообщения между пользователями, в теории
Привет, друзья.) Меня интересует вопрос, относительно баз данных, для хранения сообщений пользователей. Каким образом, реализуют такие...

Передача данных между БД с разными пользователями
Имеется две базы данных, доступ к обоим из под разных пользователей. Нужно 4 поля из таблицы первой базы данных скопировать в таблицу...

58
 Аватар для stashappy
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
07.02.2014, 12:40  [ТС]
Был когда то такой вариант таблицы для диалогово(на рисунке). При выборке данных, я смотрел, имеются ли у меня активные диалоги с тем или иным пользователем. Затем, если что-то находилось, то выводил сообщения на страницу. Мой недочёт был в следующем. При удалении диалога, я ставил flag диалога в положение '0' и затем, удалял из таблицы все сообщения с этого диалога. А потом смекнул, что сообщений может быть очень много и подобные операции будут постоянной нагрузкой для сервера. И вот, теперь.. Я не знаю что делать и как быть.
Миниатюры
Диалоги между пользователями  
0
71 / 71 / 13
Регистрация: 01.09.2011
Сообщений: 379
08.02.2014, 13:13
Как по мне в таблице сообщения поля id-отправителя и получателя не нужны(это должны быть атрибуты диалогов), а поля dialog_id не хватает.
1
 Аватар для stashappy
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
08.02.2014, 13:59  [ТС]
Как по мне в таблице сообщения поля id-отправителя и получателя не нужны(это должны быть атрибуты диалогов), а поля dialog_id не хватает
Интересная мысль. Спасибо. А как мы будеа манипулировать с dialog_id?
0
71 / 71 / 13
Регистрация: 01.09.2011
Сообщений: 379
08.02.2014, 14:13
При удалении диалога с id=x, удаляются сообщения с dialog_id=x или вы о чем?
0
 Аватар для stashappy
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
08.02.2014, 14:22  [ТС]
При удалении диалога с id=x, удаляются сообщения с dialog_id=x или вы о чем?
Да, я об этом. Но опять же встает вопрос. А что если сообщений будет много? Такие операции удаления нагружают сервер. У меня есть мысль, но не знаю как её реализовать. А именно. При удалении диалога, не просто обнулить его flag, а также обновить его dialog_id на другое значение. И получится так, что старые сообщения удалять из базы не придётся. Они просто не будут уже показываться, так как dialog_id уже обновился и они будут считаться удаленными. Что скажете?
0
71 / 71 / 13
Регистрация: 01.09.2011
Сообщений: 379
08.02.2014, 14:39
почему тогда просто не проверять, если у диалога поле deleted=1, то не показывать, если у вас все от диалога пляшет?
Вы же выбираете для пользователя сначала диалоги, а потом сообщения связанных с этим диалогом(естественно "потом" - это образно, все делается одним запросом).
0
 Аватар для esculap_ra
462 / 265 / 55
Регистрация: 22.08.2010
Сообщений: 1,204
Записей в блоге: 4
08.02.2014, 14:54
Есть вариант:
таблица диалога: id, messages
ид находятся в таблицах обоих собеседников.
messages хранит все диалоги в json-формате. например [{id:1,answer:"a-la-la",question:"bla-bla-bla"},{...},{...}]
Одна запись используется для обоих пользователей. Осталось реализовать извлечение и запись данных в это поле (что очень несложно).
1
71 / 71 / 13
Регистрация: 01.09.2011
Сообщений: 379
08.02.2014, 15:08
Цитата Сообщение от esculap_ra Посмотреть сообщение
Есть вариант:
таблица диалога: id, messages
ид находятся в таблицах обоих собеседников.
messages хранит все диалоги в json-формате. например [{id:1,answer:"a-la-la",question:"bla-bla-bla"},{...},{...}]
Одна запись используется для обоих пользователей. Осталось реализовать извлечение и запись данных в это поле (что очень несложно).
Это не рационально, постоянно вертеть большие json-объекты, для вставки новых сообщений, и не гибко, удалять конкретные сообщения вообще - пичаль.
dialogs:
id user_from_id user_to_id deleted

messages:
id dialog_from_id dialog_to_id text deleted
1
 Аватар для stashappy
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
08.02.2014, 15:18  [ТС]
почему тогда просто не проверять, если у диалога поле deleted=1
Хорошо, мы поставим deleted=0. А что если этот пользователь в один прекрасный день, напишет своему старому собеседнику новое сообщение. И получается так, что нам надо вывести только новые сообщения, а старые, которые всё ещё сидят в базе данных, нам показывать не надо. Вот этот механизм, я никак не могу продумать. Как отсечь старые сообщения(не удаляя их из базы данных).
messages хранит все диалоги в json-формате
Ох это конечно интересная мысль, но всё равно не вариант.
0
71 / 71 / 13
Регистрация: 01.09.2011
Сообщений: 379
08.02.2014, 15:23
Цитата Сообщение от stashappy Посмотреть сообщение
Хорошо, мы поставим deleted=0. А что если этот пользователь в один прекрасный день, напишет своему старому собеседнику новое сообщение. И получается так, что нам надо вывести только новые сообщения, а старые, которые всё ещё сидят в базе данных, нам показывать не надо. Вот этот механизм, я никак не могу продумать. Как отсечь старые сообщения(не удаляя их из базы данных).

Ох это конечно интересная мысль, но всё равно не вариант.
Это будет просто новый диалог с новым id для старых юзеров, вот и всё.
1
 Аватар для stashappy
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
08.02.2014, 15:30  [ТС]
Это будет просто новый диалог с новым id для старых юзеров, вот и всё.
Понял. И ещё один момент. Правильно ли я понимаю механизм. При отправке сообщения, мы сначала проверяем, есть с данным пользователем в базе данных активный диалог. Если нет, то мы создаём два диалога - для себя и для собеседника.
Пример так:
PHP
1
2
3
$my_id = 555;
$user_id = 777;
mysql_query("INSERT INTO `tab_dialogs` (`my_id`, `user_id`, `deleted`) VALUES (`$my_id`, `$user_id`, `1`), (`$user_id`, `$my_id`, `1`)");
А потом, каждый из пользователей, у себя в кабинете делает выборку из БД, каждый для своего диалога. Правильно я понял?))
0
71 / 71 / 13
Регистрация: 01.09.2011
Сообщений: 379
08.02.2014, 15:42
Да, только пару моментов, во-первых поле deleted означает удален, поэтому для активных диалогов оно должно быть равным 0, а не 1(если в таблице значение этого поля по умолчанию поставить 0, то при создании диалогов его вообще упоминать не придется),
во-вторых имена полей подберите верней, они должны быть "говорящими", а то по полю `my_id`, можно подумать, что у вас диалоги не все со всеми, а только вы со всеми, я бы сделал так:
SQL
1
INSERT  INTO dialogs (user_from_id, user_to_id) VALUES (1,2), (2,1)
1
 Аватар для stashappy
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
08.02.2014, 16:00  [ТС]
dialogs:
id user_from_id user_to_id deleted

messages:
id dialog_from_id dialog_to_id text deleted
Это ваш вариант, который мне стоит рассмотреть в данном случае?)

Добавлено через 7 минут
Почему у вас в dialogs, нет поля dialog_id?
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
08.02.2014, 16:07
а чем не устраивает эта структура? Хранение друзей в базе данных mysql Все тоже самое, добавить только текстовое поле, и все...

Добавлено через 33 секунды
Цитата Сообщение от stashappy Посмотреть сообщение
Почему у вас в dialogs, нет поля dialog_id?
потому что есть поле id
1
 Аватар для stashappy
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
08.02.2014, 16:13  [ТС]
потому что есть поле id
Но обычно это auto_increment. И я его никогда не использовал. Обычно генерировал идентификатор для конкретной записи в таблице, примерно так:
PHP
1
2
3
$rnd = mt_rand(111,999);
$md5_rnd = md5($rnd);
$dialog_id = substr($md5_rnd, 0, 7); // это вставляем в запрос
А уж затем подставлял в запрос.
0
71 / 71 / 13
Регистрация: 01.09.2011
Сообщений: 379
08.02.2014, 16:17
Зачем генерировать? Для того и нужен auto_increment, чтоб записи вставлялись с уникальным идентификатором.
1
 Аватар для stashappy
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
08.02.2014, 16:37  [ТС]
Зачем генерировать? Для того и нужен auto_increment, чтоб записи вставлялись с уникальным идентификатором.
Хорошо. Благодарю за поддержку и помощь. О результатах непременно отпишусь.))

Добавлено через 14 минут
Хм. Сразу возникает ещё один вопрос. Скажем, в таблице у меня имеется мой удалённый диалог и активный диалог пользователя. Я пишу ему новое сообщение. Что должно происходить с мои диалогом? И диалогом пользователя?

Добавлено через 2 минуты
Почему спрашиваю? Если id имеющихся диалогов у нас не обновляются, то как я скрою от себя удаленные сообщения? Ведь по идее, если deleted снова станет в положение 0, то я снова увижу свои старые сообщения. А я их видеть не должен.
0
71 / 71 / 13
Регистрация: 01.09.2011
Сообщений: 379
08.02.2014, 16:48
Я же писал вроде, что после возобновления диалога вы создаете новый диалог для себя, для собеседника продолжаете писать в его старый диалог(он же свой не удалил), почему он снова станет deleted = 0, следите за тем, чтобы не стал, или удаляйте полностью из таблицы, если вам не нужна возможность восстанавливать старые или создайте еще одну таблицу archive_dialogs куда помещайте удаленные - вариантов много, смотря какие конкретно у вас потребности?
1
 Аватар для stashappy
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
08.02.2014, 16:52  [ТС]
вы создаете новый диалог для себя, для собеседника продолжаете писать в его старый диалог
Ах, вон оно как оказывается. Спасибо. Теперь я это осознал. Благодарю вас.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.02.2014, 16:52
Помогаю со студенческими работами здесь

Организация чат-общения между 2 пользователями
Вообщем возник вопрос, как организовать общение на сайте (подобие диалогов вконтакте), между 2 пользователями? Сам сайт на php и мускул,...

Общение в виде чата между пользователями на сайте
есть ли готовые сервисы для общения зарегистрированных пользователей между собой? наподобие krible.ru zopim.com olark.com ...

Работа с пользователями
Давно витает мысль написать компоненты по работе с юзерами, а также затем оформить бандл для Symfony2 :) на данный момент начал...

Слежка за пользователями
Решил написать простую слежку за пользователями: class ViewStats { private static $stats_base = 'stats.log'; private static...

Контроль над пользователями.
Для того, чтобы запрещать доступ к сайту различным "вредителям", необходима регистрация, для того, чтобы в случаи необходимости отказать во...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru