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

ER diagramaSintaksė

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.

Kodas
                            
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ą.

Kodas
                            
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ą.

Kodas
                            
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)
Aliasas
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
Aliasas
Reikšmė 别名为
to Identifikuojantis
optionally to Neidentifikuojantis
Kodas
                            
Kopijuoti
Įterpti
erDiagram CAR ||--o{ NAMED-DRIVER : allows PERSON }o..o{ NAMED-DRIVER : is
Kodas
                            
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:

Kodas
                            
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.

Kodas
                            
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ų.

Kodas
                            
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šų.

Kodas
                            
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ę.

Kodas
                            
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ą.

Kodas
                            
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:

Kodas
                            
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ę:

Kodas
                            
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.)

Kodas
                            
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

Kodas
                            
Kopijuoti
Įterpti
--- config: layout: dagre ---

Mermaid kodo turinys toks:

Kodas
                            
Kopijuoti
Įterpti
--- title: Order example config: layout: elk --- erDiagram CUSTOMER ||--o{ ORDER : places ORDER ||--|{ LINE-ITEM : contains CUSTOMER }|..|{ DELIVERY-ADDRESS : uses