1)添加全站通知:信息存入到 tb_message 2)用户点开信息或者设置信息为已阅读:插入记录到 tb_message_readlog

如何设计存储的表?求最佳方案


CREATE TABLE `message` (
`message_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '消息id',
`subject` varchar(250) NOT NULL DEFAULT '' COMMENT '主题',
`content` varchar(500) NOT NULL DEFAULT '' COMMENT '内容',
`type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '消息类型 0 Message',
`status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '状态 -1删除 0默认',
`create_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',
PRIMARY KEY(`message_id`),
KEY `subject` (`subject`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `message_broadcast` (
`message_broadcast_id` bigint(20) NOT NULL AUTO_INCREMENT,
`message_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '消息id',
`sender` bigint(20) NOT NULL DEFAULT '0' COMMENT '发送者',
`receiver` bigint(20) NOT NULL DEFAULT '0' COMMENT '接收者',
`is_read` tinyint(1) NOT NULL DEFAULT '0' COMMENT '状态 0未读 1已读',
PRIMARY KEY(`message_broadcast_id`),
KEY `message_id` (`message_id`),
KEY `sender` (`sender`),
KEY `receiver` (`receiver`),
KEY `is_read` (`is_read`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='消息广播表';

大概思路跟你的差不多,这样就可以满足大部分的消息了

1.tb_message (id,content,fromUid,toUid [0表示全站用户,>0表示发送给某个用户])
2.tb_message_readlog (readLogId,messageId,uid,isread)

不过如果你的消息数据量比较大,建议你分表处理,可以根据用户的id来分表,比如id=123456的用户发送的消息就放到tb_message6,类似这样的处理


消息表message:
编号 id
时间 date
标题 title
正文 content
未读用户 unread
接收用户 receive
发送用户 send

字段receive保存消息接收人的ID序列如1,2,3,4(用逗号分隔).
字段unread保存未阅读消息的接收人的ID序列,unread初始值也为所有接收人,阅读过消息的用户则从中删除掉.
可以用MySQL内部函数FIND_IN_SET(返回找到的位置,从1开始)进行查询.
比如,查询编号为2的用户的未读信息:

SELECT * FROM `message` WHERE FIND_IN_SET('2', `unread`);

或者使用全文检索(需要对字段unread建立全文索引,ID序列用空格隔开,如1 2 3 4):

SELECT * FROM `message` WHERE MATCH(`unread`) AGAINST('2');

数据量比较大的话,FIND_IN_SET可能会存在性能问题,建议定时清理消息表过期的已经阅读过的消息.

最新文章

  1. asp.net mvc 模型验证注解,表单提交
  2. Java Little Knowledge
  3. Android IOS WebRTC 音视频开发总结(七五)-- WebRTC视频通信中的错误恢复机制
  4. 【转载】理解GL_TRIANGLE_STRIP等绘制三角形序列的三种方式
  5. Jfreechart 乱码
  6. VB 读取csv文件数据
  7. Agile.Net 组件式开发平台 - 组件开发示例
  8. CI 模板解析器类
  9. 利用Python对文件批量重命名
  10. Celery初识及简单实例
  11. 【转载】C#将图片转换为二进制流调用
  12. 论文笔记【三】A Deep Dive into Word Sense Disambiguation with LSTM
  13. Deep Learning Terminologies
  14. anaconda资源链接
  15. EasyTouch中多种QuickGesture手势检测
  16. 50道Java线程面试题(转载)
  17. bzoj 2243
  18. linux下查看doc在线帮助文件
  19. 第6章 HDFS HA配置
  20. springboot 连接redis

热门文章

  1. classification tips 01: npy file
  2. 注解 - @Deprecated
  3. sql查询——子查询
  4. Whctf 2017 -UNTITLED- Writeup
  5. Apache Kafka(五)- Safe Kafka Producer
  6. 题解【洛谷P1074】[NOIP2009]靶形数独
  7. Scanner的hasNext()方法
  8. bugku 宽带信息泄露
  9. Codeforces Round #599 (Div. 2) B1. Character Swap (Easy Version)
  10. python中的循环结构等相关知识