「PlantUML 是開發人員在設計ER 圖時最有效的工具之一,它採用自動化圖表生成的文字格式,非常適合資料庫驅動的應用程式。」
在本指南中,我們將探討 PlantUML 如何透過將 ER 圖直接整合到您的程式碼庫中,簡化建立 ER 圖的流程。我們還將討論 EdrawMax 等替代工具,為您提供資料庫設計和文件編制的全面方法。
什麼是 ER 圖?
An 實體關聯圖(ER 圖)是設計資料庫的實用工具。它映射資料組織方式,幫助開發人員、分析師和架構師了解資料的內容、結構和關聯性。在建立新系統或記錄現有系統時,ER 圖會以高階方式呈現資訊的儲存和關聯方式。
ER 圖的常見用途包括:
- 設計關聯式資料庫架構
- 向他人傳達資料模型中已建立的關聯性
- 檢視模型的正規化/反正規化資料策略
- 驗證個別資料庫表與其他表之間的完整性或參照完整性
ER 圖是所有使用資料來源作為後端的應用程式中的重要步驟之一。從小型網路應用程式到大型企業,都有大量資料需要管理。
ER 圖的類型
- 概念 ERD:僅包含實體和關聯性的設計 ERD。
- 邏輯 ERD:包含實體屬性、主鍵和外鍵的 ERD。
- 實體 ERD:實際的資料表設計,包含欄位的資料類型和索引 - 可直接在 DBMS 中實作。
ER 圖的主要優點
- 與利害關係人清楚溝通
- 有助於及早發現設計缺陷
- 改善資料完整性和正規化
- 為參照和關聯約束提供實用的文件記錄。
為什麼使用 PlantUML?
許多傳統繪圖工具都具有拖放功能,但它們並非為開發人員工作流程而設計。以二進位檔案儲存的圖表難以進行版本控制,變更需要手動進行,且容易出錯。PlantUML 讓您採用不同的方法。
PlantUML 是一種開源、基於文字的圖表語言,讓您可以像撰寫程式碼一樣撰寫圖表。這具有幾個主要優點:
- 當底層資料庫變更時易於維護
- 可在 git 中進行版本控制
- 可在 CI 管道中或直接在文件中自動呈現
- 一致、可重現且易於自動化
PlantUML 讓您能夠將 ER 圖直接包含在程式碼庫或文件中,這可以提供「活文件」(隨著系統變更和演進的表示)。
開發人員偏好的原因
PlantUML 消除了文件和程式碼之間的障礙。您只需使用純文字來定義實體和它們之間的關聯性,而不是再建立另一個應用程式。PlantUML 的語法清晰、直接且具表達性。
在以下情況下特別有用:
- 想要讓文件與原始碼保持緊密關聯
- 需要擷取資料模型以在多個環境中使用
- 重視一致性、自動化和可維護性
這就是為什麼它是實踐文件即程式碼、敏捷開發實務或自動化基礎架構的團隊的理想選擇。
快速範例
@startumlentity Product { +product_id: INT <> +product_name: VARCHAR +price: DECIMAL(10,2)}@enduml

此範例描述了 ERD 中實體的定義。有一個名為「Product」的實體,包含主鍵(product_id)、名稱欄位和具有精度的十進位價格欄位。這是電子商務或庫存管理系統.
的基本元件。
PlantUML 使用簡化的語法來清晰有效地建立 ER 圖模型。
語法 1實體
實體代表資料庫表。每個實體使用 entity 關鍵字定義,後面跟著屬性區塊。
範例:
@startumlentity Employee { +emp_id: INT <> +first_name: VARCHAR +last_name: VARCHAR +department_id: INT}@enduml

<標記主鍵。> - 屬性已設定類型以反映欄位資料類型。
+表示可見性(通常用於表示在查詢或 API 中公開的欄位)。
語法 2屬性
屬性是表中的欄位。
關鍵標記:
<— 主鍵> <— 外鍵(在關聯性中使用時)> <— 唯一約束>
支援的資料類型:
- INT
- VARCHAR(n)
- DATE
- BOOLEAN
範例:
entity Department { +dept_id: INT <> +dept_name: VARCHAR <> +location: VARCHAR <>
}

欄位可以標註唯一性、可為空或資料類型預期。這些不會被呈現,但在語意上很有幫助。
語法 3關聯性
關聯性在實體外部使用線條連接器和基數符號定義。
基數符號:
||--||→ 一對一||--o{→ 一對多}|--|{→ 多對多
範例:
@startumlEmployee ||--o{ Department : "belongs_to"@enduml

在此範例中,多個員工屬於一個部門。
5 個進階 PlantUML 技巧
PlantUML 讓您能夠定義的不僅僅是簡單的關聯性。您可以建立弱實體、特殊屬性,甚至約束的模型。
技巧 1弱實體
弱實體依賴強實體來識別。例如,「Dependent」(受扶養人)沒有關聯的「Employee」(員工)就無法存在。
@startumlentity Dependent { +emp_id: INT <> +name: VARCHAR +relation: VARCHAR}Dependent }|--|| Employee : "supported_by"@enduml

在這裡,emp_id 既作為外鍵,也作為複合鍵的一部分。
特殊屬性:
PlantUML 允許您使用註解和命名慣例在 ER 圖表中表達更豐富的語義。雖然這些不會強制執行資料庫邏輯,但它們有助於為開發人員和 DBA 記錄意圖。
技巧 2多值
多值屬性代表每筆記錄儲存的集合或清單,通常建模為單獨的實體,但可以內嵌表達以提高清晰度。
@startumlentity Article { +article_id: INT <> +title: VARCHAR +tags: VARCHAR(20)[]}@enduml

這裡,tags 是一個多值屬性(字串的陣列或清單),用於描述分類或標籤。
技巧 3衍生屬性
衍生屬性無法儲存在表格中,因為它們是在執行時計算的。
@startumlentity Invoice { +invoice_id: INT <> +unit_price: DECIMAL +quantity: INT /total_cost: DECIMAL}@enduml

- /total_cost 屬性表示它是衍生的(例如,unit_price × quantity),不直接儲存。
- 斜線(/)是衍生欄位的常見慣例。
技巧 4使用註解的限制條件
屬性可以加上註解以傳達最小值、唯一性或其他限制條件:
@startumlentity Inventory { +item_id: INT <> +stock_level: INT <> +location_code: VARCHAR <>}@enduml

<表示非負限制(對於庫存等數值欄位很有幫助)。> <是必須唯一的欄位(例如:SKU、使用者名稱或電子郵件)。>
這些標籤是記錄意圖、確認其他使用者的假設,並協助下游實作(例如,在 SQL 或 ORM 映射中設計)的一種方式。它們可以表達更豐富的資料建模規則並完善您的圖表。
技巧 4三元關係
您可以透過關聯表建立涉及三個實體的多對多關係模型:
@startumlentity Student { +student_id: INT <> +name: VARCHAR}entity Course { +course_id: INT <> +title: VARCHAR}entity Enrollment { +student_id: INT <> +course_id: INT <> +semester: VARCHAR}Student ||--o{ EnrollmentCourse ||--o{ Enrollment@enduml

這描述了學生註冊課程的流程,並新增了學期的維度。
技巧 5樣式與配置
樣式使圖表更易讀,特別是在複雜的架構中。
變更方向:
預設情況下,圖表是由上而下的,但您可以切換為水平方向。
@startumlleft to right direction@enduml
這在您有寬架構時很有幫助。
自訂顏色和配置:
要根據您的偏好調整圖表的外觀,請使用 skinparam 來設定實體樣式:
@startumlskinparam entity { BackgroundColor #E8F5E9 BorderColor #2E7D32 FontSize 12}@enduml
這有助於視覺化分組相關實體或突出顯示重要實體,並變更 ER 圖表的背景顏色、邊框顏色和字型大小,以提高清晰度和呈現效果。
前 3 個實用 ER 圖範例
範例 1庫存系統
這是簡化庫存系統的 ER 圖表:
@startumlentity Supplier { +supplier_id: INT <> +company_name: VARCHAR +contact_email: VARCHAR}entity Product { +product_id: INT <> +name: VARCHAR +price: DECIMAL +supplier_id: INT <>}entity Warehouse { +warehouse_id: INT <> +location: VARCHAR}Product ||--|| Supplier : "supplied_by"Warehouse ||--o{ Product : "stores"@enduml

此程式碼片段展示了兩個實體(如產品和倉庫)之間多對多關係的良好範例,並顯示產品如何儲存在倉庫中,以及它們與供應商的連結。
範例 2醫院管理系統
這個醫院管理系統 ER 圖表說明了患者、入院和醫生職責之間的關係。它清楚地定義了患者如何由醫生收治,並在三個表格中追蹤記錄。因此它非常適合建立醫療保健系統、醫療資料庫或診所應用程式的模型。
@startumlentity Patient { +patient_id: INT <> +name: VARCHAR +dob: DATE +gender: CHAR}entity Doctor { +doctor_id: INT <> +name: VARCHAR +specialization: VARCHAR}entity Admission { +admission_id: INT <> +admission_date: DATE +patient_id: INT <> +doctor_id: INT <>}Patient ||--o{ Admission : "has"Doctor ||--o{ Admission : "manages"@enduml

範例 3線上學習平台
這是學習管理系統(LMS)的場景,學生註冊課程,講師建立課程。
@startumlentity Student { +student_id: INT <> +full_name: VARCHAR +email: VARCHAR <>}entity Instructor { +instructor_id: INT <> +name: VARCHAR +department: VARCHAR}entity Course { +course_id: INT <> +title: VARCHAR +credits: INT +instructor_id: INT <>}entity Enrollment { +student_id: INT <> +course_id: INT <> +enroll_date: DATE}Student ||--o{ EnrollmentCourse ||--o{ EnrollmentInstructor ||--o{ Course : "teaches"@enduml

此模型顯示了學生和課程之間透過 Enrollment 表格的多對多關係。每門課程也連結到負責教授該課程的教職員。如需更多關於大學系統設計的見解,請探索大學管理系統的 10 個 ER 圖表範本。
專業提示
- 使用套件將相關實體分組:
package "HR" { entity Employee { ... } entity Department { ... }} - 使用 'hide empty members' 來清理空的實體。
- 保持檔案名稱與您的架構版本一致:'schema_v1_2.puml'
- 使用 '!include' 進行大型資料庫的模組化設計
在處理較大或更複雜的資料模型、ER 圖表或不斷演進的資料模型時,您必須保持組織性、可讀性和可維護性。您可以使用 package 關鍵字在 PlantUML 中按模組或領域(如銷售、財務或人力資源)將相關實體分組。這提高了清晰度,並使您的團隊能夠一次專注於系統的單一元件。
使用 hide empty members 進一步清理圖表並減少一些視覺雜亂,當您有尚未建立屬性的裝置時,這會很有用或實用。檔案名稱架構版本(即 schema_v1_2.puml)通常是版本控制和文件追蹤的良好做法。
它允許您開發存放庫並主觀地注意到隨時間的差異。對於相當大型的系統,只需使用!include 來模組化您的圖表即可。這將允許您參考具有對應實體的較小檔案(即每個部門都會有其資產的模組),並在不同迭代中開發而不會覆寫現有元件。
它還促進了多個開發人員之間更好的協作以及專案之間的重複使用。隨著系統累積動力,這些小習慣會隨著時間累積您的收益,降低協作失敗的機會,減少圖表膨脹的可能性,並避免互惠性的混淆。這些策略在處理大型或不斷演進的資料模型時很有幫助。
何時考慮替代方案:EdrawMax
雖然PlantUML 對開發人員來說很棒,但 EdrawMax 提供了幾個優勢,可能更適合不同的使用案例。如果有以下情況,請考慮EdrawMax 或其他替代方案:
- 您需要與業務使用者進行即時協作
- 您想要拖放式 GUI 設計
- 您的團隊不習慣用程式碼撰寫圖表
- 您需要像素級的視覺效果
- 您要向非技術利害關係人展示圖表
- 您需要整合的資料庫架構產生
PlantUML 限制
- 視覺化自訂有限:與 GUI 工具相比,細粒度控制更困難。
- 複雜 ERD 邏輯(例如遞迴關係、觸發器)的學習曲線較陡。
- 除非配置,否則沒有即時預覽:您需要 CLI 工具或 IDE 外掛程式。
- 對於偏好視覺優先介面的非技術利害關係人來說並不理想。
- 沒有原生的鍵或約束強制執行,也就是說,圖表僅具視覺效果。
- 不具互動性,因此無法像某些 GUI 工具那樣點擊查看文件。
然而,在大多數開發人員和技術團隊中,由於自動化和版本控制的優勢,這些取捨是值得的。
GUI 工具選項
雖然 PlantUML 對開發人員來說是一個優秀的文字型工具,但有些團隊可能會使用 GUI 工具——特別是當他們與業務分析師、設計師或不熟悉程式碼的利害關係人進行階段性合作時。
常見的 GUI 型 ER 圖表工具範例:
- EdrawMax:具有業界標準符號、範本和資料庫連接器。非常適合 IT 團隊和教育工作者。
- Lucidchart:一個相對較新的產品,包含即時協作、現代化客戶體驗,並與 Microsoft 365、Atlassian 和 Google Workspace 整合。
- Draw.io (Diagrams.net):這是一個免費的網頁型(並有離線版本)程式,可與 Google 雲端硬碟同步,並提供匯出選項。
重點優勢:
- 所見即所得編輯:您看到的就是您得到的,非常適合非文字思考者。
- 即時協作:可容納大量團隊成員即時評論和共同編輯。
- 輕鬆列印輸出:輕鬆列印任何您格式化的內容,用於客戶、報告或培訓。
- 簡報就緒輸出:輕鬆輸出任何您已格式化的內容,用於客戶、報告或培訓。
考慮使用 GUI 工具的時機:
- 您正在處理面向客戶的文件,且有視覺精緻度的期望。
- 您希望技術和非技術協作者都能更新或評論資料庫視覺圖表。
- 您的專案涉及頻繁的利害關係人簡報、展示或工作坊。
- 您偏好點擊互動而非輸入語法。
GUI 工具雖然不像 PlantUML 那樣具有版本控制或 CI/CD 自動化能力,但對於快速視覺化、設計審查或其他團隊協調會議來說是有用的工具。
總結
PlantUML 是一個實用且有效的工具,可從程式碼自動建立 ER 圖表,這對於許多使用 Git 儲存庫、CI/CD 流程和基於 Markdown 文件的現代開發團隊非常有幫助,通常以即時文件的形式呈現,將圖表視為程式碼使它們能夠真正保持即時文件——視覺效果在相同流程中更新,不再過時或虛假。
PlantUML 的優勢在於自動化圖表、將圖表儲存在版本控制的程式碼中,以及僅使用文字與同事協作。圖表本身可以建置並嵌入到 wiki 或 README 檔案中,並且像任何其他原始碼檔案一樣被追蹤。所有這些優勢使 PlantUML 成為後端開發人員、資料工程師或使用 Agile、DevOps 或文件即程式碼風格的 DevOps 團隊的獨特選擇。
然而,PlantUML 很難被稱為萬靈丹。對於非技術利害關係人、在客戶狀態會議中或快速視覺化腦力激盪期間,基於 GUI 的圖表工具(如 Lucidchart、EdrawMax 或 Draw.io)可能是產生視覺輸出的理想方法。它們具有不需要標記語言知識的友善 GUI 介面,以及可以口頭解釋或審查的明顯視覺風格,因為這只是給定的。如您所見,最佳工具是您正在使用的階段所需的工具。簡而言之,當您的情境圍繞著原始碼控制精確度、可重複性和文件時,您最適合考慮 PlantUML。
在與業務團隊溝通或簡報品質圖表同樣重要的情況下,請考慮將它們與 GUI 工具結合使用。兩者結合可提供穩固且平衡的圖表解決方案。