![]()
ホスピタリティのような複雑な分野の堅牢なデータベースアーキテクチャを設計する際、関係を明確に可視化することは非常に重要です。顧客プロフィールのマッピング、部屋在庫の追跡、請求の管理など、あらゆる場面で、構造が整ったエンティティ関係図(ERD)は開発中に膨大な時間を節約します。このマスタークラスでは、PlantUMLを用いて、VPasCodeの内部で、どのように包括的なホテル管理ERDをゼロから構築したかを丁寧に説明します。無料のPlantUMLエディタ, VPasCode.

1. PlantUML環境の初期化
まず、スクリプトの基盤構造を設定します。多数の属性を含む複雑なスキーマを扱う際、レイアウトの可読性が最も重要です。不要なごちゃごちゃを非表示にし、図のレイアウト方向を最適化するようにPlantUMLを設定します:
@startuml
title ホテル管理ERD
hide circle
left to right direction
なぜこのアプローチなのか?デフォルトの属性円を非表示にすることで、エンティティボックスを洗練され、現代的な見た目に保ちます。方向をleft to right directionに設定することで、広いERDが縦方向に管理不能になるのを防ぎ、複数テーブル間の関係を論理的に広げることができます。
2. コアエンティティと属性の定義
次に、ビジネスドメインを表すコアエンティティを定義する必要があります。各エンティティには主キー、一意制約、型付き属性を構造化して定義します。以下に、コアのCustomerおよびRoomTypeエンティティの設定方法を見てみましょう:
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>>のような明確なマーカーを定義することで、データベース移行スクリプトが書かれる前から、誰がコードを確認してもインデックス付けや一意性のルールを即座に理解できます。<<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{必須対オプションの1対多関係を表すために)を使用することで、予約には顧客が必要だが、顧客が複数またはゼロのアクティブな予約を持つ可能性があるといったビジネスロジックルールが正確にモデル化されます。
完全なPlantUMLスクリプト
ここに、ホテル管理ERDの完全な統合ソースコードを示します。このコードを、お好みの 無料のPlantUMLエディタにコピー&ペーストして、編集またはベクターグラフィックスのレンダリングが可能です:
@startuml
title ホテル管理ERD
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 
複雑なデータベースモデルを構築するには、使いにくいドラッグアンドドロップ型のUIと格闘する必要はありません。図をコードとして扱うアプローチを活用することで、アーキテクチャはバージョン管理され、クリーンで、簡単に保守可能な状態を保ちます。
自らのシステムアーキテクチャを構築してみたいですか? 今すぐ VPasCodeへアクセスして、リアルタイムレンダリング、自動フォーマット検出、技術文書へのスムーズなエクスポートを今日から体験しましょう!



