一对一用户消息传递数据库架构

时间:2016-01-26 17:57:49

标签: laravel database-design chat database-schema

我正在考虑如何为私有一对一用户消息传递(使用Laravel)实现数据库架构。所有线程只是一对一,因此没有组消息或多个参与者。最好的例子是约会网站,其中用户的每个消息线程都由收件人代表。

起初,我做了最简单的一个表格方法。像这样:

id,sender_id,recipient_id,body

这很好用。然而,主要问题是用户无法在其他用户保留消息时删除对话。

另一种方法是使用三个表:消息,线程,参与者。 这与多个参与者的方法相同,我只是限制为两个。然后,如果用户删除了一个帖子,我可以简单地将他从该帖子的参与者中删除。

现在这是这种方法的问题。假设用户A向用户B发送消息。然后用户A删除该线程(从线程参与者中删除)。用户B可以保留消息(他是参与者)。如果现在用户A再次向用户B发送消息怎么办?这实际上会创建一个新线程,因为该用户丢失了旧线程。但是消息实际上需要转到旧线程,因为两个用户之间总是只有一个线程。

我有点失去了如何实现这一点。对于用户之间只有一对一消息传递,您建议使用哪种数据库架构,同时允许线程删除?

提前致谢!

1 个答案:

答案 0 :(得分:2)

我的建议是保留单表方法,并考虑用户删除线程作为一种操作,而不是实际删除数据,隐藏应用程序中该用户的消息从现在开始。

这可以通过以这种方式修改表来实现:

id, sender_id, recipient_id, hidden_to_sender, hiddent_to_recipient, body

这样,当用户删除一个帖子时,其所有邮件都被标记为对他隐藏(并且给他)。当他向其他人发送新消息时,只需添加前一个帖子,对于这两个参与者,隐藏设置为false。

您还可以考虑进行优化,以便当用户与其他用户删除对话时,如果所有邮件都被标记为对其他用户隐藏,则可以将其删除,而不是将邮件标记为隐藏到第一个用户。