Criando um Diagrama Entidade-Relacionamento (DER) de Gestão Hoteleira com PlantUML e 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.

Ao projetar arquiteturas de banco de dados robustas para domínios complexos como a hospitalidade, visualizar claramente as relações é fundamental. Seja mapeando perfis de clientes, rastreando inventários de quartos ou gerenciando faturamento, um Diagrama Entidade-Relacionamento (DER) bem estruturado economiza inúmeras horas durante o desenvolvimento. Nesta masterclass, vou mostrar como construí um DER abrangente de Gestão Hoteleira do zero usando PlantUML dentro do editor gratuito de PlantUML, VPasCode.

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

1. Inicializando o Ambiente PlantUML

Começo configurando a estrutura fundamental do script. Ao trabalhar com esquemas complexos contendo numerosos atributos, a legibilidade do layout é primordial. Configuro o PlantUML para ocultar elementos desnecessários e otimizar a direção do layout do diagrama:


@startuml 
title DER de Gestão Hoteleira

hide circle
left to right direction
    

Por que esta abordagem? Ocultar os círculos padrão dos atributos mantém as caixas das entidades limpas e modernas. Definir a direção para da esquerda para a direita ajuda a evitar que DERs largos se tornem verticalmente incontroláveis, distribuindo logicamente as relações entre múltiplas tabelas.

2. Definindo Entidades e Atributos Principais

Em seguida, preciso definir as entidades principais que representam nosso domínio de negócios. Estruturo cada entidade com suas chaves primárias, restrições de unicidade e atributos tipados. Vamos ver como configurei as entidades principais Cliente e Tipo de Quarto:


entity "Cliente" as cliente {
  * 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 "Tipo de Quarto" as tipodequarto {
  * 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
}
    

Ao definir marcadores explícitos como <<PK>> e <<UK>>, qualquer pessoa que revise o código entende instantaneamente as regras de indexação e unicidade antes mesmo de os scripts de migração do banco de dados serem escritos.

3. Mapeando Entidades Operacionais (Quartos, Reservas e Equipe)

Com nossos dados de referência estabelecidos, passo para o coração transacional do sistema de gestão hoteleira: quartos, reservas e fluxos de trabalho da equipe. Cada entidade se conecta às nossas tabelas fundamentais usando chaves estrangeiras:


entity "Quarto" as quarto {
  * 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 "Reserva" as reserva {
  * 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. Estabelecendo Relacionamentos Financeiros e de Serviços

Para finalizar a arquitetura, mapeio os registros de faturamento (Pagamentos e Faturas) juntamente com serviços auxiliares como o Serviço de Quarto, gerenciado pela equipe do hotel. Para conectar tudo, defino explicitamente a cardinalidade usando a notação padrão do PlantUML:


' Relacionamentos
customer ||--o{ reservation : "faz"
room ||--o{ reservation : "atribuído a"
reservation ||--|| payment : "possui"
reservation ||--|| invoice : "gera"
reservation ||--o{ roomservice : "solicita"
staff ||--o{ roomservice : "atende"
roomtype ||--o{ room : "categoriza"

@enduml
    

Escolha de Design: Usando notação precisa de pé de corvo (como “||--o{ para relacionamentos obrigatórios para opcionais de um-para-muitos) garante que as regras de lógica de negócios — como uma reserva exigindo um cliente, mas um cliente podendo ter múltiplas ou zero reservas ativas — sejam modeladas com precisão.

 

O Script PlantUML Completo

Aqui está o código-fonte completo e montado para o nosso diagrama ERD de gerenciamento de hotel. Você pode copiar e colar este código diretamente no seu editor favorito de editor PlantUML gratuito para editar ou renderizar gráficos vetoriais:

@startuml 

title Diagrama ERD de Gerenciamento de Hotel

hide circle
direction left to right

' Definir entidades com atributos
entity "Cliente" 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 "Quarto" 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 "Tipo de Quarto" 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 "Reserva" 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 "Pagamento" 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 "Fatura" 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 "Funcionário" 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 "Serviço de Quarto" 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)
}

' Relacionamentos
customer ||--o{ reservation : "faz"
room ||--o{ reservation : "atribuído a"
reservation ||--|| payment : "possui"
reservation ||--|| invoice : "gera"
reservation ||--o{ roomservice : "solicita"
staff ||--o{ roomservice : "atende"
roomtype ||--o{ room : "categoriza"

@enduml

Editing a ERD in Visual Paradigm VPasCode


Dê Vida aos Seus Projetos de Banco de Dados com o VPasCode

Criar modelos de banco de dados complexos não precisa significar lutar com interfaces de usuário arrastar e soltar pesadas. Ao aproveitar uma abordagem de diagrama como código, sua arquitetura permanece com controle de versão, limpa e facilmente mantível.

Pronto para tentar criar suas próprias arquiteturas de sistema? Vá para VPasCode para experimentar renderização em tempo real, detecção automática de formato e exportações perfeitas para sua documentação técnica hoje mesmo!

Scroll to Top