用户对话的数据库架构

时间:2012-06-22 19:27:25

标签: mysql database-schema

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

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

到目前为止,我有这个:

id
from_id
to_id
content
created_on

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

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

干杯!

2 个答案:

答案 0 :(得分:0)

我会这样做:

enter image description here

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

现在我认为这很好,因为你可以保存发送消息的人,消息,消息,时间和状态(读取,删除,未读,隐藏等)。

我很确定有多种方法可以做到。

答案 1 :(得分: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