![]()
Ketika merancang arsitektur basis data yang kuat untuk domain kompleks seperti perhotelan, memvisualisasikan hubungan secara jelas sangat krusial. Baik Anda memetakan profil pelanggan, melacak persediaan kamar, atau mengelola penagihan, Diagram Hubungan Entitas (ERD) yang terstruktur dengan baik akan menghemat ratusan jam selama pengembangan. Dalam kelas master ini, saya akan membimbing Anda melalui proses pembuatan ERD Manajemen Hotel yang komprehensif dari awal menggunakan PlantUML di dalam editor PlantUML gratis, VPasCode.

1. Menginisialisasi Lingkungan PlantUML
Saya mulai dengan menyiapkan struktur dasar dari skrip. Ketika bekerja dengan skema yang kompleks yang berisi banyak atribut, keterbacaan tata letak sangat penting. Saya mengonfigurasi PlantUML untuk menyembunyikan kekacauan yang tidak perlu dan mengoptimalkan arah tata letak diagram:
@startuml
title ERD Manajemen Hotel
sembunyikan lingkaran
arah kiri ke kanan
Mengapa pendekatan ini? Menyembunyikan lingkaran atribut bawaan membuat kotak entitas tetap bersih dan modern. Mengatur arah menjadi arah kiri ke kanan membantu mencegah ERD yang lebar menjadi tidak terkelola secara vertikal, menyebar secara logis hubungan antar tabel banyak.
2. Menentukan Entitas Inti dan Atribut
Berikutnya, saya perlu menentukan entitas inti yang mewakili domain bisnis kita. Saya mengatur setiap entitas dengan kunci utama, batasan unik, dan atribut bertipe. Mari kita lihat bagaimana saya menyiapkan entitas inti Pelanggan dan TipeKamar entitas:
entitas "Pelanggan" sebagai pelanggan {
* 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)
}
entitas "TipeKamar" sebagai tipekamar {
* 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
}
Dengan menentukan penanda eksplisit seperti <<PK>> dan <<UK>>, siapa pun yang meninjau kode akan langsung memahami aturan indeks dan keunikan sebelum skrip migrasi basis data bahkan ditulis.
3. Memetakan Entitas Operasional (Kamar, Reservasi, dan Staf)
Dengan data referensi kita sudah tersedia, saya beralih ke inti transaksional sistem manajemen hotel: kamar, reservasi, dan alur kerja staf. Setiap entitas terhubung kembali ke tabel dasar kita menggunakan kunci asing:
entitas "Kamar" sebagai kamar {
* 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
}
entitas "Reservasi" sebagai reservasi {
* 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. Menetapkan Hubungan Keuangan dan Layanan
Untuk menyelesaikan arsitektur ini, saya memetakan catatan penagihan (Pembayaran dan Faktur) bersama layanan pendukung seperti Layanan Kamar yang dijalankan oleh staf hotel. Untuk menghubungkan semua elemen ini, saya secara eksplisit menentukan kardinalitas menggunakan notasi PlantUML standar:
' Hubungan
customer ||--o{ reservation : "membuat"
room ||--o{ reservation : "ditugaskan ke"
reservation ||--|| payment : "memiliki"
reservation ||--|| invoice : "menghasilkan"
reservation ||--o{ roomservice : "meminta"
staff ||--o{ roomservice : "memenuhi"
roomtype ||--o{ room : "mengkategorikan"
@enduml
Pilihan Desain: Menggunakan notasi crow’s foot yang tepat (seperti ||--o{ untuk hubungan satu-ke-banyak yang wajib-ke-opsional) memastikan aturan logika bisnis—seperti reservasi yang membutuhkan pelanggan, tetapi pelanggan bisa memiliki beberapa atau nol pemesanan aktif—dipetakan secara akurat.
Skrip PlantUML Lengkap
Berikut adalah kode sumber lengkap dan terkumpul untuk ERD manajemen hotel kami. Anda dapat menyalin dan menempelkan kode ini langsung ke editor PlantUML favorit Anda editor PlantUML gratis untuk mengedit atau merender grafik vektor:
@startuml
title ERD Manajemen Hotel
sembunyikan lingkaran
arah kiri ke kanan
' Definisikan entitas dengan atribut
entity "Pelanggan" 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 "Kamar" 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 "Tipe Kamar" 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 "Reservasi" 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 "Pembayaran" 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 "Faktur" 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 "Staf" 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 "Layanan Kamar" 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)
}
' Hubungan
customer ||--o{ reservation : "membuat"
room ||--o{ reservation : "ditugaskan ke"
reservation ||--|| payment : "memiliki"
reservation ||--|| invoice : "menghasilkan"
reservation ||--o{ roomservice : "meminta"
staff ||--o{ roomservice : "memenuhi"
roomtype ||--o{ room : "mengkategorikan"
@enduml 
Membangun model basis data yang kompleks tidak harus berarti berjuang dengan antarmuka pengguna drag-and-drop yang canggung. Dengan memanfaatkan pendekatan diagram sebagai kode, arsitektur Anda tetap terkelola versi, bersih, dan mudah dipelihara.
Siap mencoba membangun arsitektur sistem Anda sendiri? Beralih ke VPasCode untuk merasakan rendering real-time, deteksi format otomatis, dan ekspor mulus untuk dokumentasi teknis Anda hari ini!



