5

我正计划为我的用户制作一个 PM 系统,总的来说这似乎很容易,但是我看到制作 PM 系统的教程的方式存在一个问题。

在我计划它的工作方式中,会有像 user_from、user_to 这样的行,然后是消息 - user_from 将是发送者,并将在他的发送消息中看到消息,user_to 将是接收者并将看到消息他的收件箱。但是,如果一个用户想从他们发送的文件夹中删除一条消息,但另一个用户不想从他们的收件箱中删除它呢?

有什么简单的方法吗?

在对话中包含消息也可能很好,比如 Gmail 和 Facebook,但这可能很难编码(任何教程都值得赞赏)?

4

8 回答 8

5

使用所谓的软删除。这意味着当一条记录被“删除”时,它实际上永远不会从数据库中删除,而是设置了一个标志删除,允许您从用户界面中删除它,同时在需要时仍然可以访问数据。因此,对于这种情况,您可以再创建两个名为 user_to_delete 和 user_from_delete 的列。当其中任何一个设置为 true 时,您将知道不在相应用户的收件箱/发件箱中显示消息。祝你好运。

于 2011-06-13T21:43:45.180 回答
4

您可以通过几种方式解决此问题,但我可能会在表中添加几个标志(from_deleted、to_deleted):

  • 不要删除消息,而是将相应的标志更新为 1。
  • 列出消息时,过滤掉已标记的消息。
  • 您可以设置脚本,以便在标记后,如果两个字段都被标记,那么您实际上可以删除该行。
于 2011-06-13T21:46:19.767 回答
4

我建议以下数据库设计:

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

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

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

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

当您发送消息时,您会在收件箱表中为所有接收者创建一个新行,并在发件箱表中为发件人创建一个新行。在消息表中插入一行,其中包含主题 ID 和消息正文。在主题表中插入一行标题、作者和所有接收者(如果发件人开始新主题或转发完整对话或单个消息,否则使用现有主题 ID 在消息表中添加消息),这样即使其中一位接收者从他/她的收件箱中删除了一条消息(在这种情况下删除收件箱表中的行),也会保留信息。

对于发件箱,不需要“已读”标志,请注意仅使用主题 ID。

于 2011-06-13T22:21:47.947 回答
2

是的,有一个简单的方法来做到这一点!还有两列,分别为sender_deletedreceiver_deleted。例如,如果其中一个“删除”了该消息,则您将该列更新为 1。显示消息时,选择确保值不同于 1 的消息。等等...

于 2011-06-13T21:45:15.303 回答
2

另一种方法是添加两列,以确定所有者或收件人是否已请求删除(隐藏)消息。

owner_id | user_from | user_to | mailbox_folder | Message | Owner_hide | Recipient_hide
1          1           2         Sent             Hi         1           0
于 2011-06-13T21:46:07.640 回答
1

您只需创建 2 行,然后添加一列。例子:

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

其他列:唯一的行 ID、时间戳、主题行等...

然后,您的邮箱将根据 owner_id 列构建,并且每个用户都有自己的副本可以根据自己的选择移动/删除。

要添加对话,您可以添加一列或另一个表格。如果是新消息,则获取新的会话 ID,否则使用相同的 ID。按时间戳查询。

于 2011-06-13T21:42:58.473 回答
1

您可以添加 user_from_deleted 和 user_to_deleted 行并仅在未删除时显示消息。

要在对话中显示消息,您可以添加 parent_id 并显示具有相同 parent_id 的所有消息

于 2011-06-13T21:44:12.413 回答
1

PM 系统比一张表要复杂一些。如果你 PM 不止一个人怎么办?在这种情况下,您需要多个表。一个用于用户、消息等...您可以使用主键和外键将它们链接起来。

尝试查找关系数据库。这应该让你开始: http ://www.databasejournal.com/sqletc/article.php/1469521/Introduction-to-Relational-Databases.htm

于 2011-06-13T21:44:20.960 回答