"Все личные сообщения" вопрос...

Nexus_Noob

Новичок
Доброго времени суток.
На сайте реализована система обмена личными сообщениями.
Все ЛС(Личные Сообщения) хранятся в 2х таблицах: "inbox" и "outbox".
Когда пользователь создает новое лс, оно записывается в обе таблицы сразу с одним ID.
Две таблицы создано, чтобы и получатель, и отправитель могли удалить ЛС из своего ящика и если один из них удаляет лс, то у второго оно остается в ящике.
Если отправитель удаляет ЛС и своего ящика, то оно удаляется из таблицы "outbox", если подобное действие выполняет получатель, то лс удаляется из "inbox".

Так как и получатель, и отправитель могут удалить ЛС из своего ящика, то кол-во сообщений в таблицах разное.

Мне хотелось бы сделать раздел в почте, в котором были бы выведены и входящие, и исходящие отсортированные по id или date и разбитые на несколько страниц(на странице в сумме 10 сообщений).

Подскажите, как подобное можно реализовать?
ps. оперировать со всеми лс не хотелось бы.
 

shelestov

я тут часто
Мне кажется нужно пересмотреть структуру.
Главное правило реляционных баз - избегать дублирования данных, а вы сообщение целиком копируете.
 

ksnk

прохожий
Нужно сделать 2 таблицы. Таблица `Сообщения`[ID,от кого, кому, текст, дата, количество использований] и таблица "Почтовый ящик"[Юзер, тип ящика, сообщение_ID]
тип ящика - inbox/outbox
При создании сообщения оно помещается в таблицу сообщений и 2-х записи в таблицу почтовых ящиков - outbox отправителя (количество использований++) и в inbox получателя (количество использований++)
При удалении сообщения его количество использований уменьшается. Периодически чистим все сообщения с нулем `количества использований`

Так можно организовать фильтрацию сообщений по группам, массовые рассылки посетителям, BCC сообщения и так далее...
 

hell0w0rd

Продвинутый новичок
ksnk ага, а можно просто сделать два флага удалено_отправителем и удалено_получателем, и либо триггером отлавливать это дело, либо кроном чистить.... хотя чистить ничего не надо на мой взгляд) вдруг захотят восстановить
 

ksnk

прохожий
hell0w0rd с "количеством использований" я перегнул. оно не нужно и несложно вычисляется на лету. А 2 таблицы позволят организовать систему почтовых папок для юзера.
Удаленные сообщения попадают в папку "корзина" и там их можно найти некоторое время и почистить по надобности... Почти как у "взрослых" почтовых систем ;)
Структура таблиц `Сообщения`[ID,от кого, кому, текст, дата создания] и таблица "Почтовый ящик"[Юзер, тип ящика, сообщение_ID, время прибытия]
 

Nexus_Noob

Новичок
Добавить флаги "удалено в outbox", "удалено в inbox".
Я плохо себе представляю, как можно будет реализовать раздел "Все лс", который будет разбит на страницы, если поступить таким образом...

Нужно сделать 2 таблицы. Таблица `Сообщения`[ID,от кого, кому, текст, дата, количество использований] и таблица "Почтовый ящик"[Юзер, тип ящика, сообщение_ID]
тип ящика - inbox/outbox
При создании сообщения оно помещается в таблицу сообщений и 2-х записи в таблицу почтовых ящиков - outbox отправителя (количество использований++) и в inbox получателя (количество использований++)
При удалении сообщения его количество использований уменьшается. Периодически чистим все сообщения с нулем `количества использований`

Так можно организовать фильтрацию сообщений по группам, массовые рассылки посетителям, BCC сообщения и так далее...
Спасибо за идею, если другого решения не найду, то сделаю именно так)
 

ksnk

прохожий
Вообще - то совет с двумя флагами, в смысле организации страничного отображения, от моего отличается только формой sql запроса. Страничную адресацию на них делать одинаково несложно.
У 2-х флагов ограничение только одно - нет возможности расширится, когда появится надобность, но заявленную в первом посте задачу такой подход тоже решает, причем за одну таблицу, а не за 2, как у меня.
 

Nexus_Noob

Новичок
Вообще - то совет с двумя флагами, в смысле организации страничного отображения, от моего отличается только формой sql запроса. Страничную адресацию на них делать одинаково несложно.
У 2-х флагов ограничение только одно - нет возможности расширится, когда появится надобность, но заявленную в первом посте задачу такой подход тоже решает, причем за одну таблицу, а не за 2, как у меня.
С такой структурой, которую предложили Вы, я могу понять, как можно вывести и входящие, и исходящие "в куче" постранично.
Но как это сделать, если исход. в одной таблице, а вход. в другой я не знаю.
Первую страницу я смогу вывести, а вот какое сообщение первым выводить на второй странице для меня загадка.
Может быть подскажите?
 

ksnk

прохожий
Пара полей xIn и xOut - соотвественно, `удалено отправителем` и `удалено получателем`.

В качестве демонстрации -
PHP:
function getInBoxSql($user,$box){
if($box=='inbox'){
   return "select * from private_messages where xIn=1 and toUser=\"$user\"";
} esle {
   return "select * from private_messages where xOut=1 and fromUser=\"$user\"";
}
}
На запрос же по надобности навешивать лимиты и условия для страничного отображения
 

Nexus_Noob

Новичок
ksnk, спасибо за пример)

Для ЛС выделю только 1 таблицу в бд с полями: id, text, from, to, date, del_from, del_to, read.

Всем спасибо за помощь)
 
Сверху