一对一的用户消息传递数据库模式

Posted

技术标签:

【中文标题】一对一的用户消息传递数据库模式【英文标题】:One-to-one user messaging database schema 【发布时间】:2016-01-26 17:57:48 【问题描述】:

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

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

id,sender_id,recipient_id,body

这很好用。然而,主要问题是一个用户不能删除对话而其他用户保留消息。

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

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

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

提前致谢!

【问题讨论】:

【参考方案1】:

我的建议是离开单​​表方法,并将用户删除线程视为一种操作,而不是实际删除数据,隐藏应用程序中给该用户的消息从这一刻起。

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

id, sender_id, recipient_id, hidden_to_sender, hiddent_to_recipient, body

因此,当用户删除线程时,其所有消息都被标记为对他隐藏(并且对他)。当他向其他人发送新消息时,它只是简单地添加了之前的线程,并且对于两个参与者都将隐藏设置为 false。

您还可以考虑进行优化,当用户删除与另一个用户的对话时,如果所有消息都被标记为对其他用户隐藏,您可以删除它们,而不是将消息也标记为隐藏第一个用户。

【讨论】:

以上是关于一对一的用户消息传递数据库模式的主要内容,如果未能解决你的问题,请参考以下文章

用于一对一消息传递的 Firebase 数据库结构?

如何使用 Firebase 消息传递一对一消息

如何使用 Firebase 消息传递一对一消息

将聊天消息传递给离线用户的问题

如何使用 Laravel 一对一将用户数据传递到 JSON 文件中

JMS消息传递类型特点介绍