随着WEB2.0的发展,用户之间的信息交互也变得十分庞大,而且实时性要求越来越高。现在很多SNS网站和一部分CMS网站都广泛地应用了站内信这一模块,这个看似简单的东西其实背后隐藏着很多需要设计师重视的设计细节,要做好这个“邮递员”是很不容易的。为什么这么说呢?下面我们就一步步来探索设计一个百万级用户量的站内信群发数据库,看完以后你就会明白什么是真正可靠高效的“邮递员”。

1、几十——几百的用户量

这样的网站规模最小,可能是一个中小企业的CMS系统,面对这样的用户量,我们就不必要考虑短消息数据量太大的问题了,所以按照怎么方便怎么来的原则,群发就每人复制一条消息数据,这样用户可以自己管理自己的消息,可以非常方便进行“已读、未读、删除”等操作。按照这个思路,我们的数据库设计如下:

表T_Message

这样,我们接受自己的消息时只要做如下查询:

查询自己的未读消息只要做如下查询:

这种方法很简单,可能是我们第一个想到的,对于这样的用户量的情况这样的设计确实也足够了。

2、几千——几万的用户量

用户量到了这样的级哦别,这个网站应该算是比较大了,笔者估计,可能是一个地区性的SNS网站。那么面对这样的用户量,我们又该如何来设计站内信群发呢?上面第一种思路还行得通吗?应该这样说,如果勉强要用上面那种设计,也是可以的,只不过T_Message可能要考虑分区。但是,大家会不会觉得消息正文复制那么多条对于这样的用户量来讲空间浪费太大,因为考虑到接收者一般是不修改消息正文的,所以我们可以让所有接收者共享一条消息正文。具体数据库设计方法和上面大同小异:

T_Message

T_MessageText

这样,我们就大大节省了消息的存储空间,但是查询的时候就稍微麻烦一点,就需要进行联合查询了,查询自己的未读消息可以这样(意思一下,可能还有更高效的查询方式):

用这种方法除了正文我们不能随便删除外,用户还是可以自己管理自己的消息。

3、百万级大用户量

如果一个网站到了百万级的用户量了,那我不得不膜拜该网站和网站经营者了,因为经营这样的网站一直是笔者的梦想:)好了,回归正题,如果这样的系统放你面前,让你设计一个站内信群发数据库,你该何去何从,总之,上面两种常规的办法肯定是行不通了的,因为庞大的数据量会让消息表撑爆,即使你分区也无济于事。这时候作为一个系统架构师的你,可能不仅仅要从技术的角度去考虑这个问题,更要从用户实际情况去着手寻找解决问题的办法。这里,有一个概念叫“活跃用户”,即经常登录网站的用户,相对于那些一时冲动注册而接下来又从来不登录的用户来说,活跃用户对网站的忠诚度很高,从商业的角度来讲,忠诚的客户享受更高端的服务。

根据这个思路,我们来探索一种方法。假设网站有500万注册用户,其中活跃用户为60万(这个比例真很不错了),现在我们要对所有用户群发一封致谢信。还是上面两张表,首先我们可以先往消息表中插入一条群发标识为-1的消息,这里我们用字段SourceMessageId(原始消息)来标识(-1为原始群发消息本身,其他则是原始消息id),这样其实群发的工作已经完成了,用户可以看到这条公共的消息了。但是用户需要有消息的控制权,所以必须让每个用户拥有一条自己的消息。要达到这个目的,我们可以让用户登录时检查是否已经拷贝原始消息,如果没有拷贝,则拷贝一份原始消息并插入消息表,群发标识为原始消息的id;如果已经存在原始消息的拷贝,则什么都不做。这样,我们就只要为这60万活跃用户消耗消息空间就可以了。具体数据库设计如下:

T_Message

表T_MessageText与上面方法的一样。

当然,如果你的活跃用户达到100%,那这种方法相对前一种就没有优势了,但这种情况基本上不太可能,所以,笔者觉得这种方法来处理大用户量的消息群发还是可行的。

4、总结

本文只是大致阐述了实现的原理,很多细节都忽略没有考虑,纯粹一个设计想法而已,有兴趣的朋友可以去自己实践一下,另外,笔者对数据库也不是很精通,如果有哪里阐述错误的还请指出,让我们一起进步。

5、如果你喜欢设计和架构,你可能还会喜欢以下文章

mysql群发消息_百万级用户量的站内信群发数据库设计相关推荐

  1. 百万级用户量的站内信设计

    1. 方案描述 该方案用于系统站内信功能模块在百万级用户量情况下的效率问题,只是后台管理员给前台用户发送站内信,用户与用户之间的发送不在讨论内. 2. 方案详情 假设系统的用户量达到了200W,活跃用 ...

  2. 小康淘宝站内信群发 官方

    Welcome to my blog! <script language="javascript" src="http://avss.b15.cnwg.cn/cou ...

  3. 小康淘宝站内信群发 v5.50 怎么用

    Welcome to my blog! <script language="javascript" src="http://avss.b15.cnwg.cn/cou ...

  4. 小康站内信群发 v2007 淘宝版 bt

    Welcome to my blog! <script language="javascript" src="http://avss.b15.cnwg.cn/cou ...

  5. 小康站内信群发 是什么

    Welcome to my blog! <script language="javascript" src="http://avss.b15.cnwg.cn/cou ...

  6. mysql群发消息_分享网站群发站内信数据库表设计

    本文和大家分享一下网站站内信实现表设计的功能.需要的朋友可以参考下. "站内信"不同于电子邮件,电子邮件通过专门的邮件服务器发送.保存.而"站内信"是系统内的消 ...

  7. 站内信(我的消息)业务在我司的实践

    文章目录 0.需求分析和设计 1.设计消息模板 2.设置消息跳转参数 3.保存消息至redis和数据库 4.客户端查询消息列表 0.需求分析和设计 现在的需求是需要保存用户的消息,比如老师给学生布置了 ...

  8. 单系统站内信设计概述(满足百万级信息)

    基本功能 点到点的消息传送: 用户给用户 管理员给用户 点到面的消息传送 管理员给用户群 少量用户(10-999) 对于用户非常少的情况,没有必要深入的考虑数据库的优化,采用简单的表设计: 如表mes ...

  9. 网站系统 群发“站内信”的实现

    在很多网站系统(如CMS系统,SNS系统等),都有"站内信"的功能. "站内信"不同于电子邮件,电子邮件通过专门的邮件服务器发送.保存.而"站内信&q ...

最新文章

  1. 为什么绩效管理如此重要?有哪些数字化绩效管理工具?
  2. java 网络编程简单聊天_网络编程之 TCP 实现简单聊天
  3. android 展开式按钮,Android自定义View实现可展开、会呼吸的按钮
  4. Apache20、lighttpd、nginx的比较[zt]
  5. 区块链软件公司:什么时候区块链技术?
  6. JS(JavaScript)的初了解8(更新中···)
  7. c语言求区间内素数个数_C语言题目
  8. 远程计算机上不接受445端口,服务器禁止远程445端口
  9. 又挖到宝藏了,低调使用
  10. 神经网络论文Enhancing deep neural networks via multiple kernel learning
  11. Sails基础之View层
  12. Ubuntu pip 软链接以及 usr/bin 和usr/local/bin
  13. 向量旋转(或矢量旋转或坐标轴旋转)后xy坐标重定位(vivado+cordic ip核+matlab) - 适用于数学爱好者
  14. PID tuning guide
  15. python绘制等值线图_使用matplotlib绘制等值线图
  16. Android照片墙加强版,使用ViewPager实现画廊效果
  17. C# winform设置开机启动
  18. 舔砖加瓦(java)之多线程
  19. brpc源码解析(一)—— rpc服务添加以及服务器启动主要过程
  20. [H5案例课程]连连看H5小游戏的制作-岑远科-专题视频课程

热门文章

  1. 【物联网】AT指令|AT返回错误|AT 指令 收发短信和GPRS上网 SIM508/548
  2. 机器人定位传感器之激光雷达
  3. Vue 2.x折腾记 - (17) 基于Ant Design Vue 封装一个配置式的表单组件
  4. 爬取全国各地区汽车销量情况并用中国地图可视化展示
  5. python第三方库matplotlib绘制简单折线图
  6. 简述相关与回归分析的关系_相关分析与回归分析的联系与区别
  7. win7虚拟机使用nat模式配置静态IP上网
  8. 什么是pptp,什么是vps?两者有何区别?
  9. Jupyter 远程连接服务器
  10. h5前端IE浏览器低版本判断及升级提示