空間換時間的數據庫設計

作者: 聽風吹雨  來源: 博客園  發布時間: 2010-11-18 22:00  閱讀: 1115 次  推薦: 0   原文鏈接   [收藏]  
摘要:但是當我們的SMS、Email的發送頻率和數量足夠大的時候,我們的系統就會出現性能、表被鎖等問題。那我們如何是好呢?

  我們的系統中很常會用到SMS、Email等的發送,在我們的設計中通常會創建一個Tb_outbox表,當產生數據時,插入到Tb_outbox表,由定時器去讀取Tb_outbox的數據進行發送,發送完了再修改Tb_outbox的發送狀態。是的,這就是通常的做法,但是當我們的SMS、Email的發送頻率和數量足夠大的時候,我們的系統就會出現性能、表被鎖等問題。那我們如何是好呢?

  下面的設計的一個思想就是如標題所述:空間換時間。就個人而言,我感覺這個描述更加貼切:對象的職責分離,把Insert、Update、Delete等分離在不同的表中。廢話不多說,下面就來看看這個設計圖:

圖:邏輯圖

  Tb_NotSent_buffer:待發送短信緩存表(即時清理).

  1.  該表是為了避免應用過多對Tb_NotSent同時操作產生鎖表情況。
  2. 主要考慮到產生待發短信的邏輯通常會比較復雜,或者長事務。
  3. 一次性將已經在buffer表里的短信insert到Tb_NotSent,這次插入沒有長事務計算,由一條insert from select完成。
  4. 該表并非一定用到,視乎產生待發短信的邏輯的事務復雜度,和量而定。

  Tb_NotSent:待發送的短信(會被定時清理)

  1. 會將該已經發送的短信的處理結果存儲在jms消息隊列里。
  2. 把這些數據從Tb_NotSent copy到Tb_outbox同時,插一條記錄到Tb_Sent.這樣作是為了下一步刪除Tb_NotSent里已經發送的信息.同時又不因為刪除而鎖Tb_NotSent表(應用使用)
  3. 使用空間換時間的思想,減少對同一張表(Tb_outbox)的過多操作和過程時間的操作,導致鎖表出現系統瓶頸。

  Tb_outbox:存儲歷史記錄的主表,該表需建立在獨立的數據庫。

  1. 減少備份文件大小,可靈活調整,大大減少備份空間的需求。
  2. 減少對主數據庫的影響。

  Tb_Sent:一個參照表,為刪除Tb_NotSent表做基表

  1. 已經發送短信(會定時清理),存放已經被網關處理的短信(發送成功或者失敗)。
  2. 這個表不一定要保存和Tb_NotSent一樣多的字段,也許只要兩個字段,那就是ID值和狀態值。
0
0
 
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()