站内信设计

参考文章:https://cloud.tencent.com/developer/article/1684449

b站站内信业务设计:

消息的类型分为:

1、系统消息
2、@、点赞、回复等用户行为之间的消息(事件提醒)
3、用户之间的消息

系统消息

用一个用户消息表可以吗?

可以,但是可能在部分的业务场景中需要处理的地方很多。比如:需要给全部用户发一个营销推送,就需要一次增加大量的数据,需要做异步的处理,防止超时响应。
用户消息表t_user_system_notice
用户消息id、消息标题、消息内容、接收用户id、状态(是否发送)、拉取通知时间

我们可以创建一个系统消息通知表 t_manager_system_notice
系统消息id、标题、消息内容、消息类型(指定人、全部用户、vip用户)、是否已经发送、指定人id、发送消息的管理员、发布时间
优化(并且可以把t_user_system_notice 中的消息标题、消息内容更改为系统消息id,关联存储)

当有需要发送消息的请求的时候向t_manager_system_notice表中增加数据。再通过定时服务拉取发送到用户消息表即可,可以控制拉取的时间。

事件提醒

需要业务梳理
xxx 在某个评论中@了你;
xxx 点赞了你的文章;
xxx 点赞了你的评论;
xxx 回复了你的文章;
xxx 回复了你的评论。

可以梳理出表的结构 t_event_remind
事件id、动作类型(点赞、@、回复)、事件id、事件类型(文章、评论)、事件源的内容、事件所发生的地点链接 url、状态(是否已读)、操作者id、接收内容用户id、提醒时间

事件这里有可以优化的点,可以根据自己的系统设计来
比如一个文章有1000k的点赞,可以聚合查询展示优化用户的查看内容
可以根据按照 事件类型 和 source id 来分组的

SELECT * FROM t_event_remind WHERE recipient_id = 用户ID
AND action = 点赞 AND state = FALSE GROUP BY source_id , source_type;

如果觉得 SQL 层面的结果集处理还是很麻烦,可以先把用户所有的点赞消息先查出来, 然后在程序里面进行分组,这样会简单不少。

拓展2
其实还有一种设计提醒表的做法,即按业务分类,不同的提醒存入不同的表,这样可以分为:
点赞提醒表
回复提醒表
at(@)提醒表。

这种设计比第一种的更松耦合,不必所有类型的提醒都挤在一张表里,但是这也会带来表数量的膨胀。 所以各位小伙伴可以自行选择方案。

用户私聊

站内私信一般都是点到点的,且要求是实时的,服务端可以采用 Netty 等高性能网络通信框架完成请求。

按照这个设计,我们可以先设计出聊天室表 t_private_chat,因为是一对一,所以聊天室表会包含对话的两个用户的信息:
聊天室 ID、用户 1 的 ID、用户 2 的 ID、最后一条消息的内容

这里 user1_id 和 user2_id 代表两个用户的 ID,并无特定的先后顺序。

接下来是私信表 t_private_message 了,私信自然和所属的聊天室有联系,且考虑到私信可以在记录中删除(删除了只是不显示记录,但是对方会有记录,撤回才是真正的删除),就还需要记录私信的状态,以下是他的设计:
在这里插入图片描述

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
站内设计⽅案 ⼀、背景 当前使⽤运维平台的⽤户进⾏沟通时,更多的是依赖微信和邮件通知,⽽运维平台作为⼀个整体的产品,也需要能够进⾏内部沟通的⼀种服 务 - 站内信。 站内信的设计基调 站内信的设计基调取决于⽤户如何使⽤站内信: 1. ⽤户不会守着运维平台这个页⾯,等待消息通知,查看消息内容,然后跳转到要操作的页⾯。 1. 也就是说站内信不是第⼀⼊⼝,站内信的实时性意义也不⼤。 2. 同很多社交⽹不同(Facebook,知乎,微博等),⽤户会守在社交⽹的主页⾯,不断刷新新内容,同时检查新消息(主要 是个⼈私信、别⼈的回复等,也绝不是为了检查系统通知消息) 2. ⽤户会根据邮件通知,决定是否要进⼊运维平台进⾏操作 3. 如果邮件特别多,例如同时有多个⼯单需要⽤户处理,⽤户也会在⼯单平台提供的"我的待办"页⾯进⾏所有⼯作。 4. 如果邮件被误删了,没有邮件链接直接进⼊要操作的模块 1. 那么或者通过索要链接/单号的⽅式,前往指定页⾯ 2. 或者直接在相关模块进⾏搜索 上⾯的描述都意味着⽤户基本不会使⽤站内信,那么在什么样的场合会使⽤站内信呢? 1. 不发邮件,只发站内信的消息通知,例如全通知、编辑操作、Comment操作等 2. 当具体模块没有详细的操作记录时,可以通过查看站内信的发⽣时间 当前只有产品消息通知,消息展⽰也没有进⾏归类聚合,以后增加全通知、mention、like、comment等类型的站内信时,就需要考虑按 类型进⾏消息聚合了。 ⼆、需求描述 站内信通常需要解决两个需求: 1. ⽤户对⽤户的站内信,管理员对⽤户的站内信:即⼀对⼀发送 2. 管理员对多⽤户、⽤户组、全站内信:即⼀对多发送 (还有⼀种是⽤户对产品的站内信,例如对某个模块的反馈、疑问之类的) 我们⽬前的需求是: 1. 管理员对多⽤户发送站内信 1. 对⽤户真实性不做校验 2. 对标题长度、内容长度进⾏限制(分别是45个字节、150个字节,对应中⽂字符15个、50个) 3. 对收件⼈的拼⾳长度进⾏限制(最长50个字节) 2. ⽤户可以查看⾃⼰的站内信 1. 按"全部、已读、未读"过滤 2. 按消息来源分类:⼯单平台、资源管理、⾃动装机、漏洞平台、故障平台。。。 3. ⽤户可以删除、批量删除站内信 4. ⽤户可以已阅、批量已阅、全部标记为已读 站内信 5. 运维平台页⾯顶部的消息图标 1. 展⽰未读消息数,超过99显⽰ 99+ 2. ⿏标放上去,会有下拉框,展⽰最近10条未读消息(展⽰"时间","消息来源","标题") 3. 下拉框的底部有两个按钮:"更多",加载更多未读消息;"查看全部",跳转到站内信列表页⾯(最好另开⼀个窗⼝) 4. 点击下拉框⾥的未读消息,通过弹出框展⽰详情;然后在未读列表⾥删除该记录,在数据库⾥标记为已读,消息图标的未读消息 数量减⼀ 6. 管理员页⾯: 1. 更新⽤户 2. 删除消息 3. 统计数据 4. 增加module 5. 增加站内信类型 6. 发送全消息 三、系统设计 功能设计 功能 功能 接⼝ 接⼝ 详情 详情 发送站内信 POST /v1/message 校验module_name,校验title content receiver_name 长度 获取站内信列表 GET / 统计信息 暂⽆ 四、系统流程 发送站内信 1. 读取POST请求的request body 2. 校验长度 3. 插⼊数据库 4. 返回 获取站内信列表 1. 调⽤⼦模块,插⼊发送给全或我所属⽤户组的站内信 2. 根据查询条件,返回数据库数据 获取未读站内信数量 1. 调⽤⼦模块,插⼊发送给全或我所属⽤户组的站内信 2. 返回数量 批量已阅 1. 检查messageId是不是属于当前⽤户 2. inbox_message表⾥把 read 置为1,修改update_time 全部已阅 1. update inbox_message set "read"=1, "update_time"=now where "receiver_name"=currentUser() and "read" = 0 批量删除 1. 检查messageId是不是属于当前⽤户 2. inbox_message表⾥把 deleted 置为1,修改update_time 全部删除 1. update inbox_message set "deleted"=1, "update_time"=now where "receiver_name"=currentUser() and "deleted" = 0 五、数据库设计 站内信内容表 Field Field Type Type Null Null Key Key Default Default Extra Extr
好的,下面是一个简单的Java站内设计思路: 1. 数据库设计 首先需要设计一个数据库用于存储站内信的信息,可以考虑以下几个表: - 用户表:用于存储系统用户的基本信息,包括用户ID、用户名、密码、邮箱等信息。 - 消息表:用于存储站内信的基本信息,包括消息ID、发送者ID、接收者ID、消息标题、消息内容、发送时间、是否已读等信息。 - 消息附件表:如果您想让用户可以附加文件,请设计一个消息附件表,用于存储附件的信息,包括附件ID、消息ID、附件名称、附件类型、附件大小、上传时间等信息。 2. 后台实现 在后台实现中,需要考虑以下几个方面: - 用户登陆:用户需要先登陆系统才能使用站内信功能,因此需要设计一个登陆页面和相关的登陆逻辑。 - 发送消息:用户可以通过站内信发送消息给其他用户,因此需要设计一个发送消息页面和相关的发送逻辑。 - 查看消息:用户可以查看自己收到的消息,因此需要设计一个消息列表页面和相关的查询逻辑,同时还需要支持分页查询。 - 删除消息:用户可以删除自己收到的消息,因此需要设计一个删除消息的逻辑。 - 附件上传和下载:如果您设计消息附件表,那么还需要支持附件的上传和下载功能。 3. 前端实现 在前端实现中,需要考虑以下几个方面: - 用户登陆页面:设计一个用户登陆页面,可以根据实际需求添加验证码等功能。 - 发送消息页面:设计一个发送消息页面,包括消息标题、消息内容、接收者等信息。 - 消息列表页面:设计一个消息列表页面,用于显示用户收到的消息,同时还需要支持分页查询。 - 消息详情页面:设计一个消息详情页面,用于显示消息的详细信息,包括消息标题、消息内容、发送者、发送时间等信息。 - 附件上传和下载功能:如果您设计消息附件表,那么还需要设计一个附件上传和下载功能。 以上是一个简单的Java站内设计思路,具体实现可能会根据实际需求有所不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值