2

我一直在考虑如何在我正在建立的网站中为用户对话构建数据库模式。

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

到目前为止,我有这个:

id
from_id
to_id
content
created_on

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

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

干杯!

4

2 回答 2

0

我会这样做:

在此处输入图像描述

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

因为现在我认为这很好,因为您可以保存发送消息的人、发送给谁、消息是什么、时间和状态(已读、删除、未读、隐藏等)。

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

于 2012-06-22T19:47:47.493 回答
0

我认为您不需要 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 
于 2012-06-25T12:45:50.910 回答