最近在讀一本《數據庫系統 設計、實現與管理》的書,其中的數據庫設計部分寫的挺好的,另外在本書中也講到了數據庫生命周期的概念,我覺得有所收益,特寫下此博文!
在軟件開發中,我們經常會提到軟件系統開發的生命周期,大致分為:計划、分析、設計、實現、運維幾個階段,整體流程和動作如下圖所示:
而針對數據庫建模和數據庫應用開發來說,也有其自己的“數據庫生命周期”,database life cycle,簡稱DBLC。DBLC大致上分為6個階段:數據庫初始研究,數據庫設計,實現和裝載,測試和評價,運行,維護和演化。其對於的生命周期圖為:
也許作為一個數據庫模型設計人員或者開發人員來說,只關心參與3個階段,但是其實每個階段都應該參與其中,畢竟這6個階段是不斷迭代的過程。
下面我們來分別說明一下這6個階段。
1.數據庫初步研究
簡單的說就是前期的需求調研階段,只不過軟件開發中的需求調研是站在軟件的角度,而數據庫設計人員則應該站在數據庫的角度分析用戶的需求,主要做到以下目標:
- 分析公司的狀況。
- 定義問題和約束。
- 定義目標。
- 定義范圍和邊界。
2.數據庫設計
這是數據庫生命周期中最重要的環節,也是最燒腦細胞的環節。這個環節工作的好壞直接關系到最終軟件是否滿足用戶和系統的需求。數據庫設計又進一步划分為幾個階段:概念設計、DBMS的選擇、邏輯設計、物理設計。
概念設計
概念設計階段需要根據用戶和系統的需求,設計出實體關系模型ERM,所以這個階段的產出是一個ERM。至於怎么分析用戶需求后定義實體,定義關系,定義屬性,范式化與反范式化,以及對概念模型的驗證,那都是很深的學問,都可以單獨寫一本書了。我在之前的博客中粗略的講解了如何進行概念模型的設計,可以參考:http://www.cnblogs.com/studyzy/category/466850.html
尤其是其中一篇(分析與設計數據庫模型的簡單過程)把ERM的建模過程演示了一遍。
而對概念模型的驗證,一方面需要檢查用戶需求中的對象和屬性是否都在概念模型中,其次,檢查CRUD在模型上的操作是否會造成異常,另外也需要從報表的角度考慮,是否能夠寫出對應的報表的查詢,查詢效率是否可接受。在整個模型驗證過程中,可能把一些屬性獨立出來成新的實體,也可能把關系從一對多改為多對多,也可能出於性能上的考慮,對一些表進行反范式化處理。對概念模型的驗證一般以模塊為單位進行驗證,而且概念模型的定義是獨立於硬件和軟件的,保證了模型的簡潔。
DBMS的選擇
目前市面上的DBMS可選擇性並不是很大,企業級DBMS就是Oracle,IBM DB2和SQL Server,這些DBMS功能強大完備,但是價格昂貴,而免費開源的有MySQL,PostgreSQL,這都是很流行的開源數據庫,而如果系統小而簡單的話,還可以考慮Sqlite,Access等單機數據庫。這前面說的都是RDBMS,也就是關系型的數據庫,還有其他對象數據庫,文檔數據庫,層次數據庫如果需要也可進行選擇,尤其是隨着互聯網的興起,現在NoSQL非常火,也增加了DBMS的選擇范圍。
不管怎么說,DBMS的選擇主要還是考慮以下幾個方面:
- 開銷/預算。這里除了軟件和硬件本身的采購價格,還需要包括學習成本,運維開銷,轉換成本等。
- DBMS的特征和工具。如關注系統的可用性,安全性,擴展性等。
- 基礎模型。是關系型的還是對象型的,或者文檔型。
- 便利性。DBMS可以便利的在不同平台,系統,語言之間進行移植。
- 硬件要求。
邏輯設計
邏輯模型就是將概念模型轉換為特定DBMS支持的模型,所以邏輯模型是與軟件相關的。邏輯模型中的表、外鍵是可以通過概念模型的實體、關系轉換而來,但是對於視圖、存儲過程、函數、用戶等,都需要在邏輯模型中設計。
物理設計
物理模型是與具體的物理硬件相關,可以通過邏輯模型轉換而來。在物理設計中,需要考慮具體的數據存儲,數據分布等,在物理模型中要求設計師充分了解軟件和硬件環境,充分發揮軟件和硬件的特性。
3.實現和裝載
常用的數據庫建模工具如PowerDesigner或者ERWin都可以將物理模型生成對應的SQL語句,然后我們在DBMS中運行SQL,便可實現我們設計的數據庫模型。在實現了數據庫模型后,我們還需要進一步研究其性能,安全,備份與恢復,以及完整性和公司標准。這些一般都是由DBMS提供的工具支持的。
4.測試和評價
數據一旦裝載到數據庫后,DBA就要對數據庫的性能,完整性,並發訪問和安全約束進行測試和優化。這個測試和評價階段是與軟件開發並行進行的。如果測試和評價結果不滿足要求,就需要對系統和模型進行調整。其中包括:
調整DBMS的配置參數,修改物理設計(比如索引和分區的修改),修改邏輯設計(比如增加冗余字段),更新或者更換DBMS的軟硬件平台。
5.運行
數據庫通過了評測階段,就認為是可運行的了。在實際生產環境的運行過程中,產生了真實的數據,一些在測試階段無法預見的問題可能會被遇到,比如查詢緩慢,數據不一致,死鎖等問題都可能遇到。棘手的問題需要緊急補丁,而一些小Bug則可能在下一個版本中修正,而這些在運行中對數據庫的補丁和修改,就是一個維護和演化的過程。
6.維護和演化
數據庫的日常維護工作包括備份與恢復,用戶權限分配,系統監控,系統定期安全審計等。對於系統補丁和新版本開發,則是對模型的演化,需要在更新生產系統數據庫時對數據庫模型進行同步的更新,這便進入了數據庫生命周期的迭代過程。