ER diagrama
Entity-ryšių diagrama (sutrumpintai ER diagrama) aprašo tarpusavyje susijusius dominančius dalykus tam tikroje žinių srityje. Pagrindinę ER diagramą sudaro entity tipai (naudojami dominantiems dalykams klasifikuoti) ir nurodomi ryšiai, galintys egzistuoti tarp entity (šių entity tipų egzempliorių).,Atkreipkite dėmesį, kad praktiškai dirbant su ER diagramomis „entity tipas“ beveik visada trumpinamas iki „entity“. Pavyzdžiui, „CUSTOMER entity tipas“ paprastai vadinamas tiesiog „CUSTOMER entity“. Ši praktika labai paplitusi, todėl nerekomenduojama naudoti kito varianto, tačiau techniškai entity yra abstraktus entity tipo egzempliorius, o ER diagrama rodo būtent šiuos abstrakčius egzempliorius ir jų ryšius. Štai kodėl entity visada įvardijami vienaskaitos daiktavardžiais.
Kopijuoti
Įterpti
---
title: Order example
---
erDiagram
CUSTOMER ||--o{ ORDER : places
ORDER ||--|{ LINE-ITEM : contains
CUSTOMER }|..|{ DELIVERY-ADDRESS : uses
Entity pavadinimai paprastai rašomi didžiosiomis raidėmis, nors visuotinai priimto standarto tam nėra ir Mermaid sintaksė to nereikalauja.
Ryšiai tarp entity vaizduojami linijomis su galiniais žymekliais, nurodančiais kardinalumą. Mermaid naudoja populiariausią varnėnko pėdos simbolį, kuris vaizdžiai parodo, kad su juo sujungtas entity gali turėti kelis egzempliorius.
ER diagramos gali būti naudojamos įvairiems tikslams: nuo abstrakčios loginės modelio, kuriame nėra jokių įgyvendinimo detalių, iki fizinio reliacinių duomenų bazių lentelių modelio. Savybių apibrėžimų įtraukimas į ER diagramą padeda suprasti entity paskirtį ir reikšmę; šie savybių apibrėžimai neturi būti išsamūs – paprastai pakanka nedidelės dalies savybių. Mermaid leidžia juos apibrėžti pagal jų tipą ir pavadinimą.
Kopijuoti
Įterpti
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
}
Įtraukdami savybes į ER diagramą, turite nuspręsti, ar įtraukti išorinius raktus kaip savybes; tai gali priklausyti nuo to, kiek norite pavaizduoti reliacinių lentelių struktūrą. Jei jūsų diagrama yra loginis modelis ir ja nesiekiama užsiminti apie reliacinį įgyvendinimą, tuomet šių savybių geriau neįtraukti, nes asociacijų ryšiai jau perteikia, kaip entity yra susiję. Pavyzdžiui, JSON duomenų struktūra gali įgyvendinti vieno-su-daugeliu ryšį naudodama masyvą be išorinio rakto savybių. Panašiai objektinio programavimo kalbos gali naudoti rodykles arba nuorodas į kolekcijas. Net ir tuose modeliuose, kuriais siekiama reliacinio įgyvendinimo, galima manyti, kad išorinio rakto savybių įtraukimas dubliuoja ryšių perteikiamą informaciją ir neprideda entity reikšmės.
Sintaksė
Entity ir ryšiai
ER diagramos Mermaid sintaksė suderinama su PlantUML ir praplečia ryšių žymėjimo funkcijas. Kiekvienas sakinys apima:
Kopijuoti
Įterpti
<first-entity> [<relationship> <second-entity> : <relationship-label>]
- first-entity yra pirmojo entity pavadinimas. Pavadinimas palaiko bet kokius Unicode simbolius, o apgaubtas dvigubomis kabutėmis gali turėti tarpų.
- relationship aprašo dviejų entity tarpusavio ryšį.
- second-entity yra kito entity pavadinimas.
- relationship-label aprašo ryšį iš pirmojo entity perspektyvos.
Pavyzdžiui:
Kopijuoti
Įterpti
PROPERTY ||--|{ ROOM : contains
Šį teiginį galima suprasti taip: vienas PROPERTY apima vieną ar daugiau ROOM, o vienas ROOM priklauso tik vienam PROPERTY. Čia esantis žymeklis pateikiamas iš pirmojo entity perspektyvos: vienas PROPERTY apima ROOM, bet vienas ROOM neapima PROPERTY. Iš antrojo entity perspektyvos lygiavertį žymeklį paprastai lengva nuspėti.
Privaloma tik first-entity dalis. Tai leidžia rodyti entity be ryšių, o tai labai naudinga iteratyviai kuriant diagramą. Jei nurodomos kitos sakinio dalys, tuomet visos dalys yra privalomos.
Unicode tekstas
Entity pavadinimai, ryšiai ir savybės palaiko unicode tekstą.
Kopijuoti
Įterpti
erDiagram
"This ❤ Unicode"
Ryšio sintaksė
Kiekvieno sakinio ryšio dalį galima suskirstyti į tris dalis:
- Pirmojo entity kardinalumas antrojo entity atžvilgiu
- Ar šis ryšys suteikia patronuojamajam entity tapatybę
- Antrojo entity kardinalumas pirmojo entity atžvilgiu
Kardinalumas – tai savybė, apibūdinanti elementų skaičių, su kuriuo kitas entity gali būti susietas su nagrinėjamu entity. Aukščiau pateiktame pavyzdyje vienas PROPERTY gali būti susietas su vienu ar daugiau ROOM egzempliorių, o vienas ROOM gali būti susietas tik su vienu PROPERTY. Kiekviename kardinalumo žymeklyje yra du simboliai: tolimiausias simbolis reiškia didžiausią reikšmę, o artimiausias – mažiausią. Toliau esančioje lentelėje apibendrinamos kardinalumo galimybės:
| Reikšmė (kairė) | Reikšmė (dešinė) | Reikšmė |
|---|---|---|
| |o | o| | nulis arba vienas |
| || | || | tiksliai vienas |
| }o | o{ | nulis ar daugiau (be viršutinės ribos) |
| }| | |{ | vienas ar daugiau (be viršutinės ribos) |
| Reikšmė (kairė) | Reikšmė (dešinė) | Reikšmė |
|---|---|---|
| one or zero | one or zero | nulis arba vienas |
| zero or one | zero or one | nulis arba vienas |
| one or more | one or more | vienas ar daugiau |
| one or many | one or many | vienas ar daugiau |
| many(1) | many(1) | vienas ar daugiau |
| 1+ | 1+ | vienas ar daugiau |
| zero or more | zero or more | nulis ar daugiau |
| zero or many | zero or many | nulis ar daugiau |
| many(0) | many(0) | nulis ar daugiau |
| 0+ | 0+ | nulis ar daugiau |
| only one | only one | tiksliai vienas |
| 1 | 1 | tiksliai vienas |
Tapatybės identifikavimas
Ryšiai gali būti identifikuojantys ir neidentifikuojantys, atvaizduojami atitinkamai ištisine arba brūkšnine linija. Tai svarbu, kai vienas iš entity negali egzistuoti savarankiškai be kito. Pavyzdžiui, įmonei, teikiančiai draudimą žmonėms, vairuojantiems automobilius, gali prireikti saugoti NAMED-DRIVER duomenis. Modeliuodami pirmiausia galime pastebėti, kad vieną CAR gali vairuoti daug PERSON, o vienas PERSON gali vairuoti daug CAR; abu gali egzistuoti vienas be kito, todėl tai neidentifikuojantis ryšys, kurį Mermaid galime nurodyti kaip: PERSON }|..|{ CAR : "driver". Atkreipkite dėmesį į du taškus ryšio viduryje – jie lemia brūkšninės linijos braižymą tarp dviejų entity. Tačiau kai šis daugelio-su-daugeliu ryšys išskaidomas į du vieno-su-daugeliu ryšius, pastebime, kad be PERSON ir CAR NAMED-DRIVER negali egzistuoti. Šie ryšiai tampa identifikuojančiais ir žymimi brūkšneliu, atitinkančiu ištisinę liniją:
| Reikšmė | Aliasas |
|---|---|
| -- | Identifikuojantis |
| .. | Neidentifikuojantis |
| Reikšmė | 别名为 |
|---|---|
| to | Identifikuojantis |
| optionally to | Neidentifikuojantis |
Kopijuoti
Įterpti
erDiagram
CAR ||--o{ NAMED-DRIVER : allows
PERSON }o..o{ NAMED-DRIVER : is
Kopijuoti
Įterpti
erDiagram
CAR ||--o{ NAMED-DRIVER : allows
PERSON }o--o{ NAMED-DRIVER : is
Savybė
Entity savybes galima apibrėžti nurodant entity pavadinimą ir po jo bloką su keliais type name; blokas apgaubiamas riestiniais skliaustais {}. Savybės rodomos entity lauke, pavyzdžiui:
Kopijuoti
Įterpti
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
}
type reikšmė turi prasidėti raidiniu simboliu ir gali turėti skaitmenis, brūkšnelius, pabraukimus, paprastus ir laužtinius skliaustus. name reikšmė laikosi panašaus formato kaip type, tačiau taip pat gali prasidėti žvaigždute – tai dar viena parinktis, nurodanti, kad savybė yra pirminis raktas. Be to, kitų apribojimų nėra, taip pat nėra numatyto galiojančių duomenų tipų rinkinio.
Entity aliass
Entity aliasui galima naudoti laužtinius skliaustus. Jei aliasas pateiktas, diagramoje bus rodomas aliasas, o ne entity pavadinimas; aliasui taikomos visos tos pačios taisyklės kaip ir entity pavadinimui.
Kopijuoti
Įterpti
erDiagram
p[Person] {
string firstName
string lastName
}
a["Customer Account"] {
string email
}
p ||--o| a : has
Savybių raktai ir komentarai
Savybės taip pat gali apibrėžti raktus arba komentarus. Raktas gali būti pirminis raktas (PK), išorinis raktas (FK) arba unikalus raktas (UK). Norėdami vienai savybei nurodyti kelis rakto apribojimus, atskirkite juos kableliais (pavyzdžiui, PK, FK). Komentaras apibrėžiamas dvigubomis kabutėmis savybės pabaigoje; komentare negali būti dvigubų kabučių simbolių.
Kopijuoti
Įterpti
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
Kryptis
Krypties sakinys deklaruoja diagramos kryptį.
TB deklaruoja diagramos kryptį iš viršaus į apačią, o BT gali ją pakeisti į iš apačios į viršų.
Kopijuoti
Įterpti
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 deklaruoja diagramos kryptį iš kairės į dešinę, o RL gali ją pakeisti į iš dešinės į kairę.
Kopijuoti
Įterpti
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
}
Mazgo stiliaus nustatymas
Mazgui galima pritaikyti konkretų stilių, pavyzdžiui, storesnį rėmelį arba kitokią fono spalvą.
Kopijuoti
Įterpti
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
Taip pat galima viename sakinyje priskirti stilių mazgų sąrašui:
Kopijuoti
Įterpti
style nodeId1,nodeId2 styleList
Klasė
Patogiau nei kiekvieną kartą apibrėžti stilių yra apibrėžti stiliaus klasę ir priskirti ją mazgams, kuriems reikia kitokios išvaizdos.
Klasės apibrėžimas parodytas toliau esančiame pavyzdyje:
Kopijuoti
Įterpti
classDef className fill:pink,stroke:#333,stroke-width:4px
Taip pat galima viename sakinyje apibrėžti kelias klases:
Kopijuoti
Įterpti
classDef firstClassName,secondClassName font-size:12pt
Klasės priskyrimo mazgui sintaksė:
Kopijuoti
Įterpti
class nodeId1 className
Taip pat galima viename sakinyje priskirti vieną klasę mazgų sąrašui:
Kopijuoti
Įterpti
class nodeId1,nodeId2 className
Taip pat galima vienu metu priskirti kelias klases:
Kopijuoti
Įterpti
class nodeId1,nodeId2 className1,className2
Paprastas būdas pridėti klasę – naudoti operatorių :::, kuris priskiria klasės pavadinimą mazgui, kaip parodyta žemiau:
Kopijuoti
Įterpti
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
Entity tarpusavio ryšiams deklaruoti galima naudoti šią sintaksę:
Kopijuoti
Įterpti
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
Panašiai kaip class sakinys, trumpoji sintaksė taip pat gali vienu metu pritaikyti kelias klases:
Kopijuoti
Įterpti
nodeId:::className1,className2
Numatytoji klasė
Jei klasė pavadinta default, ji bus priskirta visoms klasėms be konkretaus klasės apibrėžimo.
Kopijuoti
Įterpti
classDef default fill:pink,stroke:#333,stroke-width:4px;
Pastaba: tinkintas stilius, gaunamas iš stiliaus ar kitų klasių sakinių, turi pirmenybę ir pakeičia numatytąjį stilių. (Pavyzdžiui, default klasė nustato mazgui rožinį foną, tačiau pritaikius blue klasę mazgui bus suteikta mėlyna fono spalva.)
Kopijuoti
Įterpti
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
Konfigūracija
Išdėstymas
Diagramos išdėstymą tvarko render(); numatytasis išdėstymas yra ELK, tinkantis didesnėms ir sudėtingesnėms diagramoms.
Norėdami naudoti klasikinį Dagre išdėstymą, galite jį nustatyti YAML frontmatter konfigūracijos dalyje config
Kopijuoti
Įterpti
---
config:
layout: dagre
---
Mermaid kodo turinys toks:
Kopijuoti
Įterpti
---
title: Order example
config:
layout: elk
---
erDiagram
CUSTOMER ||--o{ ORDER : places
ORDER ||--|{ LINE-ITEM : contains
CUSTOMER }|..|{ DELIVERY-ADDRESS : uses