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



