数据库设计:私人聊天、群聊和电子邮件

Posted

技术标签:

【中文标题】数据库设计:私人聊天、群聊和电子邮件【英文标题】:Database Design: private chat, group chat, and emails 【发布时间】:2011-09-10 12:03:38 【问题描述】:

Facebook 用户之间的交流似乎存储在一个漫长的“对话”中。因此,发送的电子邮件和交换的私人聊天消息似乎都是一个长期持续对话的一部分。

我认为这个实现对用户来说效果很好(至少它对我有用)。我假设这部分的表格设计可以这样实现:

TABLE: message
 - message_id
 - timestamp
 - from_user_id
 - to_user_id
 - message

如果我想支持群聊怎么办?我会这样做吗:

TABLE: message
 - message_id
 - timestamp
 - from_user_id
 - message

TABLE: message_recipient

 - message_recipient_id
 - message_id
 - to_user_id

我认为它会起作用。但是,我想知道如果我显示用户在一次长时间对话中向任何人发送过的每一件事,这对用户是否有意义。它可能不会。想象一下与人 A 的对话与与人 A、B、C、D 的小组对话与与人 E 的对话等等......

关于什么是可以实施的可用概念的任何建议?

【问题讨论】:

【参考方案1】:

我认为消息应该是一个实体,无论平台或发送者/接收者如何,具有idmessagetimestamp 字段和一个消息关系表 - 就像你建议的那样 - 带有 id,@ 987654325@,from_id,to_id。 然后,如果您要显示单个用户到用户的对话,则可以显示他们之间的每条消息。 对于群聊,您应该有一个包含id,title,timestamp 的表来保存群聊主记录,以及另一个包含属于该群聊的用户的表,id,@ 987654332@,user_id 字段。

只是我的意见以及我将如何实施它。

编辑:也许在消息实体本身上有from_id 是有意义的,因为消息必须有一个单一的发件人ID。

【讨论】:

【参考方案2】:

您还可以按主题对消息进行分组。 您添加一个主题表。您添加一个与主题相关联的收件人表。消息也将与主题相关联。

您可以通过查看哪个主题的收件人中有这两个用户,以编程方式限制两个用户之间的主题。 您还可以通过给它们一个类型属性来分隔您的消息。例如,类型 0 将是收件箱消息,类型 1 将是聊天消息等等。

如果我想在一个主题中有任意数量的收件人,我会避免使用 from_id/to_id 组合。

【讨论】:

以上是关于数据库设计:私人聊天、群聊和电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

微信聊天的长连设计探讨之负载均衡

python实现简单聊天应用 python群聊和点对点均实现

Flutter asyncMap 直到 setState 才会运行

聊天的数据库模式:私人和群组

Netty网络聊天 聊天室实战

javascript基于websocketnodejsuniapp的聊天室