![]()
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.

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 
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!