Структура таблиц и запросы для организации переписки на сайте . Шо то х..., шо это х...

Zavus

Новичок
Помогите разобраться со структурой таблиц и запросами для реализации сообщений.

Я придумал такой вариант:

Таблица сообщений

id - id сообщения
text - текст
date - дата
writer_id i- d отправителя
reader_id -id получателя
writer_folder - папка , в которой письмо у отправителя (отправленные, полученные, корзина и тд
reader_folder папка , в которой письмо у получателя
reader_deleted - удалено ли у получателя
writer_deleted- удалено ли у отправителя

Теперь, если надо достать все письма пользователя , которые лежат в папке "входящие", делаю запрос:
Код:
SELECT * FROM ( SELECT * FROM messages WHERE reader_id = '.$user_id.' AND reader_folder = "Vhodayshie"
          UNION
          SELECT * FROM messages WHERE writer_id = '.$user_id.' AND writer_folder = "Vhodayshie"  )
          temp_table ORDER BY `id` DESC
Вывожу все это в виде списка сообщений с чекбоксами . Отмеченные
сообщения можно перемещать в другие папки, удалять и тд.

Чтобы,например, переместить сообщения, нужно сделать два запроса:
1)
Код:
'UPDATE messages SET writer_folder = "Arhiv" WHERE writer_id = '.$user_id.' AND id IN ('.$message_id_array.')'  //$message_id_list - это перечень id всех отмеченных  чекбоксами сообщений.
2)
Код:
 'UPDATE messages SET reader_folder = "Arhiv" WHERE reader_id = '.$user_id.' AND  id IN ('.$message_id_list.')'
Ну и чтобы удалить, соответственно тоже 2 запроса
1)
Код:
'UPDATE messages SET writer_deleted = 1 WHERE writer_id = '.$user_id.' AND id IN ('.$message_id_array.')'  //$message_id_list - это перечень id всех отмеченных  чекбоксами сообщений.
2)
Код:
'UPDATE messages SET reader_deleted = 1 WHERE reader_id = '.$user_id.' AND  id IN ('.$message_id_list.')'
Еще нашел такой вариант:

Таблица сообщений:

id
message
sentby
sentto
created

Таблица папок сообщений

id
user
mailbox
message_id

Чтобы записать сообщение в БД, нужно аж три запроса:
1 для сообщения и два для каждого юзера в таблице папок

Пример таблицы сообщений:

id message sentby sentto created
1 Hi There UserA UserB 2015-01-26
2 Hello Back UserB UserA 2015-01-26

Пример таблицы папок:

id user mailbox message_id
1 UserA Out 1
2 UserB In 1
3 UserB Out 2
4 UserA In 2

This allows you to delete individual rows for the user_mailboxes table. This would also allow for future add-ons by allowing you to send messages to multiple users at the same time (A new row for each user), and allow you to add more than one mailbox if needed (In, Out, Trash, Important, etc).

Чтобы посмотреть все сообщения в какой-нибудь папке, делаем запрос:
Код:
SELECT * FROM user_mailboxes LEFT JOIN mbox ON mbox.id = user_mailboxes.message_id WHERE user_mailboxes.user = "$user" AND user_mailboxes.mailbox = "Out";
Подскажите, какой вариант лучше? И если ни один из этих, то какой?)

И еще , что быстрее:
Код:
SELECT * FROM user_mailboxes LEFT JOIN mbox ON mbox.id = user_mailboxes.message_id WHERE user_mailboxes.user = "$user" AND user_mailboxes.mailbox = "Out";
ИЛИ
Код:
SELECT * FROM ( SELECT * FROM messages WHERE reader_id = '.$user_id.' AND reader_folder = "Vhodayshie"
          UNION
          SELECT * FROM messages WHERE writer_id = '.$user_id.' AND writer_folder = "Vhodayshie"  )
          temp_table ORDER BY `id` DESC
Так-то пишут, что UNION быстрее, чем JOIN, но в данном конкретном случае...
 
Сверху