邏輯數據庫設計 - 元數據分裂(分區表)

  我以前曾參與維護過一個輿情監控系統,該系統天天源源不斷地監控着互聯網上的新聞,不斷從網上下載新聞保存進入數據庫。javascript

提出問題

  爲了表述簡單,我特地模擬了一張相似的表:html

  CREATE TABLE NEWS(
      Id    int PK,
      Title    nvarchar(500)    --新聞標題
      Content    text        --新聞內容
     CreateTime DateTime
)

  隨着時間的推移,數據庫裏的新聞變得愈來愈多,系統開始跑得愈來愈慢。隨後,技術經理考慮到,輿情監控須要的僅僅是近期的數據,過期的數據,不過重要。因而,新建了一個表,該表以時間命名,字段同樣:java

  CREATE TABLE NEWS2009(
      Id    int PK,
      Title    nvarchar(500)    --新聞標題
      Content    text        --新聞內容
     CreateTime DateTime
  )

  一、不斷產生的新表git

  照個人估計,這個數據庫以後還會有數據庫

    News2010,News2011,News2012.......數據庫設計

  添加時須要選擇表:post

  因爲數據要被拆分到不一樣的表中,假如系統不似個人輿情監控系統同樣,不斷有不一樣時間的數據錄入,那麼根據不一樣的數據,選擇不一樣的數據添加就成了你的責任。網站

  INSERT INTO NEWS2010 (2010年的數據)

  特殊時間點:this

  若是元旦到了,你還在享受着美滿的假期,忽然客戶打電話來,問系統爲何不監控了,shit,2013.1.1你忘了建新表。致使大量數據漏掉了,你不免比老闆痛扁一頓。spa

  二、管理數據完整性

  加入某一天,你運行:

SELECT * FROM NEWS2009
    WHERE CreateTime NOT BETWEEN '2009-01-01' AND '2009-12-31'

  結果竟然有返回,那麼你又有麻煩了。爲了不這種狀況,你不得不對每一張新聞表添加約束,不在規定時間內的數據,不容許添加規定的表。

  三、同步數據

  忽然,產品經理要求將幾條數據的CreateTime由進庫時間,改成新聞網站的發佈時間。例若有一點時是2010-01-02,但實際發佈時間稍早是2009-12-31。

  你滿懷自信興沖沖地敲入:

  UPDATE NEWS2010
      SET CreateTime = '2009-12-31'
  WHERE Id = 12345

  運行時,忽然一想,這數據變成了一條無效數據,它應該存入NEWS2009這張表中。UPDATE無用了,你必須添加進NEWS2010而後再刪除本條數據。

  四、確保惟一性

  分割出來的數據,其主鍵要在全部年份的表裏都是惟一的,若是你要從NEWS2010表移一條數據到NEWS2009表,那麼你得確保主鍵不會衝突。你不得不本身實現主鍵策略。

  五、跨表查詢

  假如老闆要每一年2月14號的數據報表。你不得不拼命地

複製代碼
SELECT * FROM NEWS2009
UNION
SELECT * FROM NEWS2010
UNION
SELECT * FROM NEWS2011
.
.
.
複製代碼

  六、同步元數據

  假如產品經理忽然要求全部新聞添加一個字段,那麼你不得不ALTER多張表。

  七、管理引用完整性

  假如產品經理要求評論也一塊兒抓取回來,NEWS表的NEWSID不行被Comments評論表引用,那麼這個外鍵不得不被關鍵多張表。

解決方案 - 分區表

  基於以上種種分析,明顯已經看出,這樣的設計不是一個好的設計。

  對於這種時間效應比較強,數據比較多的表,咱們應該博覽羣魔,分區表。

  關於分區表的實現,以前已經寫過http://www.cnblogs.com/kissdodog/p/3156758.html

 

 
 
 
0
0
 
(請您對文章作出評價)
 
« 上一篇: 邏輯數據庫設計 - 多列屬性(多列轉行)
» 下一篇: NHibernate 集合映射基礎(第四篇) - 一對1、 一對多、多對多小示例
相關文章
相關標籤/搜索