Construindo um ERD de Gestão de Hotéis 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 o hospitalar, visualizar relacionamentos de forma clara é essencial. Seja ao mapear perfis de clientes, rastrear estoques de quartos ou gerenciar faturamento, um Diagrama de Relacionamento de Entidades (ERD) bem estruturado poupa incontáveis horas durante o desenvolvimento. Neste masterclass, vou mostrar como criei um ERD abrangente de Gestão de Hotéis do zero usando PlantUML dentro do editor gratuito do PlantUML, VPasCode.

1. Inicializando o Ambiente do PlantUML

Começo configurando a estrutura fundamental do script. Ao trabalhar com esquemas complexos que contêm numerosos atributos, a legibilidade do layout é fundamental. Configuro o PlantUML para ocultar ruídos desnecessários e otimizar a direção do layout do diagrama:


@startuml 
título ERD de Gestão de Hotéis

esconder círculo
direção da esquerda para a direita
    

Por que essa abordagem?Ocultar os círculos de atributos padrão mantém as caixas de entidades limpas e modernas. Definir a direção como direção da esquerda para a direitaajuda a evitar que ERDs largos se tornem verticalmente inviáveis, espalhando relacionamentos entre múltiplas tabelas de forma lógica.

2. Definindo Entidades Principais e Atributos

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 únicas e atributos tipados. Vamos ver como configurei as entidades principais Cliente e Tipo de Quarto entidades:


entidade "Cliente" como 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)
}

entidade "Tipo de Quarto" como 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 revisando o código entende imediatamente 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 Funcionários)

Com nossos dados de referência em lugar, passo para o coração operacional do sistema de gestão de hotéis: quartos, reservas e fluxos de trabalho de funcionários. Cada entidade se liga de volta às nossas tabelas fundamentais usando chaves estrangeiras:


entidade "Quarto" como 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
}

entidade "Reserva" como 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ço

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


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

@enduml
    

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

 

O Script Completo do PlantUML

Aqui está o código-fonte completo e montado para o nosso ERD de gestão de hotéis. Você pode copiar e colar este código diretamente em seu editor editor gratuito do PlantUML para editar ou renderizar gráficos vetoriais:

@startuml 

title ERD de Gestão de Hotéis

esconder círculo
direção da esquerda para a direita

' Definir entidades com atributos
entidade "Cliente" como 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)
}

entidade "Quarto" como 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
}

entidade "Tipo de Quarto" como 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
}

entidade "Reserva" como 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) <>
}

entidade "Pagamento" como 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)
}

entidade "Fatura" como 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)
}

entidade "Funcionário" como 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
}

entidade "Serviço de Quarto" como 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 : "realiza"
room ||--o{ reservation : "atribuída 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


Leve seus projetos de banco de dados à vida com o VPasCode

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

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

Scroll to Top