引言
過去幾年中,我們將敏捷方法應用于數(shù)據(jù)庫設計,總結出一些技巧,使得當應用程序發(fā)展時,數(shù)據(jù)庫也能夠進化,這是敏捷方法的一個重要屬性。我們的方法是通過持續(xù)集成以及自動重構,通過數(shù)據(jù)庫管理人員(DBA)和應用開發(fā)人員的緊密合作來設計數(shù)據(jù)庫。這些技巧在應用開發(fā)的各個時期都有效。
1 敏捷方法學
近年來,出現(xiàn)了一種新的軟件開發(fā)方法學——敏捷方法學。這給數(shù)據(jù)庫設計提出了一些新的、巨大的需求。這些需求的一個中心就是進化設計。在一個敏捷項目中,需要假定我們并不能事先確定系統(tǒng)的需求,因此在項目的初期有一個詳細設計階段的想法是不現(xiàn)實的。系統(tǒng)的設計必須隨著軟件的變化而進化。敏捷方法,尤其是極限編程(XP),通過一些實踐使這種進化設計成為可能。在數(shù)據(jù)庫設計采用敏捷方法,反復迭代。
許多人會懷疑敏捷方法能否用于有大型數(shù)據(jù)庫組件的系統(tǒng),但我們的確使用了許多敏捷和XP技巧,用于解決基于大型數(shù)據(jù)庫的項目中的進化與迭代問題。
3.5 所有的變化應該數(shù)據(jù)庫重構
重構技術就是應用所有可控技術來改變現(xiàn)有的代碼基礎,與此類似我們定義了數(shù)據(jù)庫重構也給數(shù)據(jù)庫的改變提供了類似的控制。
數(shù)據(jù)庫重構的不同之處在于它必須將三種不同的變化同時完成:
(1) 改變數(shù)據(jù)庫計劃
(2) 進行數(shù)據(jù)遷移
(3) 改變數(shù)據(jù)庫存取代碼
于是當描述數(shù)據(jù)庫重構時,我們必須描述變化的三個方面,并確保在應用另一個重構之前完成了這三種變化。
我們必須文檔化不同的數(shù)據(jù)庫重構,因此我們還不能詳細描述他們。然而這里有幾點需要指出:像代碼重構一樣,數(shù)據(jù)庫重構非常微;概念鏈一系列微小的變化,數(shù)據(jù)庫和代碼很相似;變化的三個屬性使保持小的變化更加重要。
許多數(shù)據(jù)庫重構,如增加一個字段,可以不必更新所有存取系統(tǒng)的代碼來完成。但是如果在使用新計劃之前并不了解它,該字段將會無用,因為新計劃不知道其變化之處。許多變化,沒有考慮整個系統(tǒng)計劃,我們稱之為破壞性變化,如將一個已經存在的空值列設置為非空。破壞性變化需要多加留心,留心的程度依賴于包含破壞性的程度。一個小破壞性的例子是將一個已經存在的空值列設置為非空,在這種情況下你可以蒙著頭做。
而重構將考慮數(shù)據(jù)庫中空值數(shù)據(jù),開發(fā)人員將更新數(shù)據(jù)庫映射代碼,因此更新不會破壞其它人的代碼;如果偶然會破壞,開發(fā)人員將在建立和使用測試時發(fā)現(xiàn)問題。
將一個經常使用的表分成兩個是一種更復雜的破壞。在這種情況中提前讓所有人知道變化到來很重要,這樣他們可以有所準備。此外應該在一個更安全的時刻來實施變化。這里面很重要的一點是選擇適用于你做出的變化的過程。
3.6 自動重構
在代碼世界中許多語言能夠實現(xiàn)自動重構。在計劃變化和數(shù)據(jù)遷移過程中,這種自動化對于數(shù)據(jù)庫也非常重要。因此每個數(shù)據(jù)庫重構都可以通過編寫SQL DDL(對于計劃變化)和DML(對于數(shù)據(jù)遷移)來完成。這些變化不是通過手工實現(xiàn),而是通過一些SQL語句來自動實現(xiàn)變化。
一旦完成代碼,我們保存這些代碼文件來產生數(shù)據(jù)庫變化的完整的變化記錄,作為數(shù)據(jù)庫重構的結果。我們于是可以更新任何實例到最新的主數(shù)據(jù)庫,通過運行在我們拷貝主數(shù)據(jù)庫來產生更早的數(shù)據(jù)庫實例的變化記錄。
自動化變化的序列化是對于持續(xù)集成和遷移產品數(shù)據(jù)庫的一個基本功能。
為了最后產品數(shù)據(jù)庫我們并不在常規(guī)迭代周期中實施變化,我們在每一個發(fā)布之間建立完整的數(shù)據(jù)庫重構變化日志。毫無疑問,這是一個巨大的變化,我們必須離線實施該變化,在實際應用之前先測試遷移計劃絕對是明智之舉。迄今為止,這項技術相當管用,通過將大變化分解為小的簡單的變化,我們可以對產品數(shù)據(jù)進行大的變化,同時又不會給我們太多的麻煩。套用兵法中的一句話,就是“化整為零”。
除了自動化向前的變化,我們也要考慮重構時向后的變化,如果能夠做到這樣就可以回到以前的數(shù)據(jù)庫狀態(tài)。在我們的項目中并沒有這樣做,因為沒有這個需求,但這同樣是很重要的基本原則。
3.7 自動地更新所有開發(fā)人員的數(shù)據(jù)庫
人們變化和更新主數(shù)據(jù)庫,但是如何發(fā)現(xiàn)主數(shù)據(jù)庫已經發(fā)生變化?在傳統(tǒng)的持續(xù)集成有源代碼的環(huán)境中,開發(fā)人員在提交變化之前先更新主數(shù)據(jù)庫。這樣他們就可以在提交變化給共享主數(shù)據(jù)庫之前,解決他們自己的機器上的問題。
每次主數(shù)據(jù)庫發(fā)生改變時,我們都要更新開發(fā)人員的數(shù)據(jù)庫。當主數(shù)據(jù)庫發(fā)生變化時,我們自動化更新所有項目成員的數(shù)據(jù)庫。相同的重構代碼更新主數(shù)據(jù)庫上的同時,自動更新成員數(shù)據(jù)庫。也許有人認為在開發(fā)人員不知情的情況下,更新開發(fā)人員數(shù)據(jù)庫會產生很多問題,但在實踐中我們沒發(fā)現(xiàn)什么問題。當然,這只在人們聯(lián)網(wǎng)時管用。所以當開發(fā)人員離線時,必須盡快與主數(shù)據(jù)庫重新保持同步。
3.8 清晰地分離所有的數(shù)據(jù)庫獲取代碼
為了理解數(shù)據(jù)庫重構的結果,了解應用程序如何使用數(shù)據(jù)庫也非常重要。如果SQL語句分布在代碼基礎周圍,則很難這樣去做。因此一個清晰的數(shù)據(jù)庫獲取層很重要,它用來顯示數(shù)據(jù)庫如何被使用,在哪里被使用。
清晰的數(shù)據(jù)庫層有很多好處。它減少了開發(fā)人員操縱數(shù)據(jù)庫時需要使用SQL知識的地方,這樣使對SQL語句不太熟悉的開發(fā)人員更易開發(fā)。對于DBA來說,給他提供了清晰的代碼,可以清楚地了解數(shù)據(jù)庫將如何使用。這也幫助準備索引、數(shù)據(jù)庫優(yōu)化,優(yōu)化SQL語句,使DBA更好地理解數(shù)據(jù)庫如何被使用。
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內蒙古 |