我们的系统中很常会用到SMS、Email等的发送,在我们的设计中通常会创建一个Tb_outbox表,当产生数据时,插入到Tb_outbox表,由定时器去读取Tb_outbox的数据进行发送,发送完了再修改Tb_outbox的发送状态。是的,这就是通常的做法,但是当我们的SMS、Email的发送频率和数量足够大的时候,我们的系统就会出现性能、表被锁等问题。那我们如何是好呢?
下面的设计的一个思想就是如标题所述:空间换时间。就个人而言,我感觉这个描述更加贴切:对象的职责分离,把Insert、Update、Delete等分离在不同的表中。废话不多说,下面就来看看这个设计图:
![](/wp-content/uploads/res/database/article/2010-04-08-11-18-35.jpg)
Tb_NotSent_buffer:待发送短信缓存表(即时清理).
该表是为了避免应用过多对Tb_NotSent同时操作产生锁表情况。
主要考虑到产生待发短信的逻辑通常会比较复杂,或者长事务。
一次性将已经在buffer表里的短信insert到Tb_NotSent,这次插入没有长事务计算,由一条insert from select完成。
该表并非一定用到,视乎产生待发短信的逻辑的事务复杂度,和量而定。
Tb_NotSent:待发送的短信(会被定时清理)
会将该已经发送的短信的处理结果存储在jms消息队列里。
把这些数据从Tb_NotSent copy到Tb_outbox同时,插一条记录到Tb_Sent.这样作是为了下一步删除Tb_NotSent里已经发送的信息.同时又不因为删除而锁Tb_NotSent表(应用使用)
使用空间换时间的思想,减少对同一张表(Tb_outbox)的过多操作和过程时间的操作,导致锁表出现系统瓶颈。
Tb_outbox:存储历史记录的主表,该表需建立在独立的数据库。
减少备份文件大小,可灵活调整,大大减少备份空间的需求。
减少对主数据库的影响。
Tb_Sent:一个参照表,为删除Tb_NotSent表做基表
已经发送短信(会定时清理),存放已经被网关处理的短信(发送成功或者失败)。
这个表不一样要保存和Tb_NotSent一样多的字段,也许只要两个字段,那就是ID值和状态值。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
![TechTarget微信公众号二维码](/wp-content/uploads/res/images/spriteimg/ttweixin.jpg)
TechTarget
官方微博
![TechTarget中国官方微博二维码](/wp-content/uploads/res/images/spriteimg/ttweibo.jpg)
TechTarget中国
作者
相关推荐
-
大数据时代我们是否还需要数据库设计?
良好的数据库设计是系统和应用程序设计的一部分。很多的业务需求,如数据可用性,清理处理,还有应用性能都可以利用特定的数据库设计加以解决。
-
数据库设计需做好前期工作 Agile方法不适合
有很多企业认为数据建模以及设计良好的数据库是浪费时间的工作,对此专家的回答很直接:决不能忽视数据库设计过程。
-
理解什么是数据库规范化(Normalisation)
规范化(Normalization)是数据库系统设计中非常重要的一个技术。数据库规范化能够让数据库设计者更好地了解组织内部当前的数据结构。
-
解析数据库的雪花模式结构
数据库设计包含几个数据建模方法,如概念设计、逻辑设计和物理设计。而目前在软件开发者和企业数据仓库(EDW)人员中流行着两个模式类型:星型模式和雪花模式。