Processo Tipo
Expressão gráfica
Pensamento Tipo
Expressão estruturada
Anotações Tipo
Expressão eficiente

Diagrama ERSintaxe

Diagrama ER

O diagrama de entidade-relacionamento (abreviado como diagrama ER) descreve coisas de interesse inter-relacionadas em um determinado domínio de conhecimento. Um diagrama ER básico é composto por tipos de entidade (usados para classificar as coisas de interesse) e especifica os relacionamentos que podem existir entre entidades (instâncias desses tipos de entidade),Observe que, na prática, em diagramas ER quase sempre se abrevia 'tipo de entidade' como 'entidade'. Por exemplo, 'o tipo de entidade CUSTOMER' costuma ser chamado diretamente de 'a entidade CUSTOMER'. Essa prática é muito comum e, por isso, outras formas não são recomendadas; tecnicamente, no entanto, uma entidade é uma instância abstrata de um tipo de entidade, e o diagrama ER exibe exatamente essas instâncias abstratas e suas relações. É por isso que as entidades são sempre nomeadas com substantivos no singular.

Código
                            
Copiar
Incorporar
--- title: Order example --- erDiagram CUSTOMER ||--o{ ORDER : places ORDER ||--|{ LINE-ITEM : contains CUSTOMER }|..|{ DELIVERY-ADDRESS : uses

Os nomes de entidade geralmente são em maiúsculas, embora não haja um padrão reconhecido para isso, e a sintaxe do Mermaid também não o exija.

As relações entre as entidades são representadas por linhas com marcações nas extremidades que indicam a cardinalidade. O Mermaid usa a notação pé de galinha, a mais popular, que indica visualmente que a entidade à qual está conectada pode ter várias instâncias.

Os diagramas ER podem ser usados para diversos fins, desde modelos lógicos abstratos que não contêm nenhum detalhe de implementação até modelos físicos de tabelas de banco de dados relacional. Incluir definições de atributos em um diagrama ER ajuda a entender o propósito e o significado das entidades; essas definições não precisam ser exaustivas, geralmente uma pequena parte dos atributos já é suficiente. O Mermaid permite defini-los com seu tipo e nome.

Código
                            
Copiar
Incorporar
erDiagram CUSTOMER ||--o{ ORDER : places CUSTOMER { string name string custNumber string sector } ORDER ||--|{ LINE-ITEM : contains ORDER { int orderNumber string deliveryAddress } LINE-ITEM { string productCode int quantity float pricePerUnit }

Ao incluir atributos em um diagrama ER, você deve decidir se inclui chaves estrangeiras como atributos, o que pode depender de quanto você deseja representar a estrutura das tabelas relacionais. Se o seu diagrama for um modelo lógico, sem a intenção de sugerir uma implementação relacional, é melhor não incluir esses atributos, pois as associações já comunicam como as entidades se relacionam. Por exemplo, uma estrutura de dados JSON pode implementar uma relação um-para-muitos usando arrays sem atributos de chave estrangeira. Da mesma forma, linguagens de programação orientadas a objetos podem usar ponteiros ou referências a coleções. Mesmo para modelos destinados a uma implementação relacional, pode-se considerar que incluir atributos de chave estrangeira duplica a informação já exibida pelas relações e não acrescenta significado à entidade.

Sintaxe

Entidades e relações

A sintaxe Mermaid do diagrama ER é compatível com o PlantUML e a estende com recursos para rotular relações. Cada instrução inclui o seguinte:

                            
Copiar
Incorporar
<first-entity> [<relationship> <second-entity> : <relationship-label>]
  • first-entity é o nome da primeira entidade. O nome oferece suporte a qualquer caractere Unicode e, se colocado entre aspas duplas, pode conter espaços.
  • relationship descreve a relação mútua entre duas entidades.
  • second-entity é o nome da outra entidade.
  • relationship-label descreve a relação da perspectiva da primeira entidade.

Por exemplo:

                            
Copiar
Incorporar
PROPERTY ||--|{ ROOM : contains

Essa declaração pode ser entendida como: uma propriedade contém um ou mais cômodos, e um cômodo pertence a apenas uma propriedade. Aqui o rótulo é visto da perspectiva da primeira entidade: uma propriedade contém um cômodo, mas um cômodo não contém propriedades. Da perspectiva da segunda entidade, o rótulo equivalente geralmente é fácil de deduzir.

Somente a parte first-entity é obrigatória. Isso possibilita exibir entidades sem relações, o que é muito útil ao construir diagramas iterativamente. Se outras partes da instrução forem especificadas, então todas as partes serão obrigatórias.

Texto Unicode

Os nomes de entidade, as relações e os atributos oferecem suporte a texto unicode.

Código
                            
Copiar
Incorporar
erDiagram "This ❤ Unicode"

Sintaxe das relações

A parte da relação em cada instrução pode ser dividida em três subpartes:

  • A cardinalidade da primeira entidade em relação à segunda
  • Se a relação concede identificação à entidade filha
  • A cardinalidade da segunda entidade em relação à primeira

Cardinalidade é um atributo que descreve o número de elementos de outra entidade que podem estar associados à entidade envolvida. No exemplo acima, um PROPERTY pode ser associado a uma ou mais instâncias de ROOM, enquanto um ROOM só pode ser associado a um PROPERTY. Cada marcação de cardinalidade tem dois caracteres: o caractere mais externo representa o valor máximo e o mais interno representa o valor mínimo. A tabela abaixo resume as possibilidades de cardinalidade:

Valor (esquerda) Valor (direita) Significado
|o o| Zero ou um
|| || Exatamente um
}o o{ Zero ou mais (sem limite)
}| |{ Um ou mais (sem limite)
Alias
Valor (esquerda) Valor (direita) Significado
one or zero one or zero Zero ou um
zero or one zero or one Zero ou um
one or more one or more Um ou mais
one or many one or many Um ou mais
many(1) many(1) Um ou mais
1+ 1+ Um ou mais
zero or more zero or more Zero ou mais
zero or many zero or many Zero ou mais
many(0) many(0) Zero ou mais
0+ 0+ Zero ou mais
only one only one Exatamente um
1 1 Exatamente um

Identificação

As relações podem ser classificadas em identificadoras e não identificadoras, renderizadas respectivamente com linha sólida ou tracejada. Isso é importante quando uma das entidades não pode existir de forma independente sem a outra. Por exemplo, uma empresa que oferece seguro para pessoas que dirigem carros pode precisar armazenar os dados de NAMED-DRIVER. Ao modelar, podemos observar primeiro que um CAR pode ser dirigido por muitas PERSON, e que uma PERSON pode dirigir muitos CAR; ambos podem existir sem o outro, então esta é uma relação não identificadora, que podemos especificar no Mermaid como: PERSON }|..|{ CAR : "driver". Observe os dois pontos no meio da relação, o que fará com que uma linha tracejada seja desenhada entre as duas entidades. Entretanto, quando essa relação muitos-para-muitos é resolvida em duas relações um-para-muitos, observamos que NAMED-DRIVER não poderia existir sem PERSON e CAR. Essas relações se tornam relações identificadoras e são representadas com hífen, correspondendo a uma linha sólida:

Valor Alias
-- Identificador
.. Não identificador
Alias
Valor 别名为
to Identificador
optionally to Não identificador
Código
                            
Copiar
Incorporar
erDiagram CAR ||--o{ NAMED-DRIVER : allows PERSON }o..o{ NAMED-DRIVER : is
Código
                            
Copiar
Incorporar
erDiagram CAR ||--o{ NAMED-DRIVER : allows PERSON }o--o{ NAMED-DRIVER : is

Atributos

É possível definir atributos para uma entidade especificando o nome da entidade e, em seguida, um bloco contendo vários type name, com o bloco delimitado por chaves {}. Os atributos são exibidos dentro da caixa da entidade, por exemplo:

Código
                            
Copiar
Incorporar
erDiagram CAR ||--o{ NAMED-DRIVER : allows CAR { string registrationNumber string make string model } PERSON ||--o{ NAMED-DRIVER : is PERSON { string firstName string lastName int age }

O valor de type deve começar com um caractere alfabético e pode conter números, hífens, sublinhados, parênteses e colchetes. O valor de name segue um formato semelhante ao de type, mas também pode começar com um asterisco, como outra opção para indicar que o atributo é uma chave primária. Além disso, não há outras restrições nem um conjunto implícito de tipos de dados válidos.

Alias de entidade

É possível adicionar um alias a uma entidade usando colchetes. Se um alias for fornecido, o diagrama exibirá o alias em vez do nome da entidade, e o alias segue todas as mesmas regras do nome da entidade.

Código
                            
Copiar
Incorporar
erDiagram p[Person] { string firstName string lastName } a["Customer Account"] { string email } p ||--o| a : has

Chaves e comentários de atributos

Os atributos também podem definir chaves ou comentários. As chaves podem ser chave primária (PK), chave estrangeira (FK) ou chave única (UK). Para especificar várias restrições de chave em um único atributo, separe-as por vírgula (por exemplo, PK, FK). Os comentários são definidos por aspas duplas no final do atributo, e o comentário não pode conter o caractere de aspas duplas.

Código
                            
Copiar
Incorporar
erDiagram CAR ||--o{ NAMED-DRIVER : allows CAR { string registrationNumber PK string make string model string[] parts } PERSON ||--o{ NAMED-DRIVER : is PERSON { string driversLicense PK "The license #" string(99) firstName "Only 99 characters are allowed" string lastName string phone UK int age } NAMED-DRIVER { string carRegistrationNumber PK, FK string driverLicence PK, FK } MANUFACTURER ||--o{ CAR : makes

Direção

A instrução de direção declara a direção do diagrama.

TB declara que a direção do diagrama é de cima para baixo; BT pode invertê-la para de baixo para cima.

Código
                            
Copiar
Incorporar
erDiagram direction TB CUSTOMER ||--o{ ORDER : places CUSTOMER { string name string custNumber string sector } ORDER ||--|{ LINE-ITEM : contains ORDER { int orderNumber string deliveryAddress } LINE-ITEM { string productCode int quantity float pricePerUnit }

LR declara que a direção do diagrama é da esquerda para a direita; RL pode invertê-la para da direita para a esquerda.

Código
                            
Copiar
Incorporar
erDiagram direction LR CUSTOMER ||--o{ ORDER : places CUSTOMER { string name string custNumber string sector } ORDER ||--|{ LINE-ITEM : contains ORDER { int orderNumber string deliveryAddress } LINE-ITEM { string productCode int quantity float pricePerUnit }

Definir o estilo do nó

É possível aplicar um estilo específico a um nó, como borda mais espessa ou uma cor de fundo diferente.

Código
                            
Copiar
Incorporar
erDiagram id1||--||id2 : label style id1 fill:pink,stroke:yellow,stroke-width:4px style id2 fill:#69d,stroke:#f96,stroke-width:2px,color:#fff,stroke-dasharray: 5 5

Também é possível anexar estilos a uma lista de nós em uma única instrução:

                            
Copiar
Incorporar
style nodeId1,nodeId2 styleList

Classe

Mais conveniente do que definir o estilo toda vez é definir uma classe de estilo e anexá-la aos nós que precisam de uma aparência diferente.

A definição de classe é mostrada no exemplo a seguir:

                            
Copiar
Incorporar
classDef className fill:pink,stroke:#333,stroke-width:4px

Também é possível definir várias classes em uma instrução:

                            
Copiar
Incorporar
classDef firstClassName,secondClassName font-size:12pt

A sintaxe para anexar uma classe a um nó é a seguinte:

                            
Copiar
Incorporar
class nodeId1 className

Também é possível anexar uma classe a uma lista de nós em uma única instrução:

                            
Copiar
Incorporar
class nodeId1,nodeId2 className

Também é possível anexar várias classes ao mesmo tempo:

                            
Copiar
Incorporar
class nodeId1,nodeId2 className1,className2

Uma forma simples de adicionar classes é usar o operador ::: para anexar o nome da classe ao nó, como mostrado abaixo:

Código
                            
Copiar
Incorporar
erDiagram direction TB CAR:::someclass { string registrationNumber string make string model } PERSON:::someclass { string firstName string lastName int age } HOUSE:::someclass classDef someclass fill:#f96

Para declarar relações entre entidades, pode-se usar a seguinte sintaxe:

Código
                            
Copiar
Incorporar
erDiagram CAR { string registrationNumber string make string model } PERSON { string firstName string lastName int age } PERSON:::foo ||--|| CAR : owns PERSON o{--|| HOUSE:::bar : has classDef foo stroke:#f00 classDef bar stroke:#0f0 classDef foobar stroke:#00f

Assim como a instrução class, a sintaxe abreviada também pode aplicar várias classes de uma vez:

                            
Copiar
Incorporar
nodeId:::className1,className2

Classe padrão

Se uma classe for chamada default, ela será atribuída a todas as classes que não tenham uma definição de classe específica.

                            
Copiar
Incorporar
classDef default fill:pink,stroke:#333,stroke-width:4px;

Observação: estilos personalizados provenientes de style ou de outras instruções de classe têm prioridade e sobrescrevem o estilo padrão. (Por exemplo, a classe default define um fundo rosa para o nó, mas, se a classe blue for aplicada, ela dará a esse nó uma cor de fundo azul.)

Código
                            
Copiar
Incorporar
erDiagram CAR { string registrationNumber string make string model } PERSON { string firstName string lastName int age } PERSON:::foo ||--|| CAR : owns PERSON o{--|| HOUSE:::bar : has classDef default fill:pink,stroke-width:4px classDef foo stroke:#f90 classDef bar stroke:#ff0 classDef foobar stroke:#69f

Configuração

Layout

O layout do diagrama é tratado por render(); o layout padrão é o layout ELK, adequado para diagramas maiores e mais complexos.

Para usar o layout clássico Dagre, você pode defini-lo no config do YAML frontmatter

Código
                            
Copiar
Incorporar
--- config: layout: dagre ---

O conteúdo do código Mermaid é o seguinte:

Código
                            
Copiar
Incorporar
--- title: Order example config: layout: elk --- erDiagram CUSTOMER ||--o{ ORDER : places ORDER ||--|{ LINE-ITEM : contains CUSTOMER }|..|{ DELIVERY-ADDRESS : uses