數據庫重構《Refactoring DataBase Evolutionary DataBase Design》介紹

作者: 瀟湘隱者  來源: 博客園  發布時間: 2011-03-16 15:30  閱讀: 944 次  推薦: 0   原文鏈接   [收藏]  

  說實話我也是前兩周才知道有數據庫重構這回事,當時聽說這個概念的時候,唯一的反應就是:數據庫居然也能重構?剛好上周去圖書館借書,看見了《數據庫重構》這本書,就借回來看了幾章。下面會結合自己的體會介紹一些這本書的一些觀點。

  數據庫重構概念

  數據庫重構是對數據庫Schema進行的簡單改動,在保持行為和信息語義的前提下改進設計。

  數據庫重構可以重構數據庫Schema的結構:比如表、視圖的定義、修改; 重構數據庫的功能:如存儲過程、觸發器等。

  數據庫重構的困難

  數據庫重構其實并不像代碼重構那么簡單,對數據庫結構的改動,真的是牽一發而動全身。可能你要改動業務邏輯層、UI表示層、甚至是牽連到一些其它模塊、外部調用程序,還有像數據庫里面的函數、存儲過程、觸發器等、光是把這些牽扯的例舉出來,都會讓你頭皮發麻,還要大量的測試;而且對一個已經上線的系統,你有這個魄力去重構嗎?就算你有,未必其它同事、尤其拍板的人(經理)也未必同意,這里面的風險太大,代價太大了…..其實這都是因為數據庫重構比代碼重構難,復雜。下面是我自己概括的一些:

  1. 代碼重構只需要保持行為語義, 而數據庫重構還要保持信息語義。
  2. 數據庫架構所導致的耦合度(數據庫與外部程序是高度耦合的),數據庫重構變得相當復雜。按情況分分為單應用數據庫、多應用數據庫(相對復雜得多),下面是我按書上圖畫的單應用數據庫和多應用數據庫。
  3. 數據庫重構缺少工具支持。像代碼重構,很多IDE(集成開發環境)都已經提供了代碼重構功能,比如VS里面菜單欄里面有重構選項,許多人都經常使用。但是數據庫到現在為止沒啥工具支撐。相信數據庫工具提供商以后也一定會增添這些功能的。
  4. 數據庫設計、開發采用傳統的、串行式的思維過程,基本上忽略了敏捷的方式(說實話,我對作者這個觀點不太理解)。我的理解數據庫開發一直采用傳統的建模,設計,然后編碼實現,沒有采用反映現代方法學(如XP 和RUP)的演進式方式。
  5. 不是每個開發者對系統各部分、數據庫架構都十分了解,不是每個人都精通數據庫和應用程序開發。也就是說可能某人只精通數據庫、而不精通C#開發,那么重構就顯得比較困難。還有很多人只了解系統的部分結構,而不了解整體,這對數據庫重構影響很大,作者建議結對編程,DBA和架構師(技術人員)結對進行數據庫重構

  數據庫重構的分類

  1. 結構重構: 對一個或多個表或試圖做一些變更。比如將一列從一個表移到另外一個表,將多用途的列拆分為一些單獨的列。每個列用于單一用途。
  2. 數據質量重構:一種變更,改進了數據庫中所包含信息的質量。例如,不允許列為空,確保它總是有值,或對一列采用統一格式,確保一致性。
  3. 參照完整性重構:一種變更,它確保參照的行在另外一個表的存在,并確保不需要的行被相應地刪除。增加觸發器支持兩個實體間的層疊式刪除。
  4. 架構重構。 一種變更,它從整體上改變了外部程序與數據庫進行交互的方式。用存儲過程取代部分代碼和腳本。
  5. 方法重構: 對方法(存儲過程、函數、觸發器)的一種變更,改進方法質量,比如存儲過程改名,把存儲過程里面的*用相應的字段替換、、、、、
  6. 替換: 這不屬于重構,轉換時對數據Schema的一個變更,它改變了Schema的語義。

  數據庫味道

  正如Flower在重構里面說的代碼的壞味道一樣,作者也嘗試總結了一些數據庫的壞味道。

  • 多用途的列。 如果一個列被用于多種用途,就有可能存在額外的代碼來確保數據以“正確的方式”使用。個人認為像表里面用來判別性別、是否刪除的字段這樣的多用途列還不是壞味道,如果超出了兩個應用,就應該考慮重構了。
  • 多用途的表。 如果一個表用來存放多種不同數據來源的數據。
  • 重復的數據。重復的數據對操作型數據庫來說是一種嚴重的問題,因為數據存放在幾個地方,不一致的機會就增加了。個人認為適當的冗余還是必須的。這個只能試情況而論。
  • 列太多的表。一個表包含太多的列時,說明表缺乏內聚——它試圖存放來自幾類實體的數據。我見過一個表幾十個字段的設計,只能用“無語”來形容我的感受。
  • 行太多的表。大的表就有性能問題,查找就十分耗時,你這時就需要對表進行垂直分割:將一些列移到另外一個表,將一些行移到另外一個表,進行水平分割。
  • “智能”列:智能列是這樣一種列,其中數據的不同位置代表了不同的概念。這個我不太了解(沒有這方面的使用經驗),作者的建議進行更小粒度的分割字段。
  • 害怕變化。如果你害怕改變你的數據庫Schema,因為你擔心更改會破壞其它很多應用程序,那么這就是一個明確的信號。

  數據庫重構在開發中的位置

  作者提到了大多數面向數據技術本質上都是串行的。諸如邏輯數據建模或物理數據建模。希望數據庫DBA采用類似開發者使用的現代演進式技術來開發,并能從中獲益。作者提供了一幅圖關于在一些關鍵開發活動中的高層視圖,這些活動發生在涉及對象和關系數據庫的現代項目中。請注意,所有的箭頭都是雙向的。你需要在這些活動之間來回迭代。同時注意沒有定義起點和終點——顯然這不是傳統的串行式過程。

0
0
 
 
 

文章列表

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

    IT工程師數位筆記本

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