![]()
在設計複雜領域(如酒店業)的穩健資料庫架構時,清晰地可視化關係至關重要。無論您是在繪製客戶資料、追蹤房間庫存,還是管理帳單,一個結構良好的實體關係圖(ERD)都能在開發過程中節省無數時間。在這堂進階課程中,我將帶您一步步了解我如何使用 PlantUML 在 免費的 PlantUML 編輯器, VPasCode.

1. 初始化 PlantUML 環境
我首先建立腳本的基礎結構。在處理包含大量屬性的複雜資料結構時,佈局的可讀性至關重要。我設定 PlantUML 以隱藏不必要的雜亂元素,並優化圖表的佈局方向:
@startuml
title 酒店管理 ERD
hide circle
left to right direction
為什麼採用這種方法?隱藏預設的屬性圓圈可讓實體框保持乾淨且現代化。設定方向為從左到右方向可防止寬廣的 ERD 變得垂直上難以管理,並邏輯性地展開多表之間的關係。
2. 定義核心實體與屬性
接下來,我需要定義代表我們業務領域的核心實體。我以主鍵、唯一性約束和類型化屬性來結構化每個實體。讓我們來看看我如何建立核心Customer 和 RoomType實體:
entity "Customer" as customer {
* customer_id : UUID <<PK>>
--
first_name : VARCHAR(50)
last_name : VARCHAR(50)
email : VARCHAR(100) <<UK>>
phone : VARCHAR(20)
address : TEXT
loyalty_points : INTEGER
total_stays : INTEGER
date_registered : TIMESTAMP
date_of_birth : DATE
nationality : VARCHAR(50)
}
entity "RoomType" as roomtype {
* room_type_id : UUID <<PK>>
--
type_name : VARCHAR(50) <<UK>>
description : TEXT
standard_capacity : INTEGER
base_price : DECIMAL(10,2)
extra_bed_charge : DECIMAL(10,2)
has_kitchenette : BOOLEAN
has_balcony : BOOLEAN
}
透過定義明確的標記,例如<<PK>> 和 <<UK>>,任何審閱程式碼的人都能立即理解索引與唯一性規則,甚至在撰寫資料庫遷移腳本之前就清楚掌握。
3. 建立操作性實體(房間、預訂與員工)
在參考資料設定完成後,我接著進入酒店管理系統的交易核心:房間、預訂與員工工作流程。每個實體都透過外鍵連結回我們的基礎資料表:
entity "Room" as room {
* room_id : UUID <<PK>>
--
room_number : VARCHAR(10) <<UK>>
floor_number : INTEGER
room_type_id : UUID <<FK>>
capacity : INTEGER
base_price : DECIMAL(10,2)
is_available : BOOLEAN
has_view : BOOLEAN
square_feet : INTEGER
last_renovated : DATE
}
entity "Reservation" as reservation {
* reservation_id : UUID <<PK>>
--
customer_id : UUID <<FK>>
room_id : UUID <<FK>>
check_in_date : DATE
check_out_date : DATE
number_of_guests : INTEGER
total_amount : DECIMAL(10,2)
status : VARCHAR(20)
special_requests : TEXT
created_at : TIMESTAMP
updated_at : TIMESTAMP
confirmation_code : VARCHAR(20) <<UK>>
}
4. 建立財務與服務關係
為了完成架構設計,我繪製出帳單記錄(付款與發票),以及由酒店員工處理的輔助服務(如客房服務)。為了將所有內容連結起來,我使用標準的 PlantUML 記法明確定義了關係的基數。
' 關係
customer ||--o{ reservation : "建立"
room ||--o{ reservation : "指派給"
reservation ||--|| payment : "擁有"
reservation ||--|| invoice : "產生"
reservation ||--o{ roomservice : "請求"
staff ||--o{ roomservice : "執行"
roomtype ||--o{ room : "分類"
@enduml
設計選擇: 使用精確的烏鴉腳符號(例如 ||--o{ 用於強制性至可選性的一對多關係)可確保商業邏輯規則——例如預訂必須有客戶,但客戶可能有零個或多個活躍預訂——被準確地建模。
完整的 PlantUML 程式碼
以下是我們酒店管理實體關係圖的完整組合原始碼。您可以直接將此程式碼複製貼上至您最喜愛的 免費 PlantUML 編輯器 以進行編輯或渲染向量圖形:
@startuml
title 酒店管理實體關係圖
hide circle
left to right direction
' 定義實體及其屬性
entity "客戶" as customer {
* customer_id : UUID <>
--
first_name : VARCHAR(50)
last_name : VARCHAR(50)
email : VARCHAR(100) <>
phone : VARCHAR(20)
address : TEXT
loyalty_points : INTEGER
total_stays : INTEGER
date_registered : TIMESTAMP
date_of_birth : DATE
nationality : VARCHAR(50)
}
entity "房間" as room {
* room_id : UUID <>
--
room_number : VARCHAR(10) <>
floor_number : INTEGER
room_type_id : UUID <>
capacity : INTEGER
base_price : DECIMAL(10,2)
is_available : BOOLEAN
has_view : BOOLEAN
square_feet : INTEGER
last_renovated : DATE
}
entity "房間類型" as roomtype {
* room_type_id : UUID <>
--
type_name : VARCHAR(50) <>
description : TEXT
standard_capacity : INTEGER
base_price : DECIMAL(10,2)
extra_bed_charge : DECIMAL(10,2)
has_kitchenette : BOOLEAN
has_balcony : BOOLEAN
}
entity "預訂" as reservation {
* reservation_id : UUID <>
--
customer_id : UUID <>
room_id : UUID <>
check_in_date : DATE
check_out_date : DATE
number_of_guests : INTEGER
total_amount : DECIMAL(10,2)
status : VARCHAR(20)
special_requests : TEXT
created_at : TIMESTAMP
updated_at : TIMESTAMP
confirmation_code : VARCHAR(20) <>
}
entity "付款" as payment {
* payment_id : UUID <>
--
reservation_id : UUID <>
amount : DECIMAL(10,2)
payment_date : TIMESTAMP
payment_method : VARCHAR(30)
transaction_id : VARCHAR(50) <>
status : VARCHAR(20)
receipt_url : TEXT
refund_amount : DECIMAL(10,2)
}
entity "發票" as invoice {
* invoice_id : UUID <>
--
reservation_id : UUID <>
invoice_number : VARCHAR(20) <>
issued_date : DATE
due_date : DATE
subtotal : DECIMAL(10,2)
tax : DECIMAL(10,2)
service_charge : DECIMAL(10,2)
total_amount : DECIMAL(10,2)
status : VARCHAR(20)
}
entity "員工" as staff {
* staff_id : UUID <>
--
first_name : VARCHAR(50)
last_name : VARCHAR(50)
email : VARCHAR(100) <>
phone : VARCHAR(20)
role : VARCHAR(30)
hire_date : DATE
salary : DECIMAL(10,2)
shift_schedule : VARCHAR(50)
is_active : BOOLEAN
}
entity "客房服務" as roomservice {
* service_id : UUID <>
--
reservation_id : UUID <>
staff_id : UUID <>
service_type : VARCHAR(50)
description : TEXT
request_time : TIMESTAMP
completion_time : TIMESTAMP
status : VARCHAR(20)
price : DECIMAL(10,2)
}
' 關係
customer ||--o{ reservation : "建立"
room ||--o{ reservation : "指派給"
reservation ||--|| payment : "擁有"
reservation ||--|| invoice : "產生"
reservation ||--o{ roomservice : "請求"
staff ||--o{ roomservice : "執行"
roomtype ||--o{ room : "分類"
@enduml 
建立複雜的資料庫模型不一定要與笨拙的拖放式使用者介面搏鬥。透過採用圖形即程式碼的方法,您的架構將保持版本控制、乾淨且輕鬆維護。
準備好嘗試建立自己的系統架構了嗎?立即前往 VPasCode 來體驗即時渲染、自動格式偵測,以及為您的技術文件輕鬆匯出的功能吧!



