一、概述
在B/S系统的设计与实现中,通知系统的开发是必不可少的一部分。在很多情况下,我们都需要使用通知这个提醒功能,比如,我们写了一篇文章,发了一个动态,这时候有人点赞、评论等,就应该会通知到我们,好让我们了解到他们的反馈,进一步改进我们写的东西。不同的系统对通知的需求和要求都不一样,因此设计方案也会有所差别。通知功能的设计也会随着系统用户的增加而不断的优化,从而达到较高的性能和良好的用户体验。
二、系统设计
本篇通知系统的设计与实现,采用的是MySQL数据库,Java开发语言,其他的开发语言也类似,这里的设计针对的是用户数量在百万以内的情况,当用户数量巨大的时候,需要考虑的情况就比较复杂了,单单设计几张数据库表是解决不了这个问题的,这时不仅要考虑数据的冗余性,而且还要考虑系统用户的活跃度、消息的时效性等等。根据活跃度,通知需求、时效这些要求的不同,我们还需要设计通知消息不同的获取方式,是主动推送还是被动拉取。当消息量达到一定程度的时候,对于历史消息数据的处理,又是需要认真考虑的问题。这些问题的解决,是随着我们系统的不断升级,用户量不断增加的情况下而逐步进行的,并不需要在系统的设计之初就开始费力去解决这不是核心功能的问题,而且在没有具体应用场景的情况下,我们也很难去针对性的设计系统。
站内通知包括:1) 点对点的通知,例如点赞,评论等;2) 点对面的通知,系统管理员对系统内的部分或者全部用户发送通知公告。
2.1 表的设计: 数据库设计包含两张表,一张存储消息发送记录表,另外一张存放具体的消息内容。具体的设计如下:
2.1.1 message表,存放信息发送记录表:这个表里面包括:发送者和接收者的ID,消息详细内容的ID,阅读的状态,创建时间。
2.1.2 message_info表,存放具体的消息内容,主要包括:消息主体的ID,这里指的是具体的某一篇文章、评论、人物的ID,例如:张三点赞了李四的“关于站内通知系统的设计”这篇文章,这里的 target_id 就是这篇文章的ID,这样设计的目的是为了便于快速的找到消息的主体,给通知对象定位到具体的通知内容。msg_type 是消息的类型,例如,点赞、评论。title代表标题,系统通知的时候用的更多一些。
2.2 表的应用场景举例:
2.2.1 点对点的通知:
例如:张三点赞了李四的“关于站内通知系统的设计与实现”这篇文章;这样的一条通知,由张三发起,李四接收,消息类型是 点赞,消息目标对象 target_id 是 “关于站内通知系统的设计” 这篇文章的ID,title 可以设置成文章名称,也可以设置为null,程序实现的时候可以通过ID获取到文章的相关信息,content 就可以写成举例的这个通知内容。两个表里面的时间可以保持一致。
2.2.3 点对面的通知:
管理员发送通知给站内的所有用户或者部分用户,这里的用户筛选,需要在程序里面进行,数据库只记录发送给了谁。例如:管理员给站内年级大于60岁的用户发送早起锻炼活动通知,那么首先根据年级大于60这个搜索条件找到所有年级大于60岁的用户,然后再批量向数据库中插入这些记录,target_id为活动的ID,title 为活动通知,当然也可以为空,可以选择把将这个title的内容放在content里面,具体情况具体对待,content为 早起锻炼活动,然后用户接收到这条通知之后,可以根据 target_id 找到具体活动详情。
三、 系统实现:
这里介绍如何通过SQL语句操作数据库表实现相关的功能,各种编程语言可以调用这些SQL,集成到系统中去。
3.1 获取某一用户的所有未读消息:
首先通过user_id找到消息记录,然后再找到具体的消息内容。
1 | SELECT message.*,message_info.target_id,message_info.title,message_info.msg_type,message_info.content |
3.2 给某一用户发送点赞通知:
这个需要向两个表里面插入数据,在message表里面插入通知记录,在message_info表里面插入具体的消息内容。需要使用数据库事务这个操作,避免数据不一致性,事务的使用可以在编程语言方面实现,也可以在数据库方面实现,这个要看系统的具体需求。
3.3 给所有用户发送系统通知:
这个通知的发送,和上面一样,不同点就是需要先获取那些到用户ID,然后批量插入,也是插入两张表。
四、总结:
通知功能对系统来说是很重要的一个模块,不同的系统有着不同的设计,随着系统功能的升级,通知模块也在不断的升级,因此需要根据需要来不断地进行改进。
本文设计的通知模块在用户量不是超大的情况下是足以满足使用的,该模块也正在博主目前所开发的系统中运行着,随着系统中用户量的增加,我也在不断地改进这个设计,力求高效稳定。欢迎有需求的童鞋们一起交流。