文章目录
一、数据库设计
很多人以为消息模块的数据表设计起来很简单,创建一个 消息表 就可以存储系统消息了,我只
能说,你把问题想简单了。
公告消息记录应该全局唯一,还是为每个用户创建一条公告消息?
这个问题取决于你是怎么理解系统消息的,如果你不希望系统记录用户是否阅读了某条消息,哪
些消息是未读消息,那么一个公告消息在数据表中就是一条唯一的记录,存储起来非常节省空
间。但是很少有系统会这么设计,如果系统消息很多,又不告诉用户哪些是已读消息,哪些是未
读消息,造成用户体验非常不好。所以系统必须要记录下来,用户阅读了哪些消息,还有哪些消
息是未读的。
如果一个电商系统有800万注册用户,那么系统发出一条公告消息之后,意味着要在消息表中插
入800万条消息记录,每条记录是发给某位用户的公告消息。瞬间数据库的负载达到顶峰,数据
库被大量的写入操作占用,导致电商系统正常的业务无法展开。请记住,一条公告消息就能让电
商系统濒临崩溃。微信有11亿的日活用户,如果微信给所有用户发出一条公告消息,岂不是微信
的服务器就挂了?看来消息模块的数据库架构确实有技术含量。
DROP TABLE IF EXISTS `messsage`;
CREATE TABLE `messsage` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`send_user` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '发送人',
`content` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '消息内容',
`send_time` datetime NULL DEFAULT NULL COMMENT '消息发送时间',
`title` varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '主题',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
DROP TABLE IF EXISTS `messageref`;
CREATE TABLE `messageref` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`messageId` bigint(20) NULL DEFAULT NULL COMMENT '消息ID',
`resave_user` int(11) NULL DEFAULT NULL COMMENT '消息接收人ID user-id',
`status` tinyint(1) UNSIGNED ZEROFILL NULL DEFAULT NULL COMMENT '已读状态 0未读 1已读',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
二、系统消息的发送与收取设计
三、业务设计
用户登陆系统的时候,后端系统要创建异步线程,接收消息队列MQ中的消息,然后把消息写到数据库里面。
四、消息实体设计
package com.buba.wechatsk.pojo;
import java.io.