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.
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.
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.
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) |
| 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í |
| Hodnota | 别名为 |
|---|---|
| to | Identifikační |
| optionally to | Neidentifikační |
Kopírovat
Vložení
erDiagram
CAR ||--o{ NAMED-DRIVER : allows
PERSON }o..o{ NAMED-DRIVER : is
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:
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.
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.
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.
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.
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í.
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:
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:
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í.)
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
Kopírovat
Vložení
---
config:
layout: dagre
---
Obsah kódu Mermaid je následující:
Kopírovat
Vložení
---
title: Order example
config:
layout: elk
---
erDiagram
CUSTOMER ||--o{ ORDER : places
ORDER ||--|{ LINE-ITEM : contains
CUSTOMER }|..|{ DELIVERY-ADDRESS : uses