O que é um Diagrama de Relacionamento de Entidades (ERD)?
Um Diagrama de Relacionamento de Entidades (ERD) é um plano estrutural usado para projetar, documentar e analisar bancos de dados relacionais. Ele visualiza as tabelas (entidades) dentro de um sistema, as colunas específicas (atributos) que contêm e como essas tabelas se conectam. No PlantUML, os ERDs são criados usando o notação de Engenharia de Informação (IE), que implementa o padrão notação de pé de corvo para representar restrições relacionais.
Seja você projetando um armazenamento de dados de microsserviço, otimizando caminhos de junção SQL ou mapeando uma arquitetura de data warehouse em escala empresarial, um ERD UML baseado em texto garante que seus esquemas de banco de dados sejam perfeitamente claros. Com VPasCode, você pode definir suas tabelas de banco de dados, chaves de índice e relacionamentos lógicos usando uma sintaxe limpa e declarativa. O motor manipula automaticamente o dimensionamento das caixas de tabela e roteia suas strings de conexão de chave estrangeira sem linhas de layout sobrepostas.
Guia de Sintaxe Principal: Elementos e Construções
Construir um ERD robusto no estilo IE no PlantUML depende de blocos de entidades estruturados, designações explícitas de chaves e modificadores de cardinalidade de pé de corvo.
1. Declarando Entidades (Tabelas de Banco de Dados)
Você declara uma tabela de banco de dados usando a entitypalavra-chave, seguida pelo nome da tabela e um conjunto de chaves. Dentro das chaves, você lista as colunas da tabela. Para tornar seu esquema limpo e legível, use um separador horizontal (--) para separar suas chaves primárias/estrangeiras dos atributos de dados padrão:
entity "users" as users_table {
id : INT [PK]
--
email : VARCHAR(255)
created_at : TIMESTAMP
} 
2. Designando Chaves Primárias e Estrangeiras
Embora indicadores de texto como `[PK]` ou `[FK]` funcionem bem, o motor IE do PlantUML também suporta ícones visuais de chaves. Colocar um asterisco (*) antes de um atributo o designa como uma coluna **obrigatória (não nula)**, enquanto uma string de texto limpa ou uma tag adiciona contexto explícito de indexação:
entidade "pedidos" {
* id : INT <<PK>>
--
* user_id : INT <<FK>>
codigo_desconto : VARCHAR(50)
} 
3. Mapeamento da cardinalidade e relações de Pata de Corvo
Para conectar tabelas e garantir restrições de integridade referencial, use uma combinação de traços, colchetes e caracteres de pipe. Na notação IE, esses símbolos formam cabeças distintas de **pata de corvo** que representam relacionamentos de banco de dados:
||--||**Exatamente Um para Exatamente Um:** Um mapeamento estrito e obrigatório de um para um.||--o|**Exatamente Um para Zero ou Um:** Um mapeamento opcional de um para um.||--|{**Exatamente Um para Um ou Muitos:** Uma dependência obrigatória de um para muitos.||--o{**Exatamente Um para Zero, Um ou Muitos:** Uma relação padrão, opcional de um para muitos.
tabela_usuarios ||--o{ pedidos : "coloca" 
Melhores Práticas para Esquemas de Banco de Dados Limpos
- Mantenha as Convenções de Maiúsculas e Minúsculas: Mantenha suas declarações de entidades previsíveis. Use snake_case em minúsculas (por exemplo,
itens_do_pedido) para tabelas reais mapeadas em SQL, ou use CamelCase em maiúsculas para modelos conceituais de domínio. - Documente Sempre as Chaves Estrangeiras: Ao vincular duas tabelas, especifique sempre a coluna de chave estrangeira dentro do bloco da tabela filha. Isso fornece contextos de referência claros para equipes de engenharia durante migrações de dados.
- Controle o Espaçamento da Pata de Corvo: Esquemas de banco de dados complexos com dezenas de tabelas podem se tornar rapidamente lotados. Se suas linhas de relacionamento começarem a cruzar de forma não natural, substitua seus conectores de dois traços (
--) por três ou quatro traços (---) para afastar as tabelas e permitir que o motor de layout tenha mais espaço para organizar a grade.
Exemplos Reais de ERD em PlantUML
Exemplo 1: Modelo Relacional Central de Comércio Eletrônico (Chaves e Mapeamentos)
Este modelo funcional representa um ciclo de transação central de banco de dados de comércio eletrônico, mostrando como usuários, pedidos e lançamentos de pagamentos estão conectados usando relações estritas de pata de corvo.
@startuml
' Congela o renderização da caixa de entidade em quadrados modernos nítidos
esconder círculo
skinparam LINETYPE orto
entidade "users" como user {
* id : INT <<PK>>
--
* email : VARCHAR(100)
* password_hash : VARCHAR(255)
phone : VARCHAR(20)
}
entidade "orders" como order {
* id : INT <<PK>>
--
* user_id : INT <<FK>>
* total_amount : DECIMAL(10,2)
status : VARCHAR(50)
}
entidade "payment_ledgers" como ledger {
* id : INT <<PK>>
--
* order_id : INT <<FK>>
* transaction_reference : VARCHAR(100)
gateway : VARCHAR(50)
}
' Define os vínculos do esquema relacional
user ||--o{ order : "coloca"
order ||--|| ledger : "gera"
@enduml 
Análise de Sintaxe: A diretiva esconder círculo desativa os balões padrão de token de classe UML, enquanto skinparam LINETYPE orto força os caminhos de relacionamento em ângulos retos limpos de 90 graus. O esquema mostra claramente que um usuário pode fazer zero ou muitos pedidos (||--o{), enquanto um pedido deve ter exatamente um registro de lançamento de pagamento associado (||--||).
Exemplo 2: Esquema de Sistema Avançado de Gerenciamento de Conteúdo (Interseção Muitos para Muitos)
Este modelo avançado de empresa mapeia uma topologia completa de sistema de gerenciamento de conteúdo (CMS). Mostra como lidar com arquiteturas muitos para muitos de forma limpa, aproveitando uma tabela intermediária de mapeamento.
@startuml
esconder círculo
skinparam LINETYPE orto
entidade "posts" como post {
* id : INT <<PK>>
--
* author_id : INT <<FK>>
* title : VARCHAR(255)
slug : VARCHAR(255)
body : TEXT
}
entidade "categories" como category {
* id : INT <<PK>>
--
* name : VARCHAR(100)
description : VARCHAR(255)
}
entidade "post_category_mappings" como mapping {
* post_id : INT <<PK>><<FK>>
* category_id : INT <<PK>><<FK>>
--
assigned_at : TIMESTAMP
}
entidade "comments" como comment {
* id : INT <<PK>>
--
* post_id : INT <<FK>>
author_name : VARCHAR(100)
* content : TEXT
}
' Estruturas de links relacionais
post ||--o{ mapping : "contém"
category ||--o{ mapping : "categoriza"
post ||--o{ comment : "anexa"
@enduml 
Análise de Sintaxe: Este modelo representa uma relação clássica muitos para muitos entre posts e categorias. Em vez de conectá-los diretamente, introduz uma tabela intermediária (post_category_mappings) onde ambas as colunas atuam como chave primária composta. Os indicadores de pata de corvo mapeiam explicitamente as relações em cascata até a camada de comentários.