一、概述
很可能你現在正在規劃一個資料庫驅動的網站;而且幾乎可以肯定的是,你一定已經瀏覽過資料庫驅動的網站。過去,一些網站依賴CGI指令碼和文字檔儲存實現資料持久化,但現在我們能夠訪問大量不同的關係型、對象-關係型、物件導向型資料庫。
對於Web應用來說,關聯式資料庫是一種強大的支援工具,這得感謝它們的高可用性、效能,而且相對來說,關聯式資料庫比較容易使用。要找出一個功能完善、原始碼開放、能夠在多種平台上啟動並執行資料庫系統並不困難。你可以用Perl、Java、PHP以及其他伺服器端指令碼語言把關聯式資料庫和Web網站連結到一起。
隨著網站規模的發展,它對資料庫——通常是關聯式資料庫——的依賴程度也日益增加。大量頁面和服務需要向資料庫表寫入資訊,或者從資料庫提取資訊。對於大多數網站,資料庫表很快成為網站體繫結構中的關鍵區段,成為網站運作的生命中樞。為了方便和輕鬆地管理大容量資料,使用者帳戶、新聞動態、內容、統計資料都可以儲存到關聯式資料庫管理系統(Relational Database Management System,RDBMS)。
用圖(Diagram)管理資料模型具有高效、方便的優點。對於RDBMS,描述資料模型的圖通常稱為實體關聯圖(Entity Relationship Diagram,ERD)。用ERD描述資料模型能夠協助你預先精確定義資料需求,使你能夠對以後的改動作出有效規劃,能夠隨著網站的發展方便地改進規劃。
本文將介紹ERD建模工具和概念。文章提供了一些圖的執行個體,但它們的目的不是提供精確的或者是全面的資料設計範例。它們的目的是以兩個建模工具為例,介紹資料建模符號。在不同的工具之間,圖的符號有著重大的差別,但它們的基本概念一樣。本文的圖例從PowerDesigner和Visio 2000 Professional的試用版得到,你可以從本文末尾找到這些工具和其他類似產品的連結。
二、是否使用建模工具?
許多規模較小的網站用ASCII形式的SQL(Structured Query Language)指令檔進行資料建模。當開發小組人員較少,或者最理想的情況下僅由一個人構成時,這種方法最有效。然而,資料模型將很快發展成為一個複雜的結構——在這種情況下,CASE(Computer Aided Software Engineering,電腦輔助軟體設計)工具、有關所有資料資訊的圖、集中式知識庫能夠極大地協助你管理Web網站的資料層。
2.1 何時使用SQL?
即使當你準備用SQL直接管理資料模式(物理資料庫)時,圖也能有效地協助你理解和改進系統。然而,如果你的預算或者時間非常有限,採用複雜的新式建模工具可能得不償失。相反,在這種情況下,你應該使用一個簡單的圖形工具把資料模式的基本情況記錄下來,然後逐步轉換到複雜的資料建模工具。
如果你正在設計的資料庫類型不常見(或者是非標準的),避免使用某些複雜CASE工具可能是明智的,因為這些工具的“反向工程”能力和某些自動功能可能無法在你的環境下發揮作用。這裡所謂的自動功能,是指建模工具根據輸入模型的圖形和屬性資訊,自動為目標資料庫產生合適SQL命令的能力。反向工程是這樣一種能力,建模工具根據已經部署的物理資料模式,從現有的表提取出實體和關係資訊。
2.2 轉入建模工具
從簡單繪圖工具轉換到資料建模工具並不是一個很複雜的過程。大多數資料建模工具的工作方式就象是一個標準的繪圖工具,參見圖1a和圖1b,這是兩個資料建模工具的介面執行個體。你可以在這裡建立和排列表,定義關係,以及指定其它資訊(列的類型、長度,鍵等)。
圖1a:PowerDesigner的介面
圖1b:Visio的介面
轉向資料建模工具的主要挑戰在於:
- 學習使用建模符號。
- 在不丟失任何關鍵資訊的前提下,用資料建模工具描述現有資料模型。
- 尋找一個對你的資料庫提供全面支援的工具,例如在產生SQL、從現有資料模式通過反向工程建立資料模型時。
一些入門級資料建模工具(參見本文後面的參考資源)只有少量的進階特性。這有好處,但也有弊端——它們很容易學習使用,但當你積累了更多的經驗時,它們可能不再滿足你日益增長的需要。然而,升級工具或更換工具一般不存在大的問題,特別是當新的工具能夠對現有資料模式進行精確、完整的反向工程時,升級或更換工具的過程尤其簡單。
三、ERD建模符號
本文使用Martin的Information Engineering符號。PowerDesigner採用的就是這種符號,Oracle的Designer產品所使用的符號也和它很相似。你可以在AIS Modeling Summary查看各種ERD符號的說明。基本的ERD繪圖規範很直觀易懂。你可以定義實體(表),描述各個實體之間的關係。在填寫表和關係的細節資訊時,每一種工具的做法都有所不同;但就我所遇到的工具來看,基本概念在大多數軟體包之間是相通的。接下來的內容將介紹你必須瞭解的主要圖形元素和設定方法。
3.1 表
所有構造合理的資料建模工具都允許為表指定豐富的關聯資訊。這些資訊包括(但不局限於):
- 表的描述、註解,以及實體(表)的標題。
- 列,列的類型、長度、預設值和強制條件。
- 主鍵,索引,唯一性限制式。
要指定這些資訊,一般你需要進入表的屬性視窗,2a和圖2b所示。
2a:PowerDesigner中表的屬性視窗
圖2b:Visio中表的屬性視窗
一旦輸入了新表的屬性資訊,圖將被更新,顯示出你所提供的新的或更改後的表資訊。下面的圖形顯示了一個表的執行個體,這個表的屬性資訊見圖2a和圖2b。在圖2a和圖2b中,許多列被定義成了(m)andatory(強制的)、(p)rimary(主鍵)和(d)isplayed(被顯示的)列。下面的圖顯示了為該表輸入的部分屬性資訊。
圖3a:PowerDesigner的表
圖3b:Visio的表
在圖3a中可以看到一些非標準的資料類型,如PHONENUMBER和PK。許多資料建模工具允許定義域或定製資料類型,它們可供一個以上的列使用。域不僅代表著資料類型——通常,它們還包含檢查約束、預設值、值列表等資訊。如果你想要更新一個域(例如定義一種新的電話號碼格式),所有該模型中引用該域的列都將自動更新。
3.2 關係
如果我們只定義資料模式中的表,資料建模工具就不那麼重要了。各個表之間的關係、依賴情況往往很複雜,有一個管理和顯示這些關係的工具將帶來很大的協助。對於一個給定的關係,必須收集的重要訊息包括:
- 父表和子表。
- 兩個表之間的強制關係。例如,父表可能有一個子表,但子表必須有一個父表。
- 關係基數(Cardinality)。即,一個父表可以有零個或者多個子表,但一個子表有且只能有一個父表。
- 關於關係的注釋、意見和角色說明。
大多數建模工具通過在兩個或者更多表之間畫出連線的方式定義關係。預設情況下,關係往往被定義成為一對多關聯性,而且它對於關係中的任何一方都是可選的。要修改關係,你必須開啟關係的屬性視窗,更新實體關聯的特徵資訊。圖4a和圖4b顯示了兩個不同的工具允許為關係定義的部分屬性:
圖4a:PowerDesigner的關係屬性設定介面
圖4b:Visio的關係屬性設定介面
該圖顯示了一個一對多關聯性——一個典型的父-子關聯關係。部門(Branch)和僱員(Emplyee)的關係是強制的。它意味著一個部門必須至少有一個僱員(1-N強制關係);另一方面,它意味著一個僱員必須屬於且只能屬於一個部門(1-1強制關係)。圖5a和圖5b反映了修改後的關係。
圖5a:PowerDesigner中兩個表之間的關係
圖5b:Visio中兩個表之間的關係
這個圖顯示了如何把資訊轉換成符號。強制的關係由一條實心垂直線(而不是橢圓)表示。某些工具用虛線表示可選的關係。關係中屬於“多”的這一邊用一個類似鳥爪的圖形表示,關係的基數在靠近它所描述的那一端顯示。
你可能已經注意到,Employee表沒有定義外鍵列。這個圖仍舊處於“概念設計”階段——此後,從概念圖到物理資料模型之間的轉換是必不可少的。大多數工具區分概念和物理資料模型——概念資料模型描述資訊的需求,但不關注細節問題,例如索引和強制性的參考完整性。
有些時候,你可能要定義自我引用的表。自我引用的表一般用來描述層次型關係。如下面的圖形所示,大多數資料建模工具能夠處理這類別關係。注意在這個例子中,僱員可以有零個或者一個上級——它使你能夠處理一些特殊的情況,比如總統沒有直接的上級。
圖6a:PowerDesigner中自我引用的表
圖6b:Visio中自我引用的表
四、圖的規劃
定義表和關係只是挑戰的一部分,圖的清楚明白同樣很重要。雖然一些工具提供自動布局能力,我還沒有看到過一個完善的實現。相反,你的目標應該是遵從“孔雀東南飛”這一規則(這裡的“孔雀”是關係中代表“多”這一方的符號,它是串連到表的三條分叉線,象個鳥爪)。換句話說,子表應該位於父表的右方和下方。這種安排使得從邏輯上組織和理解資料模型更加方便。最重要、最進階別的表應該出現在左上方,讓層級較低的表出現在頁面的右下角。為了清楚起見,減少圖中交叉線的數量也是很重要的。正如Eberhardt Rechtin在The Art of Systems Architecting中強調的,“一個好的設計往往看起來很舒服”。如果無論怎樣安排,你的資料模型看起來都很混亂,那麼,它可能正在告訴你資料模型本身有一些值得注意的問題。
圖7a:完整的ER圖(PowerDesigner)
圖7b:完整的ER圖(Visio)
五、從圖到資料庫
依賴於你所選擇的用來建立資料模型的軟體包,建模工具可能會根據模型產生SQL命令或直接修改資料庫模式。這種功能帶來了極大的便利;和使用ASCII格式的SQL指令碼相比,這種方式有著許多優點。一些建模工具的功能適合於大量的資料庫類型,例如PostgreSQL、MySQL、Oracle、DB2,等等。對於簡單的資料庫修改,改動操作可以從建模工具通過ODBC直接完成。資料庫改動還允許以增量方式進行(例如,ALTER命令或建立命令,以及對特定表的更新命令)。當你第一次使用建模工具時,你可以查看建模工具產生的SQL,看看自己是否可以信任和認可建模工具對資料模型的解釋。一段時間之後,你就會熟悉建模工具對各種關係和表細節的解釋。
【結束語】資料建模是一種很好的軟體工程實踐。它能夠協助你在正式編寫程式碼之前規劃資料需求。在維護和改進系統的資料布局的過程中,資料建模同樣很有用。一些工具能夠讓這個過程變得非常簡單,能夠在你管理和設計資料庫系統的時候帶來極大的協助。然而,根據你所需功能的不同,建模工具的價格也有著極大的差異。在不出現預算赤字的情況下,輕鬆掌握和運用資料建模技術的最好方法是,從小型的工具開始,然後逐漸深入和提高。
六、參考和資源
■ 工具
- Sybase PowerDesigner - 一個高端資料建模工具。你可以下載一個45天試用版。
- ERWin - 一個高端資料建模工具。可下載試用版。
- Rational Rose Enterprise - 一個高端UML工具,恰如其分的資料庫建模支援。可下載試用版。
- Visio Professional - 一個價格低廉的繪圖工具,可用來產生資料模型、UML圖等。企業版還支援針對各種資料庫的雙向工程能力。你可以訂購60天試用版的CD。
- Dezign - 一個價格極其低廉的ERD建模工具。你可以下載一個有限制的試用版本。
- ERD Tool List - 一個關於各種資料庫和UML建模工具的連結和資源的清單。
■ 參考
- Database Design for the Web
- Designing Databases
- ERD Notation Summary
- On-Line Database Books
- Diagramming Methods
- Introduction to ER Modeling