SQL Server 空间换时间的数据库设计
2010-03-30 11:45 听风吹雨 阅读(5651) 评论(11) 编辑 收藏 举报我们的系统中很常会用到SMS、Email等的发送,在我们的设计中通常会创建一个Tb_outbox表,当产生数据时,插入到Tb_outbox表,由定时器去读取Tb_outbox的数据进行发送,发送完了再修改Tb_outbox的发送状态。是的,这就是通常的做法,但是当我们的SMS、Email的发送频率和数量足够大的时候,我们的系统就会出现性能、表被锁等问题。那我们如何是好呢?
下面的设计的一个思想就是如标题所述:空间换时间。就个人而言,我感觉这个描述更加贴切:对象的职责分离,把Insert、Update、Delete等分离在不同的表中。废话不多说,下面就来看看这个设计图:

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值和状态值。
作者:听风吹雨
出处:
http://www.cnblogs.com/gaizai/
邮箱:gaizai@126.com
版权:本文版权归作者和博客园共有
转载:欢迎转载,必须保留原文链接
格言:不喜欢是因为不会 && 因为会所以喜欢
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库