42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
1

Сообщения между пользователями, в теории

14.10.2012, 14:48. Показов 11102. Ответов 30
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет, друзья.)

Меня интересует вопрос, относительно баз данных, для хранения сообщений пользователей. Каким образом, реализуют такие вещи(в теории)? У меня на сайте, при регистрации, на каждого пользователя, создается запись в таблице БД. Хотелось бы дополнительно сделать обмен сообщениями между ними. И вот собственно и встал вопрос, как эти сообщения хранить? Можно ли их записывать в одну и ту же ячейку? Скажем, Для входящих сообщений, одна ячейка в таблице, для исходящих, другая. Вот примерно такой вопрос.

Пример sql запроса на создание записи:

PHP
1
2
$query1 = "INSERT INTO users (login, password, email, in_message, out_message)
 VALUES ('$login', '$mdPassword', '$email', '$inbox', '$outbox')";
Можно ли хранить все входящие и исходящие сообщения в out_message и in_message? Или это как то по другому делается?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.10.2012, 14:48
Ответы с готовыми решениями:

Node.js и socket.io сообщения между пользователями
Всем привет,не так давно наткнулся на статью,поставил ноду,установил всё,что нужно,скопировал...

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

Диалоги между пользователями
Добрый день. Помогите пожалуйста решить логическую задачу. У себя пытаюсь реализовать что-то...

Разница Между Пользователями 1с 8.2
Здравствуйте! Не могу разобраться, вынужден обратиться за помощью сюда. В 1С 8.2 (8.2.18.109)...

30
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16844 / 6723 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
14.10.2012, 14:53 2
а почему нет? в отдельной таблице храните входящие/исходящие сообщения и id человека
1
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
14.10.2012, 15:05  [ТС] 3
а почему нет? в отдельной таблице храните входящие/исходящие сообщения и id человека
Чтож, отлично. А я думал, если хранить все в одной ячейке, то это будет или путаница или каша или еще что-нибудь в этом роде. Ну чтож. Раз такое дело, значит будем дерзать. Благодарю вас.)
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16844 / 6723 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
14.10.2012, 15:10 4
единственное - если большой объем, то можно разделить, отдельную таблицу для входящих, и отдельную для исходящих. а путаница - она по любому будет, разве что на каждого человека свою таблицу заводить - но и тогда будет
1
15 / 15 / 3
Регистрация: 19.05.2012
Сообщений: 58
14.10.2012, 15:15 5
Желательно таблицу messages с полями from(от кого), to(кому), isread (прочитано ли сообщение)
2
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
14.10.2012, 15:26  [ТС] 6
Желательно таблицу messages с полями from(от кого), to(кому), isread (прочитано ли сообщение)
Это отличная мысль. Благодарю.)
единственное - если большой объем,
По идее, можно информировать пользователя, о переполнении. А дальше он уж сам, очищает накопившееся. Хотя это тоже не удобно, с точки зрения комфорта.:-)
0
1178 / 1128 / 94
Регистрация: 31.05.2012
Сообщений: 3,060
14.10.2012, 17:56 7
Лучший ответ Сообщение было отмечено как решение

Решение

Зачем вообще две ячейки? Что бы просто дублировать сообщение, вдеть каждое сообщение будет дважды записано и для того кто отправил и для того кто принял?

Не луче так
SQL
1
2
3
4
5
id - ид сообщения
FROM - id юзера от кого
TO - id юзера к кому
msg - текст сообщения
flags (tinyint) - прочитано ли
Выбираете входящие сообщения
$user_id - вы
для вас входящие
SQL
1
SELECT * FROM messages WHERE TO = $user_id
для вас исходящие
SQL
1
SELECT * FROM messages WHERE FROM = $user_id
Если вы не знаете как работать с битами и что представляют из себя битовые маски, используйте флаг просто 0 - не прочитано, 1 - прочитано.
Если знаете или выучите, то в 1 байте можно хранить до 8 флагов вместо 1го.
Например
PHP
1
2
3
4
$is_readed = 1<<0; // прочитано
$is_confirmed = 1<<1; // требует подтверждения
$is_confirm = 1<<2; // подтверждено
$is_draft = 1<<3; // черновик
Что бы выбрать все входящие сообщения, нужно будет выбрать не черновики, так как оно входящие вам и вы не можете видеть его пока оно черновик.
SQL
1
SELECT * FROM messages WHERE TO = $user_id AND !(flags & $is_draft)
А выбрать все черновики написанные вами
SQL
1
SELECT * FROM messages WHERE FROM = $user_id AND flags & $is_draft
Что бы удалить мог только один юзер, например вы из сходящих.
Просто очищаете поле со своим ID где ваше ID находится в поле to Для данного сообщения.
Минус в том, что тогда в исходящих, пропадёт инфа о том, кому его отправили.

Если же с масками работать, то можно флагом помечать, что удалено. Тогда не чего не пропадёт.

Ну если Маски будет сложной темой, можно добавить поля
SQL
1
2
from_del (tinyint)
to_del (tinyint)
в которых помечать что удалено.
Когда оба будет удалены, удалять сообщение из базы.

Или даже одно поле, где хранить кто первый удалил, а при удалении вторым юзером, удалять просто из базы.

имхо любой вариант лучше чем дублирование сообщений.
4
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
14.10.2012, 19:19  [ТС] 8
Прекрасный вариант. Благодарю за помощь. Буду дерзать.:-)
0
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
22.10.2012, 13:29  [ТС] 9
У меня еще такой вопрос. Допустим у меня имеется ячейка в таблице базы для входящих сообщений. Каждое входящее сообщение должно по идее как то индексироваться. Чтобы мы могли обратиться к нему и проиводить над ним манипуляции. Как индексировать текст в ячейке(кратко, в теории)?
0
1178 / 1128 / 94
Регистрация: 31.05.2012
Сообщений: 3,060
22.10.2012, 13:31 10
ну так обычно в таблице есть для этого поле id
0
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
22.10.2012, 13:47  [ТС] 11
ну так обычно в таблице есть для этого поле id.
У меня в таблице, id присваивается новому пользователю. А вот как в одной и тоже ячейке, для входящих сообщений, индексировать месседжы. Это вопрос.

PHP
1
2
3
4
5
6
7
8
9
10
$query33 = "CREATE TABLE base_users (
 id INT NOT NULL AUTO_INCREMENT,
 login VARCHAR( 20 ),
 password VARCHAR( 99 ),
 email VARCHAR( 50 ),
 name_user VARCHAR( 32 ),
 inbox LONGTEXT,
 outbox LONGTEXT,
 PRIMARY KEY ( `id` )
 )";
Где 'inbox' для входящих, 'outbox' - исходящих.
0
1178 / 1128 / 94
Регистрация: 31.05.2012
Сообщений: 3,060
22.10.2012, 13:58 12
Лучший ответ Сообщение было отмечено как решение

Решение

омг.
а если два сообщения? то вы две строки для пользователя сделаете?
Вы видимо вообще не читали что выше по теме написано, как организовывать сообщения.

Таблица пользователей вообще не должна не чего знать о сообщениях.
Для сообщений должна быть отдельная таблица, в которой будут поля id, from_id, to_id, msg, readed, date
хоть входящие хоть исходящее сообщение, оно должно хранится в одном поле.
так как оно будет абсолютно одинаковым, если у вас ИД 1 а у меня ИД 2 и вы мне написали сообщение, то строка в сообщениях будет такой
1 1 2 текст 0 дата
а когда я прочту его, станет такой
1 1 2 текст 1 дата
а если я вам напишу, будет так
1 2 1 текст 0 дата
а когда вы прочтёте будет так
1 2 1 текст 1 дата

Зачем же хранить исходящее сообщение отдельно от входщего, если это одно и то же сообщение?
3
3 / 3 / 2
Регистрация: 09.04.2012
Сообщений: 66
22.10.2012, 14:18 13
а я в запросе сделал выбор те которые мне и те которые я отправил также в запросе расположил удалено ли мной=1 или прочитанно ли мной=1! тоесть для администрирования оч удобно! пользователь удаляет прочитанное им сообщение из базы но на самом деле просто ставит =0 и он его просто не видит )))) что помогает при администрировании найти всякого типа мата или прочего запрещенного!!!! ну а в конце скажу что все сообщения удаляются у меня из базы через 15 дней допустим! можно меньше или больше
1
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
22.10.2012, 14:24  [ТС] 14
Вы видимо вообще не читали что выше по теме написано, как организовывать сообщения.
Ваши ответы я внимательно читаю и не упускаю ни одного символа.
Буду делать отдельную таблицу. Принцип понятен. Большое спасибо.

но на самом деле просто ставит =0
все сообщения удаляются у меня из базы через 15 дней допустим!
Интересные мысли.
0
3 / 3 / 2
Регистрация: 09.04.2012
Сообщений: 66
22.10.2012, 14:27 15
Цитата Сообщение от stashappy Посмотреть сообщение
Ваши ответы я внимательно читаю и не упускаю ни одного символа.
Буду делать отдельную таблицу. Принцип понятен. Большое спасибо.



Интересные мысли.
могу с базы таблицу скопировать, чтоб думалось лучше

MySQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
CREATE TABLE IF NOT EXISTS `messages` (
  `id` int(9) NOT NULL AUTO_INCREMENT,
  `author` varchar(15) NOT NULL DEFAULT '',
  `poluchatel` varchar(15) NOT NULL DEFAULT '',
  `date` datetime NOT NULL,
  `text` text NOT NULL,
  `now` int(1) NOT NULL,
  `aut_del` int(11) NOT NULL,
  `pol_del` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=18 ;
 
--
-- Дамп данных таблицы `messages` ну и дамп для примера 1111 и 3333-это пользователи
--
 
INSERT INTO `messages` (`id`, `author`, `poluchatel`, `date`, `text`, `now`, `aut_del`, `pol_del`) VALUES
(17, '3333', '1111', '2012-10-17 23:17:48', 'hxgh', 0, 1, 0),
(16, '3333', '1111', '2012-10-17 23:17:34', 'frxthxfh', 0, 1, 1),
(15, '1111', '3333', '2012-10-17 23:00:12', 'кененн', 0, 0, 1),
(14, '1111', '3333', '2012-10-17 23:00:08', 'ачррр', 0, 0, 0),
(13, '1111', '3333', '2012-10-17 22:59:48', 'промпромро', 0, 1, 0);
1
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
22.10.2012, 14:32  [ТС] 16
могу с базы таблицу скапировать чтоб думалось лучше.
Давай те, взглянем.
0
3 / 3 / 2
Регистрация: 09.04.2012
Сообщений: 66
22.10.2012, 14:38 17
Цитата Сообщение от stashappy Посмотреть сообщение
Давай те, взглянем.
ну как помогла в размышлении?
0
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
22.10.2012, 14:40  [ТС] 18
А как вы используете вот эти значения?:
`now`, `aut_del`, `pol_del`
ну как помогла в размышлении?
По идее все понятно, но хотелось бы подробнее насчет этих строк.
0
3 / 3 / 2
Регистрация: 09.04.2012
Сообщений: 66
22.10.2012, 14:45 19
Цитата Сообщение от stashappy Посмотреть сообщение
А как вы используете вот эти строки?:



По идее все понятно, но хотелось бы подробнее насчет этих строк.
`now`-у получателя стоит по умолчанию=1 после прочтения =0 по аналогии и оставшиеся! но - `aut_del`- удаляет автор, `pol_del`-удаляет получатель-----но на самом то деле сообщение остается в базе и через запрос можно сделать временной промежуток чтоб при входе допустим отсеивались и удалялись старые сообщения тоесть допустим 15 дневней давности
1
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
22.10.2012, 14:56  [ТС] 20
Спасибо. Теперь все ясно.
удалялись старые сообщения тоесть допустим 15 дневней давности.
У себя на сайте сделаю также. Идея понравилась.
0
22.10.2012, 14:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.10.2012, 14:56
Помогаю со студенческими работами здесь

связь между пользователями
вобщем такая проблема не знаю как организовать и с чего отталкиваться, нужно сделать так много...

Чат между интернет-пользователями
Каким образом реализовать соединение между интернет-пользователями как у Skype,uTorrent ,TemViewer,...

отправка сообщений между пользователями
Сообщение приходят БД но а получателю нет, автор в БД не записывается index.php &lt;?php...

TCP интернет-чат между пользователями
Помогите. Не получается. На компе у себя работает всё ок. а если с другом , то проблема - не...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru