微信qq社交软件单发与群发消息表设计
开发中我们经常碰到系统需要设计消息,那么消息又分为单发与群发消息
单发就是只这个消息是发给某一个用户,群发就是这个消息是发给所有的用户或部分用户
那么我们不可能采用传统的方式,每一条消息都要插入一条记录,那么如果有10万用户,群发一条消息,那么就要插入10万条记录,这很明显是不对的,数据库吃不消
那么我们怎么设计呢,我们只要设计一个消息表与用户消息表,消息类型我们设置0为系统全局消息,所有用户都能收到,1为群用户,群内用户可以收到,2为单个用户,单个用户可以收到
ID | MESSAGE | MESSAGETYPE | TOUID | FROMUID |
---|---|---|---|---|
1 | 全局消息 | 0 | 0 | 0 |
2 | 群消息 | 1 | 3 | 5 |
2 | 单个用户消息 | 2 | 4 | 5 |
ID | QUNNAME | CREATEUID |
---|---|---|
1 | 公司群 | 1 |
2 | 技术群 | 2 |
3 | 销售群 | 3 |
UID | QUNID | ISADMIN |
---|---|---|
1 | 2 | 1 |
2 | 2 | 0 |
3 | 2 | 0 |
那么每个用户怎么获得自己的所有消息呢,请看下面的sql
select * from A where touid=用户id or messagetype=0 or (messagetype=1 and touid in (select qunid from C where C.UID=用户id))这样就可获取用户的个人、群、全局消息了
那么如果记录已读消息呢
UID | MID | READTIME |
---|---|---|
1 | 1 | 2019-12-12 |
2 | 2 | 2019-12-1 |
好的,消息阅读表也建好了,那么怎么获取未读消息呢,请看下面的sql
select * from A where (touid=用户id or messagetype=0 or (messagetype=1 and touid in (select qunid from C where C.UID=用户id))) and A.id not in (select mid from D where D.uid=用户id)好了,消息这块的处理就完了,当然在大型系统中,消息记录采用的是边缘数据库的方式进行处理,服务端存储一份,客户端都有自己的消息数据库,客户端与服务端的数据库定期进行更新矫正,这样客户端的数据可以脱离服务器进行使用,也就是离线应用,这也减轻了服务端的压力,提高了并发,边缘计算也是以后的趋势,去中心化也同样是未来的趋势
今天我们就写到这了,太晚了,洗洗睡了
网友评论0