Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Проектирование таблицы сообщений в БД
 
 автор: ramundo   (06.10.2014 в 12:28)   письмо автору
 
 

На большинстве сайтов, где присутствует возможность переписки пользователей, есть возможность удаления диалогов. Удаленный диалог перестает отображаться у меня, но сохраняется у другого пользователя, пока он тоже его не удалит . Как спроектировать для этого таблицу сообщений?

  Ответить  
 
 автор: Enter   (06.10.2014 в 17:01)   письмо автору
 
   для: ramundo   (06.10.2014 в 12:28)
 

у вас что, сообщения дублируются?
спланировать можно так:
id
sender - отправитель
recipient - получатель
message - текст сообщения

если удалять по айди, то удалятся будет сообщение как у отправителя, так и у получателя.

  Ответить  
 
 автор: Yuriev   (06.10.2014 в 21:17)   письмо автору
 
   для: Enter   (06.10.2014 в 17:01)
 

Надо бы ещё одно поле, куда класть id удалившего первым и ему запись не показывать.
Если потом удаляет и второй (при наличии в поле id первого), тогда удаляется полностью

  Ответить  
 
 автор: ramundo   (07.10.2014 в 07:31)   письмо автору
 
   для: Yuriev   (06.10.2014 в 21:17)
 

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

  Ответить  
 
 автор: Enter   (07.10.2014 в 14:04)   письмо автору
 
   для: Yuriev   (06.10.2014 в 21:17)
 

Точно. не дочитал. Думал, что ему как раз такой функционал не нужен.
Тогда надо так:
таблица Messages
id | from | to | text | display

Поле display - это побитовый флаг. например, 1 - видно всем, 2 - только отправителю, 4 - адресату, 8 - удалено и т.д.

  Ответить  
 
 автор: Axxil   (07.10.2014 в 09:35)   письмо автору
 
   для: ramundo   (06.10.2014 в 12:28)
 

Если делать по науке (нормализация и всё такое) то таблица с сообщениями вообще не должна иметь полей sender и receiver. Просто :

id | message | created_at

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

id | owner_id | contact_id | message_id | folder_id

и, соответственно, в эту таблицу при создании сообщения вносится 2 записи. Пример если пользователь 111 отправляет сообщение пользователю 222:

1 | 111 | 222 | 1 | 2
2 | 222 | 111 | 1 | 1

соответственно folder_id = 1 - это папка "входящие" folder_id = 2 - папка "отправленные".

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

  Ответить  
 
 автор: Trianon   (07.10.2014 в 10:40)   письмо автору
 
   для: Axxil   (07.10.2014 в 09:35)
 

и таблиц-связок напрашивается две.
потому как, у письма M есть адресат A - это связь, не зависящая от связи
у пользователя U письмо M живет в папке F

  Ответить  
 
 автор: Axxil   (07.10.2014 в 11:55)   письмо автору
 
   для: Trianon   (07.10.2014 в 10:40)
 

Это понятно, но в данном случае папка это скорее флаг типа письма (отправленное или входящее). Ну и этот флаг, в простейшем случае, удобно заодно сделать внешним ключом справочника папок.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования