首页 新闻 会员 周边

如何设计用户对话表?

0
悬赏园豆:10 [已解决问题] 解决于 2021-12-30 13:26

想要实现用户之间的对话功能,但在设计表结构这就难住了。目前只想实现两人对话功能,多人组群对话暂时不考虑。要求能按时间顺序从数据库中查询出指定两个用户之间的对话。

我最初的设想是为消息附加发送者id(sender_id)、接收者id(receiver_id)和发送时间(send_time),那么查询id分别为1和2的两个用户之间的对话的sql语句是

select * from message where (sender_id=1 and receiver_id=2) or (sender_id=2 and receiver_id=1) order by send_time limit 10, 10;

即使已经为message表创建了复合索引(sender_id, receiver_id, send_time)、(receiver_id, sender_id, send_time),通过explain语句可以发现上面这条语句使用了全索引扫描,数据量大了性能肯定会比较差,所以这种表设计不可行。

第二种设想是为每条消息创建两个副本,这两个副本分别属于发送者和接收者,表中有两列master_id和opposite_id表示消息的拥有者id和交谈对方的用户id,复合索引是(master_id, opposite_id, send_time),查询id分别为1和2的两个用户之间的对话的sql语句是

select * from message where master_id=1 and opposite_id=2 order by send_time limit 10, 10;

这样做的优点是可以使用索引,性能较好,但是每条消息都有两个副本,有数据冗余。

第三种设想是把所有对话当做组群聊天,两人对话当做组员人数为2的组群聊天。这样的话需要3个表:组群表、用户-组群关联表、消息表,我还没有深入思考这种设计,目前只是觉得这种设计比较复杂。

不知道各位对于设计用户对话表有什么设想?

Halloworlds的主页 Halloworlds | 初学一级 | 园豆:190
提问于:2021-12-23 19:12
< >
分享
最佳答案
1

如果不考虑群聊。我觉得第二种就行,为了速度,加点冗余没啥,五花肉和猪大肠不可兼得(用户大概有多少?每秒钟大概能发多少聊天?)

收获园豆:10
会长 | 专家六级 |园豆:12401 | 2021-12-23 19:48

只是个练手项目,没考虑用户数和并发数

Halloworlds | 园豆:190 (初学一级) | 2021-12-23 20:07

@Halloworlds: 我记得我之前参与过一个类似的,就是存了两份

会长 | 园豆:12401 (专家六级) | 2021-12-23 20:19
其他回答(1)
0

这个我开发过,,用户用id字段,记录对话两人的id,做好索引,每次查询查最新记录就行。

帅进 | 园豆:248 (菜鸟二级) | 2022-01-17 17:02
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册