Кто может помочь правильно построить структуру БД диалогов? Я хочу чтоб любой из собеседников мог "мягко" удалить диалог или сообщение, то есть если удаляет один собеседник, то у второго сообщение остается, а если удаляют оба, то сообщение безвозвратно удаляется, тоже самое с самими диалогами.
Можно сделать поле (например, deleted) с битовой маской
00b - видно всем
01b - удалил кто-то один (например, отправитель сообщения)
10b - удалил, соответственно, получатель сообщения
11b - удалили оба, можно удалять запись из базы (например, скриптом по крону, либо сразу проверять условие в момент удаления пользователем)
Только удалять физически сообщения - не самый логичный подход. Раз это сообщения, то можно предположить что их много и физическое удаление приведет к фрагментации.
когда-то реализовывала простой обмен личными сообщениями на одном сайте.
обошлась одной таблицей. Работает уже три года. Записей на данный момент около 100 тысяч
Может мой вариант кому и пригодится.
структура таблицы:
mail_id
mail_userid_from - id отправителя
mail_userid_to - id получателя
mail_text - текст сообщения
mail_data - дата отправки
mail_status - прочитано или нет получателем - чтобы выводить количество непрочитанных сообщений
mail_delete_userfrom - удалено/нет отправителем
mail_delete_userto - удалено/нет получателем
последние два поля как раз отвечают за "мягкое удаление". По умолчанию там нули. Если юзер удалил сообщение, то выставляется 1 и сообщение данному юзеру не показывается. Теоретически, если в обоих полях по 1, то можно грохать из таблицы такие записи.
@FanatPHP и чем же лучше 1005001000000 сообщений хранить в одной ячейке? их тогда и вытаскивать придётся все сразу, даже если будет нужно одно сообщение