想要实现用户之间的对话功能,但在设计表结构这就难住了。目前只想实现两人对话功能,多人组群对话暂时不考虑。要求能按时间顺序从数据库中查询出指定两个用户之间的对话。
我最初的设想是为消息附加发送者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: 我记得我之前参与过一个类似的,就是存了两份
这个我开发过,,用户用id字段,记录对话两人的id,做好索引,每次查询查最新记录就行。