Membangun ERD Manajemen Hotel dengan PlantUML dan VPasCode

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.

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.

Hotel Management ERD diagram showing relationships between Customer, Room, Reservation, Payment, and Staff entities.

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

Editing a ERD in Visual Paradigm VPasCode


Hidupkan Desain Basis Data Anda dengan VPasCode

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!

Scroll to Top