![]()
ホスピタリティのような複雑なドメインに対して堅牢なデータベースアーキテクチャを設計する際、関係を明確に可視化することは極めて重要です。顧客プロファイルのマッピング、部屋在庫の追跡、または請求管理を行う場合でも、適切に構造化されたエンティティリレーションシップ図(ERD)は開発中に無数の時間を節約します。このマスタークラスでは、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 ホテル管理 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 
複雑なデータベースモデルを構築する際に、ぎこちないドラッグ&ドロップユーザーインターフェースと格闘する必要はありません。コードとしての図(diagram-as-code)のアプローチを活用することで、アーキテクチャはバージョン管理され、クリーンで、手間なく保守可能になります。
自分自身のシステムアーキテクチャの構築を試してみませんか?「VPasCode」へお越しくださいで、リアルタイムレンダリング、自動フォーマット検出、技術文書のためのシームレスなエクスポートを今日から体験してください!