![]()
當為酒店管理等複雜領域設計堅固的資料庫架構時,清晰地視覺化關係至關重要。無論您是映射客戶資料、追蹤房間庫存,還是管理帳單,結構良好的實體關係圖 (ERD) 都能在開發過程中節省無數小時。在本大師課中,我將帶您逐步了解我如何從零開始,在「免費 PlantUML 編輯器」內的 VPasCode 中使用 PlantUML 構建全面的酒店管理 ERD。免費 PlantUML 編輯器, VPasCode.

1. 初始化 PlantUML 環境
我首先設定腳本的基礎結構。當處理包含眾多屬性的複雜資料結構時,佈局的易讀性至關重要。我配置 PlantUML 以隱藏不必要的雜訊,並優化圖表的佈局方向:
@startuml
title 酒店管理 ERD
hide circle
left to right direction
為何採用此方法?隱藏預設的屬性圓圈可保持實體框整潔且現代化。將方向設定為「由左至右方向」有助於防止寬廣的 ERD 變得垂直難以管理,並邏輯性地擴展多表關係。
2. 定義核心實體與屬性
接下來,我需要定義代表我們業務領域的核心實體。我為每個實體設定主鍵、唯一約束及具型別的屬性。讓我們來看看我如何設定核心「客戶」與「房型」實體:
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 腳本
以下是我們酒店管理實體關係圖(ERD)的完整組合原始碼。您可以將此程式碼直接複製並貼上至您喜愛的免費 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體驗即時渲染、自動格式偵測,以及為您的技術文件提供無縫匯出的功能!