如何设计一个站内消息系统?

291

如何设计一个站内消息系统?

明确什么是站内消息系统

举例

  • 有很多常见的例子,比如说B站的消息箱,学习通的收件箱等等。但谈这种设计,我想还是比较有意思的。

分析

  • 这里那学习通为例(因为最近可能刚好要用做类似system)截屏2022-12-28 14.57.57

  • 像这样,消息会有多种类型

    • 学习通知
    • 教师通知(甚至可以查看已读未读)
    • 作业通知
    • 点赞通知
    • 回复通知
    • 。。。
  • 但本质可以将它们归于二类,那么也将围绕这二种进行设计

    • 系统通知(由后台人员指定对象发送)
    • 事件提醒(由用户行为产生消息)

系统通知

基础设计

一般会设计两张表

消息内容表

CREATE TABLE `message_info` (
    `id`           int(11) unsigned    NOT NULL AUTO_INCREMENT COMMENT '主键ID',
    `msg_id`       varchar(32)         NOT NULL DEFAULT '' COMMENT '消息ID',
    `title`        varchar(50)         NOT NULL DEFAULT '' COMMENT '标题',
    `content`      varchar(500)        NOT NULL DEFAULT '' COMMENT '正文',
    `image`        varchar(1024)       NOT NULL DEFAULT '' COMMENT '图片地址',
    `jump_url`     varchar(1024)       NOT NULL DEFAULT '' COMMENT '跳转链接',
    `type`         tinyint(1)          NOT NULL DEFAULT 0 COMMENT '消息类型 1-系统消息 2-创作邀请 100-其他',
    `sender`       bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '发送者ID',
    `channel`      tinyint(1)          NOT NULL DEFAULT 0 COMMENT '发送渠道 1-站内 2-短信 3-推送',
    `receive_type` tinyint(1)          NOT NULL DEFAULT 0 COMMENT '发送渠道 1-白名单 2-黑名单 3-单一用户 100-全部',
    `ctime`        datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `mtime`        datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_msg_id` (`msg_id`),
    KEY `ix_mtime` (`mtime`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='消息内容表';


用户通知表

CREATE TABLE `message_notice`(
    `id`     int(11) unsigned    NOT NULL AUTO_INCREMENT COMMENT '主键ID',
    `msg_id` varchar(32)         NOT NULL DEFAULT '' COMMENT '消息ID',
    `state`  tinyint(1)          NOT NULL DEFAULT 0 COMMENT '已读状态 0-未读 1-已读',
    `mid`    bigint(20) unsigned NOT NULL DEFAULT 0 COMMENT '接收者ID',
    `type`   tinyint(1)          NOT NULL DEFAULT 0 COMMENT '消息类型 1-系统消息 2-创作邀请 100-其他',
    `ctime`  datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `mtime`  datetime            NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_mid_msg` (`mid`, `msg_id`),
    KEY `ix_mtime` (`mtime`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='消息通知表';


联系

当创建一条系统通知后,数据插入到消息内容表。消息内容包含了发送渠道,根据发送渠道决定后续动作。

https://segmentfault.com/a/1190000018238628

https://www.modb.pro/db/470696