使用 PlantUML 和 VPasCode 構建酒店管理實體關係圖 (ERD)

A YouTube thumbnail-style graphic featuring the bold text "BUILD PROFESSIONAL DATABASE DIAGRAMS" in large uppercase letters, with a pointing finger icon on the right and a rendered Entity Relationship Diagram displayed in the background.

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

Hotel Management ERD diagram showing relationships between Customer, Room, Reservation, Payment, and Staff entities.

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

Editing a ERD in Visual Paradigm VPasCode


透過 VPasCode 讓您的資料庫設計栩栩如生

建立複雜的資料庫模型,不必意味著要與笨拙的拖放使用者介面搏鬥。透過採用「圖形即程式碼」的方法,您的架構將保持版本控制、整潔,且輕鬆維護。

準備好嘗試建立您自己的系統架構了嗎?請前往VPasCode體驗即時渲染、自動格式偵測,以及為您的技術文件提供無縫匯出的功能!

返回頂端