我一直在考虑如何在我正在建立的网站中为用户对话构建数据库架构。
通过“对话”我的意思是一个类似于普通私人消息的系统,但类似于Facebook的离线聊天。
到目前为止,我有这个:
id
from_id
to_id
content
created_on
它有效,但我无法找到一种方法将每个对话的所有最后交换的消息都放入列表中,这让我觉得可能这db schema
不是可行的方法。
假设有users
表格带有主要数字ID,处理用户对话的最佳db schema
是什么?
干杯!
答案 0 :(得分:0)
我会这样做:
现在我认为这很好,因为你可以保存发送消息的人,消息,消息,时间和状态(读取,删除,未读,隐藏等)。
我很确定有多种方法可以做到。
答案 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