Création d’un diagramme ER de gestion d’hôtel avec PlantUML et 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.

Lors de la conception d’architectures de bases de données robustes pour des domaines complexes comme l’hôtellerie, visualiser clairement les relations est essentiel. Que vous soyez en train de cartographier les profils clients, de suivre les inventaires de chambres ou de gérer la facturation, un diagramme d’entités et de relations (ERD) bien structuré permet d’économiser des centaines d’heures pendant le développement. Dans cette masterclass, je vous montrerai comment j’ai construit un ERD complet de gestion hôtelière depuis zéro en utilisant PlantUML dans l’éditeur gratuit PlantUML, VPasCode.

1. Initialisation de l’environnement PlantUML

Je commence par établir la structure fondamentale du script. Lorsque l’on travaille avec des schémas complexes contenant de nombreuses attributs, la lisibilité du layout est primordiale. Je configure PlantUML pour masquer les éléments superflus et optimiser la direction du layout du diagramme :


@startuml 
titre Diagramme ER de gestion hôtelière

masquer cercle
direction de gauche à droite
    

Pourquoi cette approche ?Masquer les cercles d’attributs par défaut maintient les boîtes d’entités propres et modernes. Définir la direction à direction de gauche à droiteaide à éviter que les ERD larges ne deviennent verticalement ingérables, en étalant logiquement les relations entre plusieurs tables.

2. Définition des entités et attributs principaux

Ensuite, je dois définir les entités principales représentant notre domaine métier. J’organise chaque entité avec ses clés primaires, ses contraintes uniques et ses attributs typés. Voyons comment j’ai configuré les entités principales Client et Type de chambre des entités :


entité "Client" comme client {
  * 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)
}

entité "Type de chambre" comme 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
}
    

En définissant des marqueurs explicites comme <<PK>> et <<UK>>, tout lecteur du code comprend instantanément les règles d’indexation et d’unicité avant même la rédaction des scripts de migration de base de données.

3. Cartographie des entités opérationnelles (Chambres, Réservations et Personnel)

Avec nos données de référence en place, je passe au cœur opérationnel du système de gestion hôtelière : les chambres, les réservations et les flux de travail du personnel. Chaque entité est liée à nos tables fondamentales à l’aide de clés étrangères :


entité "Chambre" comme chambre {
  * 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
}

entité "Réservation" comme réservation {
  * 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. Établissement des relations financières et de services

Pour conclure l’architecture, je mets en place les enregistrements de facturation (Paiements et Factures) ainsi que les services auxiliaires comme le service en chambre géré par le personnel hôtelier. Pour connecter tout cela, je définis explicitement la cardinalité en utilisant la notation standard de PlantUML :


' Relations
customer ||--o{ reservation : "effectue"
room ||--o{ reservation : "affectée à"
reservation ||--|| payment : "possède"
reservation ||--|| invoice : "génère"
reservation ||--o{ roomservice : "demande"
staff ||--o{ roomservice : "remplit"
roomtype ||--o{ room : "catégorise"

@enduml
    

Choix de conception : Utilisation de la notation précise en forme de bec de corbeau (telle que ||--o{ pour les relations un-à-plusieurs obligatoires-à-optionnelles) garantit que les règles de logique métier—comme une réservation nécessitant un client, mais un client pouvant avoir plusieurs ou zéro réservations actives—soient correctement modélisées.

 

Le script PlantUML complet

Voici le code source complet et assemblé pour notre modèle ER de gestion d’hôtel. Vous pouvez copier-coller ce code directement dans votre éditeur PlantUML préféré éditeur PlantUML gratuit pour éditer ou rendre des graphiques vectoriels :

@startuml 

title Modèle ER de gestion d'hôtel

masquer cercle
direction de gauche à droite

' Définir les entités avec leurs attributs
entity "Client" 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 "Chambre" 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 "Type de Chambre" 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 "Réservation" 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 "Paiement" 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 "Facture" 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 "Personnel" 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 "Service de Chambre" 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)
}

' Relations
customer ||--o{ reservation : "effectue"
room ||--o{ reservation : "affectée à"
reservation ||--|| payment : "possède"
reservation ||--|| invoice : "génère"
reservation ||--o{ roomservice : "demande"
staff ||--o{ roomservice : "remplit"
roomtype ||--o{ room : "catégorise"

@enduml

Editing a ERD in Visual Paradigm VPasCode


Donnez vie à vos conceptions de bases de données avec VPasCode

Construire des modèles de bases de données complexes n’a pas à signifier lutter avec des interfaces utilisateur maladroites basées sur le glisser-déposer. En utilisant une approche diagramme-en-code, votre architecture reste contrôlée par version, propre et facile à maintenir.

Prêt à essayer de construire vos propres architectures système ? Rendez-vous sur VPasCode pour découvrir le rendu en temps réel, la détection automatique des formats et les exports fluides pour votre documentation technique dès aujourd’hui !

Retour en haut