Я не так давно начал изучать программирование на PHP, и еще не знаю всех тонкостей работы поэтому прошу прощения может быть за глупые вопросы ... Хочу понять как устроен движок обмена сообщениями между зарегистрированными пользователями в системе (для примера: раздел "Знакомства" на mail.ru, или тот же самый преславутый "Контакт"). Меня в основном интересуют алгоритмы работы таких систем: как происходит поиск и хранение диалогов сообщений между пользователями, какова структура базы данных сообщений может быть, как обеспечивается быстродействие таких систем при поиске нужных сообщений???
Я делал такое через три таблицы (хотя можно через одну). 1. Исходящие сообщения 2. Входящие сообщения 3. Новые сообщения. Когда А отправляет сообщение, оно дублируется в три таблицы. В табл.1 эта запись нужна для того чтоб просматривать свои отправленные сообщения, в табл. 2 - чтобы получатель смог увидеть принятые сообщения, в табл. 3 - чтобы получатель увидел новое входящее сообщение при обновлении любой страницы. Третья таблица нужна для быстрого поиска новых сообщений системой, дабы не дергать постоянно одну из двух (они ведь содержат все сообщения юзеров). Вот на каждой страничке нужно приинклудить файл, в котором будет код с таким запросом SELECT * FROM `new_messages` WHERE `user` = 3. У каждого юзера должен быть ИД, по нему вытягиваются сообщения. Также один ньюанс. Также надо продумать такой случай, когда один пользователь удаляет сообщение, а оно (сообщение) не должно пропасть у второго юзера. В моем случае - сообщение удаляется, например, с табл. 2 (получатель прочел и удалил, а у отправителя оно осталось), иначе (в случаее если все в одной таблице находится) нужно делать дополнительное поле, даже два. Не скажу как именно на вконтакте сделано, скорей всего не совсем так.
А как делать через одну??? Мне говорили что это можно сделать через таблицу, одну на всех состоящую из полей: автор, адресат, статус сообщения (новое или прочитано), время, текст сообщения. Но я не сильн опонимаю как осуществлять выборку из этой таблицы. Зная на собственном опыте, что эти сообщения расплодятся с огромной сокростью и база будет немыслемой по размеру. Еще предлагали сделать так: за основу взять пару идентификаторов - адресат|автор, и эту пару сделать ключевым полем, по которому происходит поиск, а базу проиндексировать ... А сам диалог между юзерами держать в одной ячейке через текстовый парсинг. Но тут действительно возникает вопросо сервисе с собщениями как сделать так чтоб один мог удалить сообщения без ущерба для интересов другого. В ICQ все проще, там просто текстовый файл, и на каждого юзера свой файл ..., но как это сделать в вэбе до сих пор не понятно. Огромное спасибо за то что поделились своей нароботкой ..., буду крутить в голове дальше ...
Вот поэтому я и не делал вариант "3 в 1". Должна быть отдельная таблица для быстрого поиска новых сообщений (в моем случае табл. №3). Причем, прочитанное сообщение автоматом должно удаляться и эта табличка не переполняется, за счет чего и подходит для быстрого поиска по ней. Представь что у тебя есть книга на 1000 стр. и тебе нужно в ней чтото быстро найти, а содержания в ней нет. Придется перелистывать всю. А так у тебя есть лист-второй, на котором написано где какой раздел и какие страницы, чтоб быстро открыть нужное. Но минус в том, что нужно в три разные таблицы вписывать одно и тоже. Например: отправил А кому-то Б сообщение Х . Вписываем в каждую таблю по сообщению. Отправленные id (33232), from (A), to (B), message (X) Входящие id (223), from (B), to (A), message (X) // если не прочли сообщение, значит 0 Новые сообщения id(3424), from (B), to (A), message (X)//Как только юзер прочел сообщение - удаляем от сюда Может, чтото упустил - давненько это делал просто, не имею дампа таблиц под рукой. Чтобы найти все новые сообщения для юзера A - SELECT * FROM `new_messages` WHERE `to` = A Чтобы найти все сообщения для A - SELECT * FROM `in_messages` WHERE `to` = A Чтобы найти все сообщения, отправленные B - SELECT * FROM `out_messages` WHERE `from` = B Если А удаляет сообщение, которое ему прислал B - то оно (сообщение) удаляется из таблицы in_messages, при этом отправитель B свои сообщения не теряет (они у него в out_messages).
т.е. иными словами для каждого юзера своя таблица и соответсвенно свой процесс порожденный мускулом????