站内消息设计

简介:

设计优点,发系统消息给全站用户只需一条记录,不需要每个用户都插入,解决用户量大的问题

登录用户只显示未读的消息。用户查看未读消息后,将消息插入消息回收站表标记为已读,uid与该用户绑定,因此回收站表没有uid=system的记录

2)已读消息列表:实现方法有2种取其一即可

  2.1)插入消息回收站表并删除用户的未读消息表对应记录(非system)

  2.2)插入消息回收站表

删除的消息列表:只插入消息回收站表,

未读消息:当前用户没有读过的消息

 

未读消息/消息表

Java代码   收藏代码
  1. DROP TABLE IF EXISTS `msg`;  
  2. CREATE TABLE `msg` (  
  3.   `id` int(11) unsigned NOT NULL AUTO_INCREMENT,  
  4.   `mail` varchar(60) NOT NULL DEFAULT 'system' COMMENT '邮箱:默认为system表示发给所有用户',  
  5.   `title` varchar(50) DEFAULT NULL COMMENT '标题',  
  6.   `content` text NOT NULL COMMENT '内容',  
  7.   `createtime` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',  
  8.   PRIMARY KEY (`id`)  
  9. ) ENGINE=MyISAM AUTO_INCREMENT=14 DEFAULT CHARSET=utf8 COMMENT='公告表';  
  10.   
  11. INSERT INTO `msg` VALUES (1,'system','系统公告','今天天气不错',1394421260);  
  12. INSERT INTO `msg` VALUES (2,'test@163.com','用户i','aaaaaaaaaaaa',1394421299);  
  13. INSERT INTO `msg` VALUES (3,'danny@qq.com','用户公告heihei','aaaaaaa',1394421299);  
  14. INSERT INTO `msg` VALUES (4,'system','系统公告2','第二条消息',1394421260);  

 已读消息或删除消息

Java代码   收藏代码
  1. DROP TABLE IF EXISTS `msgrecycle`;  
  2. CREATE TABLE `msgrecycle` (  
  3.   `id` int(11) NOT NULL AUTO_INCREMENT,  
  4.   `uid` varchar(200) NOT NULL COMMENT '用户id',  
  5.   `msgid` int(11) NOT NULL COMMENT '消息id',  
  6.   `isread` int(1) unsigned NOT NULL DEFAULT '0' COMMENT '0-未读  1-已读',  
  7.   `isdelete` tinyint(1) NOT NULL DEFAULT '0' COMMENT '0-未删除 1-删除',  
  8.   PRIMARY KEY (`id`)  
  9. ) ENGINE=MyISAM AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;  
  10.   
  11. LOCK TABLES `msgrecycle` WRITE;  
  12. INSERT INTO `msgrecycle` VALUES (1,'test@163.com',2,1,0);  
  13. INSERT INTO `msgrecycle` VALUES (2,'danny@qq.com',3,0,1);//删除的未读消息  
  14. INSERT INTO `msgrecycle` VALUES (3,'test@163.com'110); //test@163.com用户已读的system消息  
  15. UNLOCK TABLES;  

 

显示用户已读消息mr.uid='test@163.com'

2.2)

Java代码   收藏代码
  1. select * FROM msg m left join msgrecycle mr on m.id=mr.msgid where (m.mail='system' or m.mail='test@163.com') and mr.uid='test@163.com' and isread=1 and isdelete=0  

2.1)

Java代码   收藏代码
  1. select * FROM msgrecycle where uid='test@163.com' and isread=1 and isdelete=0  

 

显示用户未读消息 = 消息回收站表没有读过的用户消息记录+消息回收站表没有读过的系统消息记录

消息回收站表没有读过的用户消息记录

Java代码   收藏代码
  1. select m.* FROM msg m left join msgrecycle mr on m.id=mr.msgid where m.mail='test@163.com' and mr.id is null   
 消息回收站表没有读过的系统消息记录
Java代码   收藏代码
  1. select * FROM msg where mail='system' AND id not in (select m.id FROM msg m left join msgrecycle mr on m.id=mr.msgid where m.mail='system' and mr.uid='test@163.com' and isread=1 and isdelete=0)   
 
相关文章
|
5月前
|
存储 小程序 前端开发
如何设计小程序的站内信功能
如何设计小程序的站内信功能
210 0
|
7月前
|
消息中间件 JavaScript 物联网
MQTT常见问题之用rocketmq mqttdemo的MqttConsumer始终无法接收到消息如何解决
MQTT(Message Queuing Telemetry Transport)是一个轻量级的、基于发布/订阅模式的消息协议,广泛用于物联网(IoT)中设备间的通信。以下是MQTT使用过程中可能遇到的一些常见问题及其答案的汇总:
|
7月前
|
消息中间件 存储 监控
Kafka:新闻发布站的比喻
Kafka:新闻发布站的比喻
57 1
|
前端开发 Cloud Native 大数据
坑爹,线上同步近 3w 个用户导致链路阻塞引入发的线上问题,你经历过吗?
坑爹,线上同步近 3w 个用户导致链路阻塞引入发的线上问题,你经历过吗?
|
开发框架 JavaScript 数据库
站在源码的角度看多人语音厅房间系统
关于多人语音厅房间系统的管理以及权限,今天来整合交流下。
站在源码的角度看多人语音厅房间系统
|
人工智能 文字识别 自然语言处理
看了那场直播后,我们发起了一个讨论
看了那场直播后,我们发起了一个讨论
|
消息中间件 XML 缓存
从使用者角度来看消息队列产品
众所周知,当下云计算的快速发展,伴随着日益流行以及普及的分布式架构,让消息队列领域也得到了联动发展。消息队列作为一种重要的异步通信机制,被越来越多的企业和开发者所采用。消息队列不仅可以解耦系统中的各个服务,提高系统的可扩展性和性能,还可以实现异步通信、数据缓存、数据同步等多种应用。当前,市面上常见的消息队列产品包括 Kafka、RabbitMQ、RocketMQ 等。从使用者的角度来看,这些消息队列产品在哪些方面值得注意,哪些方面需要改进,接下来将进行对应的探讨。
107 0
从使用者角度来看消息队列产品
|
存储 消息中间件 NoSQL
一口气说出 6 种实现延时消息的方案,还有谁不会?!
一口气说出 6 种实现延时消息的方案,还有谁不会?!
|
消息中间件 Java RocketMQ
消息消费要注意的细节|学习笔记
快速学习消息消费要注意的细节
消息消费要注意的细节|学习笔记