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 を使用してゼロから包括的なホテル管理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 ホテル管理 ERD

hide circle
left to right direction

' 属性付きエンティティの定義
entity "Customer" 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 "Room" 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 "RoomType" 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 "Reservation" 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 "Payment" 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 "Invoice" 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 "Staff" 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 "RoomService" 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 でデータベース設計を生き生きとさせる

複雑なデータベースモデルを構築する際に、ぎこちないドラッグ&ドロップユーザーインターフェースと格闘する必要はありません。コードとしての図(diagram-as-code)のアプローチを活用することで、アーキテクチャはバージョン管理され、クリーンで、手間なく保守可能になります。

自分自身のシステムアーキテクチャの構築を試してみませんか?「VPasCode」へお越しくださいで、リアルタイムレンダリング、自動フォーマット検出、技術文書のためのシームレスなエクスポートを今日から体験してください!

上部へスクロール