使用 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 在 免費的 PlantUML 編輯器, VPasCode.

1. 初始化 PlantUML 環境

我首先建立腳本的基礎結構。在處理包含大量屬性的複雜資料結構時,佈局的可讀性至關重要。我設定 PlantUML 以隱藏不必要的雜亂元素,並優化圖表的佈局方向:


@startuml 
title 酒店管理 ERD

hide circle
left to right direction
    

為什麼採用這種方法?隱藏預設的屬性圓圈可讓實體框保持乾淨且現代化。設定方向為從左到右方向可防止寬廣的 ERD 變得垂直上難以管理,並邏輯性地展開多表之間的關係。

2. 定義核心實體與屬性

接下來,我需要定義代表我們業務領域的核心實體。我以主鍵、唯一性約束和類型化屬性來結構化每個實體。讓我們來看看我如何建立核心CustomerRoomType實體:


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

Editing a ERD in Visual Paradigm VPasCode


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

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

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

返回頂端