Система личных сообщений PHP (PM) - PullRequest
5 голосов
/ 14 июня 2011

Я планирую сделать систему PM для своих пользователей, в целом она кажется достаточно простой, но в том, как я видел учебники по созданию систем PM, есть одна проблема.

В способе, которым я планировал это работать, будут строки вроде user_from, user_to, а затем сообщение - user_from будет отправителем и увидит сообщение в своих отправленных сообщениях, user_to будет получателем и увидит сообщение в его почтовом ящике. НО, что если пользователь захочет удалить сообщение из отправленной папки, а другой пользователь не захочет удалить его из папки входящих сообщений?

Есть ли простой способ сделать это?

Также было бы неплохо иметь сообщения в беседах, таких как Gmail и Facebook, но это может быть сложно для кодирования (любые учебные пособия приветствуются)?

Ответы [ 8 ]

5 голосов
/ 14 июня 2011

Используйте то, что называется мягким удалением.Это означает, что когда запись «удалена», она фактически никогда не удаляется из базы данных, а вместо этого устанавливается флаг удаления, который позволяет вам удалить ее из пользовательского интерфейса, сохраняя при этом доступ к данным, когда вам это нужно.Таким образом, для этой ситуации вы можете создать еще два столбца с именами user_to_delete и user_from_delete.Если для любого из них задано значение true, вы не будете показывать сообщение в папке входящих / исходящих сообщений соответствующего пользователя.Гудлак.

4 голосов
/ 14 июня 2011

Вы можете решить проблему несколькими способами, но я бы, вероятно, добавил пару флагов (from_deleted, to_deleted) в таблицу:

  • Вместо удаления сообщения обновите соответствующий флаг до 1.
  • При выводе сообщений отфильтруйте те, которые были помечены.
  • Вы можете настроить скрипт так, чтобы после пометки, если оба поля были помечены, вы могли удалить строку.
3 голосов
/ 14 июня 2011

Я предлагаю следующий дизайн базы данных:

MESSAGES
+----------+------------------+---------------------------+
|    id    |    subject_id    |    body                   |
+----------+------------------+---------------------------+

SUBJECTS
+----------+-------------+--------------+-----------------+
|    id    |    title    |    author    |    receivers    |
+----------+-------------+--------------+-----------------+

INBOX
+----------+---------------+--------------+---------------+
|    id    |    user_id    |    msg_id    |    read       |
+----------+---------------+--------------+---------------+

OUTBOX
+----------+---------------+------------------------------+
|    id    |    user_id    |    subject_id                |
+----------+---------------+------------------------------+

Когда вы отправляете сообщения, вы создаете новую строку для всех получателей в таблице входящих и в таблице исходящих для отправителя. В таблице сообщений вы вставляете одну строку с идентификатором темы и телом сообщения. В таблице субъектов вы вставляете одну строку с заголовком, автором и всеми получателями (если отправитель начал новую тему или перенаправил полный разговор или отдельное сообщение, в противном случае добавьте сообщение в таблицу сообщений, используя существующий идентификатор субъекта), чтобы это информация сохраняется, даже если один из получателей удаляет сообщения из своего почтового ящика (в этом случае удалите строку в таблице входящих).

Для исходящих сообщений флаг «читать» не нужен, и обратите внимание, что используется только идентификатор субъекта.

2 голосов
/ 14 июня 2011

Другой подход - добавить два столбца, которые будут определять, просили ли владелец или получатель удалить (скрыть) сообщение.

owner_id | user_from | user_to | mailbox_folder | Message | Owner_hide | Recipient_hide
1          1           2         Sent             Hi         1           0
2 голосов
/ 14 июня 2011

Да, есть простой способ сделать это! Наличие еще двух столбцов соответственно sender_deleted и receiver_deleted. Если один из них «удаляет» сообщение, например, вы обновили столбец значением 1. Когда вы отображаете сообщения, вы выбираете сообщения, и убедитесь, что их значение отличается от 1. Etc ...

1 голос
/ 14 июня 2011

Система PM немного сложнее, чем одна таблица. Что делать, если вы PM более одного человека? В этом случае вы бы хотели несколько таблиц. Один для пользователей, сообщений и т. Д. Вы можете связать их, используя первичные и внешние ключи.

Попробуйте поискать реляционные базы данных. Это должно помочь вам начать: http://www.databasejournal.com/sqletc/article.php/1469521/Introduction-to-Relational-Databases.htm

1 голос
/ 14 июня 2011

Вы можете добавить строки user_from_deleted & user_to_deleted и отображать сообщение, только если оно не удалено.

Для отображения сообщений в разговорах вы можете добавить parent_id и отобразить все сообщения с одинаковым parent_id

1 голос
/ 14 июня 2011

Вы бы просто создали 2 строки и добавили столбец.пример:

owner_id | user_from | user_to | mailbox_folder | Message
1          1           2         Sent             Hi
2          1           2         Inbox            Hi

Другие столбцы: уникальный идентификатор строки, метки времени, строка темы и т. д. *

Ваши почтовые ящики будут тогда построены из столбца owner_id, и у каждого пользователясвою собственную копию для перемещения / удаления по своему выбору.

Чтобы добавить беседы, вы можете добавить столбец или другую таблицу.Если это новое сообщение, получите новый идентификатор разговора, в противном случае используйте тот же идентификатор.Запрос по меткам времени.

...