1. 程式人生 > >2019-1-11數據庫重構

2019-1-11數據庫重構

工作 hone 生日 相關信息 建模 持久層 pan 賬單 重復

技術分享圖片

2、數據庫味道
與“代碼味道”概念相似,代碼味道是代碼中出現常見問題,表明需要進行重構。
數據庫味道表明數據庫需要重構。這些味道包括:


(1) 多用途的列
如一個列被用於多種用途,就可能存在額外的代碼來確保源數據以“正確的方式”使用,這些代碼常常會檢查一個列或更多其它列的值。
比如:
某列用於存儲某人的生日,如果此人是顧客的話。假如此人是公司雇員,此列則用於存儲入廠日期。

(2) 多用途的表
如一個表被用於存放幾種類型的實體,就可能存在設計缺陷。
例如:
某個表Customer同時存放了人和公司的信息。


(3) 重復的數據
重復的數據對操作型數據庫來說是一個嚴重的問題,因為如數據存放在幾個地方,不一致的機會就增加了。


(4) 列太多的表
當一個表包含太多的列,則說明這個表缺乏內聚。
比如:
Customer表包含了一些列,存放了3種不同的地址(發貨地址、賬單地址、公司地址)或幾個電話號碼(家庭電話、工作電話、手機號等),你可能需要將這種結構進行標準化處理,加入Address和PhoneNumber表。


(5) “智能”列
“智能”列是這樣一種列,其中數據的不同位置代表不同的概念。
例如:
客戶ID的前4位數字代表客戶的開戶行,則客戶ID就是一個“智能”列。因為你會解析它以取得更細粒度的信息,如開戶行ID。

3、數據庫重構
數據庫重構是一種數據庫實現技術,與代碼重構相似,對數據庫Schema進行重構,使得在上面增加東西變得容易。
技術分享圖片

上圖提供了一些關鍵開發活動的高層視圖,這些活動發生在涉及對象和關系數據庫技術的現代項目中。需要在這些活動之間來回叠代。

數據庫重構是演進式數據庫開發的一個重要組成部分。還需要采用演進/敏捷的方式進行數據建模。
耦合越厲害,就越難重構。代碼重構、數據庫重構均是如此。
最簡單的場景:單應用數據庫。因為數據庫Schema只與它本身和一個應用相耦合。
而在多應用的數據庫架構中,你的數據庫Schema可能與應用源碼、持久框架、ORM工具、其它數據庫(提供復制、數據抽取/加載等)、數據文件Schema、測試代碼,甚至數據庫自身等耦合在一起。

減少涉及數據庫的耦合的一種有效方式是封裝對數據庫的訪問。讓外部程序通過持久層來訪問數據庫,可以實現對數據庫訪問的封裝。
持久層有多種實現方式:
(1) 通過數據訪問對象DAO,它實現了所需的SQL代碼;
(2) 通過框架;
(3) 通過存儲過程;
(4) 通過Web服務。

永遠也不可能把耦合降到0,但肯定可以把它降到能管理的程度。

數據庫重組:數據庫使用較長一段時間後,因為一些增,刪,改等操作,使得數據的分布索引及相關數據會變得比較淩亂,從而影響數據庫的查詢效率。 數據庫重組即是將數據庫的相關信息(索引、單表、表空間)重新組織,即刪除原有的表或索引,重建空的表或索引後,再把數據導入新表或索引中.這個過程無誤即數據庫重組成功.但也有導入數據失敗的情況.所以數據庫重組的風險也比較大。

重構:對軟件內部數據結構的一種調整,目的是在不改變軟件表現形式的前提下,提高其可理解性,降低其修改成本; 在用戶來看,程序的行為和結果沒有任何的變化.重構只是對程序內部結構進行調整,讓代碼更加容易理解,然後更容易維護
 重構的好處:1.能改進軟件設計使軟件更容易被理解;2.能幫你找到bug;3.提高軟件的開發速度
什麽時候進行重構:三次法則:事不過三,三則重構.意思是說,一件事情,第一次只管去做,第二次做類似的事情會產生反感,但無論如何還是做了,第三次再做類似的事情,你就應該重構.在添加新功能時進行重構.
什麽時候不進行重構:現有的程序無法運行,此時應該是重寫程序,而不是重構程序,免得過了最後的交付期限

2019-1-11數據庫重構