最近收到不少網友關于在面向對象的分析設計中如何進行數據庫設計的疑問。在大象-《thinking in uml》一書里,我詳細講述了面向對象從需求到設計的整個過程,但確實對數據庫設計著墨甚少。因此寫這篇文章對這個問題詳細說明,在第二版里應當也會加上這一部分。
先貼出一位網友的疑問以及我的回復,作為這篇文章的引子:
網友fdshxp問道:
在軟件開發時要進行數據庫設計,現在通常的做法是需求分析,做數據流圖,畫ER圖,這些顯然是面向過程的東西,而在面向對象分析設計時,只是提數據庫設計的內容,具體怎樣做?雖然可以將數據庫操作封裝起來,但要設計的數據庫表不能通過拍腦袋的方法獲得,總不能再去畫一遍數據流圖吧!
我回答:在面向對象中,是沒有數據流這一說法的。業務的完成是由對象及消息來完成的,只有“對象流”,沒有數據流。
只是在現實中,絕大部分的對象持久化是用關系數據庫實現的,我們還沒有在性能上和查詢上可以頂替關系數據庫的對象數據庫。設計數據庫表的目的是不考慮所謂“流”的,**考慮的是如何把對象高效的持久化**。可以說,數據庫設計和之前的面向對象設計是兩個領域的問題,面向對象設計解決業務執行邏輯問題,數據庫設計解決數據高效的問題(它根本不考慮流控制的概念),它們中間通過OR-mapping的機制結合起來。如果你對此一直有疑問,那說明你試圖在設計數據庫表時考慮通過數據庫表設計表達業務邏輯問題,而不是考慮如何高效的持久化對象。
假設,現在技術成熟到我們已經有性能不低于關系數據庫的XML持久化機制和對象查詢機制,任何對象都可以直接持久化而不需要OR-mapping,那么還需要設計數據庫表么?