【问题标题】:DB schema for user conversations用户对话的数据库模式
【发布时间】:2012-06-25 03:29:13
【问题描述】:

我一直在考虑如何在我正在构建的网站中构建用于用户对话的数据库架构

我所说的“对话”是指类似于普通私人消息系统的系统,但类似于 Facebook 的离线聊天。

到目前为止,我有这个:

id
from_id
to_id
content
created_on

它有效,但我无法找到一种方法将每个对话的所有最后交换的消息都放入一个列表中,这让我觉得这db schema 可能不是要走的路。

假设有一个带有主要数字 id 的 users 表,那么处理用户对话的最佳 db schema 是什么?

干杯!

【问题讨论】:

  • 使用此模式从对话(用户到用户)中获取所有消息有什么问题?你尝试了什么?
  • 我的问题是如何对结果进行分组以仅显示每个用户之间交换的最后一条消息的列表。

标签: mysql database-schema


【解决方案1】:

我会这样做:

  • 表用户拥有用户 ID 以及您拥有的其他信息。
  • 存储用户与用户对话的关系表,但这是 1 个用户与 1 个用户的聊天,如果您希望 N 个用户与 M 个用户同时对话,它应该是不同的设计。

现在我认为这还不错,因为您可以保存消息的发送者、发送者、消息内容、时间和状态(已读、删除、未读、隐藏等)。

我很确定有不止一种方法可以做到这一点。

【讨论】:

  • 这基本上就是我所拥有的。
【解决方案2】:

我认为您不需要 from_id 和 to_id,只需要 from_id。您将按日期确定对话中的第一条和最后一条消息。

但是,为了简单和性能起见,我会制作一个以用户为中心的联结表:

user_id  with_user_id conversation_id  last_read_id
-------  ------------ ---------------  --------------
1        2            1                1
1        3            2                0
2        1            1                2
3        1            2                1

然后,对于对话:

id  conversation_id  from_id  content  created_on
--  ---------------  -------  -------  ----------
1   1                1        hello    2012-06-01 12:00:00 
2   1                2        hi       2012-06-01 12:10:01
3   2                3        howdy    2012-06-01 12:40:10

因此,当某人想要开始对话时,您可以检查连接表以查看他们是否已经在与该人进行对话。如果是,请继续。

如果是新对话,请确保在联结表中为每个用户添加记录。联结表中的 last_read_id 列是指会话表中的 id。

获取用户 1 的所有未读消息:

SELECT c.* FROM junction j
JOIN conversation c
ON c.conversation_id = j.conversation_id
AND c.id > j.last_read_id
WHERE j.user_id = 1
ORDER BY c.created_on DESC

结果:

id  conversation_id  from_id  content  created_on
--  ---------------  -------  -------  ----------
3   2                3        howdy    2012-06-01 12:40:10
2   1                2        hi       2012-06-01 12:10:01

获取用户 1 和用户 2 之间的所有消息(从用户 1 的角度):

SELECT c.* FROM junction j
JOIN conversation c
ON c.conversation_id = j.conversation_id
WHERE j.user_id = 1 AND j.with_user_id = 2
ORDER BY c.created_on DESC

结果:

id  conversation_id  from_id  content  created_on
--  ---------------  -------  -------  ----------
2   1                2        hi       2012-06-01 12:10:01
1   1                1        hello    2012-06-01 12:00:00 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 2018-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多