Erstellen einer Hotel-Management-ERD mit PlantUML und 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.

Beim Entwurf robuster Datenbankarchitekturen für komplexe Domänen wie das Gastgewerbe ist die klare Visualisierung von Beziehungen entscheidend. Ob Sie Kundenprofile abbilden, Zimmerbestände verfolgen oder Abrechnungen verwalten – ein gut strukturierter Entity-Relationship-Diagramm (ERD) spart unzählige Stunden während der Entwicklung. In diesem Masterclass führe ich Sie Schritt für Schritt durch, wie ich eine umfassende Hotel-Management-ERD von Grund auf mit PlantUML innerhalb des kostenlosen PlantUML-Editors, VPasCode.

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

1. Initialisieren der PlantUML-Umgebung

Ich beginne damit, die grundlegende Struktur des Skripts einzurichten. Bei der Arbeit mit komplexen Schemata, die zahlreiche Attribute enthalten, ist die Lesbarkeit des Layouts von größter Bedeutung. Ich konfiguriere PlantUML so, dass unnötiger Ballast ausgeblendet und die Diagramm-Layout-Richtung optimiert wird:


@startuml 
titel Hotel-Management-ERD

hide circle
left to right direction
    

Warum dieser Ansatz? Das Ausblenden der Standard-Attribut-Kreise hält die Entity-Boxen sauber und modern. Das Einstellen der Richtung auf left to right direction hilft verhindern, dass breite ERDs vertikal unübersichtlich werden, indem sie mehrstellige Beziehungen logisch aufteilen.

2. Definieren von Kern-Entitäten und Attributen

Als Nächstes muss ich die Kern-Entitäten definieren, die unser Geschäftsdomänen abbilden. Ich strukturiere jede Entität mit ihren Primärschlüsseln, Unique-Constraints und typisierten Attributen. Schauen wir uns an, wie ich die Kern-Entitäten Kunde und Zimmerart-Entitäten einrichte:


entity "Kunde" as kunde {
  * kunde_id : UUID <<PK>>
  --
  vorname : VARCHAR(50)
  nachname : VARCHAR(50)
  email : VARCHAR(100) <<UK>>
  telefon : VARCHAR(20)
  adresse : TEXT
  treuepunkte : INTEGER
  gesamtübernachtungen : INTEGER
  registrierungsdatum : TIMESTAMP
  geburtsdatum : DATE
  staatsangehörigkeit : VARCHAR(50)
}

entity "Zimmerart" as zimmerart {
  * zimmerart_id : UUID <<PK>>
  --
  artname : VARCHAR(50) <<UK>>
  beschreibung : TEXT
  standardkapazität : INTEGER
  grundpreis : DECIMAL(10,2)
  zusatzbettgebühr : DECIMAL(10,2)
  hat_küchenzeile : BOOLEAN
  hat_balkon : BOOLEAN
}
    

Durch das Definieren expliziter Marker wie <<PK>> und <<UK>> versteht jeder, der den Code prüft, sofort die Indizierungs- und Eindeutigkeitsregeln, noch bevor die Datenbank-Migrations-Skripte überhaupt geschrieben werden.

3. Abbilden von operativen Entitäten (Zimmer, Reservierungen und Personal)

Nachdem unsere Referenzdaten bereitstehen, gehe ich zum transaktionalen Kern des Hotel-Management-Systems über: Zimmer, Reservierungen und Personalabläufe. Jede Entität verweist über Fremdschlüssel zurück auf unsere grundlegenden Tabellen:


entity "Zimmer" as zimmer {
  * zimmer_id : UUID <<PK>>
  --
  zimmernummer : VARCHAR(10) <<UK>>
  stockwerk : INTEGER
  zimmerart_id : UUID <<FK>>
  kapazität : INTEGER
  grundpreis : DECIMAL(10,2)
  ist_verfügbar : BOOLEAN
  hat_aussicht : BOOLEAN
  quadratmeter : INTEGER
  letzte_sanierung : DATE
}

entity "Reservierung" as reservierung {
  * reservierungs_id : UUID <<PK>>
  --
  kunde_id : UUID <<FK>>
  zimmer_id : UUID <<FK>>
  anreisedatum : DATE
  abreisedatum : DATE
  anzahl_gäste : INTEGER
  gesamtsumme : DECIMAL(10,2)
  status : VARCHAR(20)
  besondere_wünsche : TEXT
  erstellungsdatum : TIMESTAMP
  aktualisierungsdatum : TIMESTAMP
  bestätigungscode : VARCHAR(20) <<UK>>
}
    

4. Etablieren von finanziellen und servicebezogenen Beziehungen

Um die Architektur abzurunden, erstelle ich eine Übersicht der Abrechnungsdaten (Zahlungen und Rechnungen) sowie ergänzender Dienstleistungen wie dem Zimmerservice, der vom Hotelpersonal erledigt wird. Um alles miteinander zu verbinden, definiere ich die Kardinalität explizit unter Verwendung der Standard-PlantUML-Notation:


' Beziehungen
customer ||--o{ reservation : "macht"
room ||--o{ reservation : "zugewiesen"
reservation ||--|| payment : "hat"
reservation ||--|| invoice : "generiert"
reservation ||--o{ roomservice : "fordert an"
staff ||--o{ roomservice : "erfüllt"
roomtype ||--o{ room : "kategorisiert"

@enduml
    

Designentscheidung: Die Verwendung präziser Krähenfuß-Notation (wie “||--o{ für zwingende-zu-optionale Eins-zu-Viele-Beziehungen) stellt sicher, dass die Geschäftslogikregeln – wie eine Reservierung, die einen Kunden erfordert, ein Kunde jedoch möglicherweise mehrere oder keine aktiven Buchungen haben kann – korrekt modelliert werden.

 

Das vollständige PlantUML-Skript

Hier ist der vollständige, zusammengeführte Quellcode für unsere ERD für das Hotelmanagement. Sie können diesen Code direkt in Ihren bevorzugten kostenlosen PlantUML-Editoreingeben, um Vektorgrafiken zu bearbeiten oder darzustellen:

@startuml 

titel Hotelmanagement-ERD

hide circle
left to right direction

' Entitäten mit Attributen definieren
entity "Kunde" 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 "Zimmer" 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 "ZimmerTyp" 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 "Reservierung" 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 "Zahlung" 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 "Rechnung" 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 "Mitarbeiter" 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 "Zimmerservice" 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)
}

' Beziehungen
customer ||--o{ reservation : "macht"
room ||--o{ reservation : "zugewiesen"
reservation ||--|| payment : "hat"
reservation ||--|| invoice : "generiert"
reservation ||--o{ roomservice : "fordert an"
staff ||--o{ roomservice : "erfüllt"
roomtype ||--o{ room : "kategorisiert"

@enduml

Editing a ERD in Visual Paradigm VPasCode


Bringen Sie Ihre Datenbankdesigns mit VPasCode zum Leben

Das Erstellen komplexer Datenbankmodelle muss nicht bedeuten, sich mit umständlichen Drag-and-Drop-Benutzeroberflächen herumschlagen zu müssen. Durch die Nutzung eines Diagramm-als-Code-Ansatzes bleibt Ihre Architektur versioniert, sauber und mühelos wartbar.

Bereit, Ihre eigenen Systemarchitekturen zu erstellen? Besuchen Sie VPasCodeum noch heute Echtzeit-Rendering, automatische Formaterkennung und nahtlose Exporte für Ihre technischen Dokumentationen zu erleben!

Nach oben scrollen