Register
Process Type
Graphical expression
Mind Type
Structured expression
Note Type
Efficient expression

ER diagramSyntaxe

ER diagram

Diagram entit a vztahů (zkráceně ER diagram) popisuje vzájemně související objekty zájmu v určité oblasti znalostí. Základní ER diagram se skládá z typů entit (pro klasifikaci objektů zájmu) a určuje vztahy, které mohou existovat mezi entitami (instancemi těchto typů entit),Upozorňujeme, že v praxi ER diagramů se „typ entity“ téměř vždy zkracuje na „entita“. Například „typ entity CUSTOMER“ se obvykle označuje přímo jako „entita CUSTOMER“. Tento postup je velmi rozšířený, a proto se jiné způsoby nedoporučují, ale technicky vzato je entita abstraktní instancí typu entity a ER diagram zobrazuje právě tyto abstraktní instance a vztahy mezi nimi. To je důvod, proč jsou entity vždy pojmenovávány podstatnými jmény v jednotném čísle.

Kód
                            
Kopírovat
Vložení
--- title: Order example --- erDiagram CUSTOMER ||--o{ ORDER : places ORDER ||--|{ LINE-ITEM : contains CUSTOMER }|..|{ DELIVERY-ADDRESS : uses

Názvy entit jsou obvykle psány velkými písmeny, ačkoli pro to neexistuje uznávaný standard a syntaxe Mermaid to ani nevyžaduje.

Vztahy mezi entitami jsou znázorněny čarami se značkami na koncích označujícími kardinalitu. Mermaid používá nejpopulárnější symbol vraní nohy, který intuitivně naznačuje, že připojená entita může mít více instancí.

ER diagramy lze použít pro různé účely, od abstraktního logického modelu neobsahujícího žádné implementační podrobnosti až po fyzický model tabulek relační databáze. Zahrnutí definic vlastností do ER diagramu pomáhá pochopit účel a význam entit; tyto definice vlastností nemusí být vyčerpávající, obvykle postačí malá část vlastností. Mermaid je umožňuje definovat pomocí jejich typu a názvu.

Kód
                            
Kopírovat
Vložení
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 }

Při zahrnutí vlastností do ER diagramu se musíte rozhodnout, zda zahrnete cizí klíče jako vlastnosti, což může záviset na tom, do jaké míry chcete znázornit strukturu relační tabulky. Pokud je váš diagram logickým modelem, který nemá naznačovat relační implementaci, je lepší tyto vlastnosti nezahrnovat, protože vztahy již vyjadřují, jak spolu entity souvisejí. Například datová struktura JSON může implementovat vztah jedna k mnoha pomocí pole bez vlastnosti cizího klíče. Podobně mohou objektově orientované programovací jazyky použít ukazatele nebo odkazy na kolekce. I u modelů určených pro relační implementaci lze mít za to, že zahrnutí vlastností cizích klíčů duplikuje informace sdělené vztahy a nepřidává entitě význam.

Syntaxe

Entity a vztahy

Syntaxe ER diagramu v Mermaid je kompatibilní s PlantUML a rozšiřuje funkce pro značení vztahů. Každý příkaz zahrnuje následující:

                            
Kopírovat
Vložení
<first-entity> [<relationship> <second-entity> : <relationship-label>]
  • first-entity je název první entity. Název podporuje libovolné znaky Unicode a pokud je uzavřen do dvojitých uvozovek, může obsahovat mezery.
  • relationship popisuje vzájemný vztah mezi dvěma entitami.
  • second-entity je název druhé entity.
  • relationship-label popisuje vztah z pohledu první entity.

Například:

                            
Kopírovat
Vložení
PROPERTY ||--|{ ROOM : contains

Toto prohlášení lze chápat takto: jedna nemovitost obsahuje jeden nebo více pokojů a jeden pokoj patří pouze jedné nemovitosti. Zde uvedený popisek je z pohledu první entity: jedna nemovitost obsahuje pokoj, ale pokoj neobsahuje nemovitost. Z pohledu druhé entity je ekvivalentní popisek obvykle snadné vyvodit.

Povinná je pouze část first-entity. To umožňuje zobrazit entity bez vztahů, což je velmi užitečné při iterativním sestavování diagramu. Pokud jsou zadány i další části příkazu, jsou všechny části povinné.

Text Unicode

Názvy entit, vztahy a vlastnosti podporují text unicode.

Kód
                            
Kopírovat
Vložení
erDiagram "This ❤ Unicode"

Syntaxe vztahů

Část vztahu každého příkazu lze rozdělit na tři dílčí části:

  • Kardinalita první entity vůči druhé entitě
  • Zda tento vztah uděluje dceřiné entitě identifikaci
  • Kardinalita druhé entity vůči první entitě

Kardinalita je vlastnost, která popisuje počet prvků, které lze s danou entitou asociovat u jiné entity. Ve výše uvedeném příkladu může jednomu PROPERTY odpovídat jeden nebo více instancí ROOM, zatímco jeden ROOM může odpovídat pouze jednomu PROPERTY. Každá značka kardinality má dva znaky, přičemž krajní znak představuje maximum a vnitřní znak minimum. Následující tabulka shrnuje možnosti kardinality:

Hodnota (vlevo) Hodnota (vpravo) Význam
|o o| Nula nebo jedna
|| || Právě jedna
}o o{ Nula nebo více (bez horního limitu)
}| |{ Jedna nebo více (bez horního limitu)
Alias
Hodnota (vlevo) Hodnota (vpravo) Význam
one or zero one or zero Nula nebo jedna
zero or one zero or one Nula nebo jedna
one or more one or more Jedna nebo více
one or many one or many Jedna nebo více
many(1) many(1) Jedna nebo více
1+ 1+ Jedna nebo více
zero or more zero or more Nula nebo více
zero or many zero or many Nula nebo více
many(0) many(0) Nula nebo více
0+ 0+ Nula nebo více
only one only one Právě jedna
1 1 Právě jedna

Identifikace

Vztahy lze rozdělit na identifikační a neidentifikační, které se vykreslují plnou nebo přerušovanou čarou. To je důležité, když jedna z entit nemůže existovat nezávisle bez druhé. Například společnost poskytující pojištění pro řízení automobilů může potřebovat ukládat data o NAMED-DRIVER. Při modelování můžeme nejprve pozorovat, že jeden CAR může řídit mnoho PERSON a jeden PERSON může řídit mnoho CAR, oba mohou existovat bez toho druhého, jde tedy o neidentifikační vztah, který můžeme v Mermaid zadat jako: PERSON }|..|{ CAR : "driver". Všimněte si dvou teček uprostřed vztahu, které způsobí vykreslení přerušované čáry mezi oběma entitami. Když se však tento vztah mnoha k mnoha rozloží na dva vztahy jedna k mnoha, pozorujeme, že bez PERSON a CAR nemůže NAMED-DRIVER existovat. Tyto vztahy se stávají identifikačními a budou znázorněny pomlčkami, což odpovídá plné čáře:

Hodnota Alias
-- Identifikační
.. Neidentifikační
Alias
Hodnota 别名为
to Identifikační
optionally to Neidentifikační
Kód
                            
Kopírovat
Vložení
erDiagram CAR ||--o{ NAMED-DRIVER : allows PERSON }o..o{ NAMED-DRIVER : is
Kód
                            
Kopírovat
Vložení
erDiagram CAR ||--o{ NAMED-DRIVER : allows PERSON }o--o{ NAMED-DRIVER : is

Vlastnosti

Vlastnosti entity lze definovat zadáním názvu entity následovaného blokem obsahujícím několik type name, přičemž blok je uzavřen ve složených závorkách {}. Vlastnosti se zobrazují v rámečku entity, například:

Kód
                            
Kopírovat
Vložení
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 }

Hodnota type musí začínat písmenem a může obsahovat číslice, pomlčky, podtržítka, kulaté závorky a hranaté závorky. Hodnota name se řídí podobným formátem jako type, ale může také začínat hvězdičkou jako další možnost označující, že vlastnost je primární klíč. Kromě toho neexistují žádná další omezení ani implicitní sada platných datových typů.

Alias entity

Entitě lze přidat alias pomocí hranatých závorek. Pokud je alias zadán, v diagramu se zobrazí alias místo názvu entity; alias se řídí stejnými pravidly jako název entity.

Kód
                            
Kopírovat
Vložení
erDiagram p[Person] { string firstName string lastName } a["Customer Account"] { string email } p ||--o| a : has

Klíče vlastností a komentáře

Vlastnosti mohou také definovat klíče nebo komentáře. Klíč může být primární (PK), cizí (FK) nebo jedinečný (UK). Chcete-li u jedné vlastnosti zadat více omezení klíče, oddělte je čárkou (například PK, FK). Komentář se definuje pomocí dvojitých uvozovek na konci vlastnosti; komentář nesmí obsahovat znak dvojité uvozovky.

Kód
                            
Kopírovat
Vložení
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

Směr

Příkaz směru deklaruje směr diagramu.

TB deklaruje směr diagramu shora dolů, BT jej může obrátit na zdola nahoru.

Kód
                            
Kopírovat
Vložení
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 deklaruje směr diagramu zleva doprava, RL jej může obrátit na zprava doleva.

Kód
                            
Kopírovat
Vložení
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 }

Nastavení stylu uzlu

Na uzel lze použít konkrétní styl, například tlustší ohraničení nebo jinou barvu pozadí.

Kód
                            
Kopírovat
Vložení
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

Styl lze v jednom příkazu připojit také k seznamu uzlů:

                            
Kopírovat
Vložení
style nodeId1,nodeId2 styleList

Třída

Pohodlnější než definovat styl pokaždé je definovat třídu stylu a připojit tuto třídu k uzlům, které potřebují odlišný vzhled.

Definice třídy je uvedena v následujícím příkladu:

                            
Kopírovat
Vložení
classDef className fill:pink,stroke:#333,stroke-width:4px

V jednom příkazu lze definovat také více tříd:

                            
Kopírovat
Vložení
classDef firstClassName,secondClassName font-size:12pt

Syntaxe pro připojení třídy k uzlu je následující:

                            
Kopírovat
Vložení
class nodeId1 className

V jednom příkazu lze také připojit třídu k seznamu uzlů:

                            
Kopírovat
Vložení
class nodeId1,nodeId2 className

Lze připojit také více tříd najednou:

                            
Kopírovat
Vložení
class nodeId1,nodeId2 className1,className2

Jednodušší způsob, jak přidat třídu, je použít operátor :::, který připojí název třídy k uzlu, jak je znázorněno níže:

Kód
                            
Kopírovat
Vložení
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

Vztahy mezi entitami lze deklarovat pomocí následující syntaxe:

Kód
                            
Kopírovat
Vložení
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

Podobně jako příkaz class může i zkrácená syntaxe použít více tříd najednou:

                            
Kopírovat
Vložení
nodeId:::className1,className2

Výchozí třída

Pokud je některá třída pojmenována default, bude přiřazena všem třídám bez specifické definice třídy.

                            
Kopírovat
Vložení
classDef default fill:pink,stroke:#333,stroke-width:4px;

Poznámka: vlastní styly ze stylu nebo jiných příkazů class mají přednost a přepíší výchozí styl. (Například třída default nastaví uzlům růžové pozadí, ale pokud se použije třída blue, poskytne uzlu modrou barvu pozadí.)

Kód
                            
Kopírovat
Vložení
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

Konfigurace

Rozvržení

Rozvržení diagramu zpracovává render() a výchozím rozvržením je rozvržení ELK, které je vhodné pro větší a složitější diagramy.

Chcete-li místo toho použít klasické rozvržení Dagre, můžete je nastavit v config v YAML frontmatter

Kód
                            
Kopírovat
Vložení
--- config: layout: dagre ---

Obsah kódu Mermaid je následující:

Kód
                            
Kopírovat
Vložení
--- title: Order example config: layout: elk --- erDiagram CUSTOMER ||--o{ ORDER : places ORDER ||--|{ LINE-ITEM : contains CUSTOMER }|..|{ DELIVERY-ADDRESS : uses