![]()
Saat merancang arsitektur basis data yang kuat untuk domain kompleks seperti perhotelan, memvisualisasikan hubungan secara jelas sangat penting. Baik Anda memetakan profil pelanggan, melacak inventaris kamar, atau mengelola tagihan, Diagram Hubungan Entitas (ERD) yang terstruktur dengan baik dapat menghemat berjam-jam waktu selama pengembangan. Dalam masterclass ini, saya akan memandu Anda melalui cara saya membangun 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 skrip. Saat bekerja dengan skema kompleks yang berisi banyak atribut, keterbacaan tata letak adalah yang paling penting. Saya mengonfigurasi PlantUML untuk menyembunyikan kekacauan yang tidak perlu dan mengoptimalkan arah tata letak diagram:
@startuml
title ERD Manajemen Hotel
hide circle
left to right direction
Mengapa pendekatan ini? Menyembunyikan lingkaran atribut default membuat kotak entitas terlihat bersih dan modern. Mengatur arah ke kiri ke kanan membantu mencegah ERD yang lebar menjadi tidak terkelola secara vertikal, dengan menyebarkan hubungan multi-tabel secara logis.
2. Mendefinisikan Entitas dan Atribut Inti
Selanjutnya, saya perlu mendefinisikan entitas inti yang mewakili domain bisnis kami. Saya menyusun setiap entitas dengan kunci primer, batasan unik, dan atribut bertipe. Mari kita lihat bagaimana saya menyiapkan entitas inti Pelanggan dan JenisKamar:
entity "Pelanggan" 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 "JenisKamar" 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
}
Dengan mendefinisikan penanda eksplisit seperti <<PK>> dan <<UK>>, siapa pun yang meninjau kode akan langsung memahami aturan pengindeksan dan keunikan sebelum skrip migrasi basis data bahkan ditulis.
3. Memetakan Entitas Operasional (Kamar, Reservasi, dan Staf)
Dengan data referensi kami sudah tersedia, saya beralih ke inti transaksional sistem manajemen hotel: kamar, reservasi, dan alur kerja staf. Setiap entitas terhubung kembali ke tabel dasar kami menggunakan kunci asing:
entity "Kamar" 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 "Reservasi" 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. Menetapkan Hubungan Keuangan dan Layanan
Untuk menyempurnakan arsitektur, saya memetakan catatan tagihan (Pembayaran dan Faktur) bersama dengan layanan tambahan seperti Room Service yang ditangani oleh staf hotel. Untuk menghubungkan semuanya, saya secara eksplisit mendefinisikan kardinalitas menggunakan notasi standar PlantUML:
' Relasi
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 : "mengategorikan"
@enduml
Pilihan Desain: Menggunakan notasi kaki gagak yang presisi (seperti “||--o{ untuk relasi satu-ke-banyak dari wajib ke opsional) memastikan aturan logika bisnis—seperti pemesanan yang memerlukan pelanggan, tetapi pelanggan berpotensi memiliki beberapa atau nol pemesanan aktif—dimodelkan dengan akurat.
Skrip PlantUML Lengkap
Berikut adalah kode sumber lengkap yang telah disusun untuk ERD manajemen hotel kami. Anda dapat menyalin dan menempel kode ini langsung ke editor favorit Anda, editor PlantUML gratis untuk mengedit atau merender grafik vektor:
@startuml
title ERD Manajemen Hotel
hide circle
left to right direction
' 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 "TipeKamar" 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 "Pemesanan" 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 "LayananKamar" 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)
}
' Relasi
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 : "mengategorikan"
@enduml 
Membangun model basis data yang kompleks tidak harus berarti bergelut dengan antarmuka pengguna seret-dan-lepas yang canggung. Dengan memanfaatkan pendekatan diagram-sebagai-kode, arsitektur Anda tetap terkendali versi, bersih, dan mudah dipelihara.
Siap mencoba membangun arsitektur sistem Anda sendiri? Kunjungi VPasCode untuk mengalami rendering waktu nyata, deteksi format otomatis, dan ekspor mulus untuk dokumentasi teknis Anda hari ini!