ER-kaavio
Entiteetti-relaatiokaavio (lyhennettynä ER-kaavio) kuvaa tietyn tietoalueen toisiinsa liittyviä kiinnostavia asioita. Perustason ER-kaavio koostuu entiteettityypeistä (kiinnostavien asioiden luokitteluun), ja siinä määritellään suhteet, joita entiteettien (näiden entiteettityyppien esiintymien) välillä voi olla,Huomaa, että ER-kaavioiden käytännössä 'entiteettityyppiä' lyhennetään lähes aina 'entiteetiksi'. Esimerkiksi 'CUSTOMER-entiteettityyppi' kutsutaan yleensä suoraan 'CUSTOMER-entiteetiksi'. Tämä käytäntö on hyvin yleinen, joten muita tapoja ei suositella, mutta teknisesti entiteetti on entiteettityypin abstrakti esiintymä, ja ER-kaavio näyttää juuri nämä abstraktit esiintymät ja niiden väliset suhteet. Siksi entiteetit nimetään aina yksikössä.
Kopioi
Upotus
---
title: Order example
---
erDiagram
CUSTOMER ||--o{ ORDER : places
ORDER ||--|{ LINE-ITEM : contains
CUSTOMER }|..|{ DELIVERY-ADDRESS : uses
Entiteettien nimet kirjoitetaan yleensä isoilla kirjaimilla, vaikka tälle ei ole yleisesti hyväksyttyä standardia eikä Mermaid-syntaksi sitä vaadi.
Entiteettien väliset suhteet esitetään viivoilla, joissa on kardinaliteettia ilmaisevat päätepistemerkinnät. Mermaid käyttää suosituinta varpaankynsisymbolia; varpaankynsi esittää intuitiivisesti, että siihen liittyvällä entiteetillä voi olla useita esiintymiä.
ER-kaaviota voidaan käyttää moniin tarkoituksiin, abstraktista loogisesta mallista, joka ei sisällä lainkaan toteutustietoja, relaatiotietokantataulujen fyysiseen malliin. Ominaisuuksien sisällyttäminen ER-kaavioon auttaa ymmärtämään entiteetin käyttötarkoitusta ja merkitystä; näiden ominaisuuksien ei tarvitse olla tyhjentäviä, ja usein pieni osa ominaisuuksista riittää. Mermaid sallii niiden määrittämisen tyypin ja nimen perusteella.
Kopioi
Upotus
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
}
Kun sisällytät ominaisuuksia ER-kaavioon, sinun on päätettävä, sisällytätkö vieraan avaimen ominaisuutena; tämä voi riippua siitä, missä määrin haluat esittää relaatiotaulukon rakenteen. Jos kaaviosi on looginen malli, jonka ei ole tarkoitus vihjata relaatiototeutuksesta, nämä ominaisuudet kannattaa jättää pois, koska assosiaatiosuhde välittää jo sen, miten entiteetit liittyvät toisiinsa. Esimerkiksi JSON-tietorakenne voi toteuttaa yksi-moneen-suhteen taulukolla ilman vieraan avaimen ominaisuutta. Vastaavasti oliopohjainen ohjelmointikieli voi käyttää osoittimia tai viittauksia kokoelmaan. Jopa niiden mallien kohdalla, jotka on tarkoitettu relaatiototeutukseen, voidaan katsoa, että vieraan avaimen ominaisuuden sisällyttäminen toistaisi suhteen välittämän tiedon eikä lisäisi entiteetille merkitystä.
Syntaksi
Entiteetit ja suhteet
ER-kaavion Mermaid-syntaksi on yhteensopiva PlantUML:n kanssa, ja se laajentaa suhteiden merkitsemiseen käytettyjä toimintoja. Jokainen lause sisältää seuraavat:
Kopioi
Upotus
<first-entity> [<relationship> <second-entity> : <relationship-label>]
- first-entity on ensimmäisen entiteetin nimi. Nimi tukee mitä tahansa Unicode-merkkiä, ja se voi sisältää välilyöntejä, jos se suljetaan lainausmerkkeihin.
- relationship kuvaa kahden entiteetin välistä keskinäistä suhdetta.
- second-entity on toisen entiteetin nimi.
- relationship-label kuvaa suhdetta ensimmäisen entiteetin näkökulmasta.
Esimerkiksi:
Kopioi
Upotus
PROPERTY ||--|{ ROOM : contains
Tämä määrittely voidaan tulkita seuraavasti: yksi ominaisuus sisältää yhden tai useamman huoneen, ja yksi huone kuuluu vain yhteen ominaisuuteen. Tässä merkintä on ensimmäisen entiteetin näkökulmasta: yksi ominaisuus sisältää huoneen, mutta huone ei sisällä ominaisuutta. Toisen entiteetin näkökulmasta vastaava merkintä on yleensä helppo päätellä.
Vain first-entity-osa on pakollinen. Tämä mahdollistaa entiteettien näyttämisen ilman suhteita, mikä on erittäin hyödyllistä kaaviota iteratiivisesti rakennettaessa. Jos lauseen muut osat on määritetty, kaikki osat ovat pakollisia.
Unicode-teksti
Entiteettien nimet, suhteet ja ominaisuudet tukevat kaikki unicode-tekstiä.
Kopioi
Upotus
erDiagram
"This ❤ Unicode"
Suhteen syntaksi
Kunkin lauseen suhdeosa voidaan jakaa kolmeen alaosaan:
- Ensimmäisen entiteetin kardinaliteetti suhteessa toiseen entiteettiin
- Antaako suhde lapsientiteetille identiteetin
- Toisen entiteetin kardinaliteetti suhteessa ensimmäiseen entiteettiin
Kardinaliteetti on ominaisuus, joka kuvaa, kuinka monta elementtiä toinen entiteetti voi liittää kyseiseen entiteettiin. Yllä olevassa esimerkissä yksi PROPERTY voi liittää yhden tai useamman ROOM-esiintymän, kun taas yksi ROOM voi liittää vain yhden PROPERTY:n. Jokaisessa kardinaliteettimerkinnässä on kaksi merkkiä: uloin merkki edustaa maksimia ja sisin merkki minimiä. Seuraava taulukko kokoaa kardinaliteetin mahdollisuudet:
| Arvo (vasen) | Arvo (oikea) | Merkitys |
|---|---|---|
| |o | o| | Nolla tai yksi |
| || | || | Täsmälleen yksi |
| }o | o{ | Nolla tai useampi (ei ylärajaa) |
| }| | |{ | Yksi tai useampi (ei ylärajaa) |
| Arvo (vasen) | Arvo (oikea) | Merkitys |
|---|---|---|
| one or zero | one or zero | Nolla tai yksi |
| zero or one | zero or one | Nolla tai yksi |
| one or more | one or more | Yksi tai useampi |
| one or many | one or many | Yksi tai useampi |
| many(1) | many(1) | Yksi tai useampi |
| 1+ | 1+ | Yksi tai useampi |
| zero or more | zero or more | Nolla tai useampi |
| zero or many | zero or many | Nolla tai useampi |
| many(0) | many(0) | Nolla tai useampi |
| 0+ | 0+ | Nolla tai useampi |
| only one | only one | Täsmälleen yksi |
| 1 | 1 | Täsmälleen yksi |
Identiteetin tunnistaminen
Suhteet voidaan jakaa tunnistaviin ja ei-tunnistaviin, ja ne renderöidään yhtenäisellä viivalla tai katkoviivalla. Tämä on tärkeää, kun yksi entiteetti ei voi olla olemassa itsenäisesti ilman toista. Esimerkiksi yritys, joka tarjoaa vakuutuksia ihmisten autojen ajamiseen, saattaa tarvita NAMED-DRIVER-tietojen tallentamista. Mallintamisen yhteydessä voimme ensin havaita, että yhtä CAR-autoa voidaan ajaa usealla PERSON-henkilöllä ja yksi PERSON voi ajaa montaa CAR-autoa; molemmat voivat olla olemassa ilman toisiaan, joten tämä on ei-identifioiva suhde, jonka voimme määrittää Mermaidissa muodossa: PERSON }|..|{ CAR : "driver". Huomioi suhteen keskellä olevat kaksi pistettä, mikä johtaa katkoviivan piirtämiseen entiteettien väliin. Kun tämä monesta-moneen-suhde kuitenkin puretaan kahdeksi yhdestä-moneen-suhteeksi, havaitsemme, että NAMED-DRIVER ei voi olla olemassa ilman PERSON-henkilöä ja CAR-autoa. Näistä suhteista tulee identifioivia suhteita, jotka merkitään yhdysviivalla, mikä vastaa yhtenäistä viivaa:
| Arvo | Alias |
|---|---|
| -- | Tunnistava |
| .. | Ei-tunnistava |
| Arvo | 别名为 |
|---|---|
| to | Tunnistava |
| optionally to | Ei-tunnistava |
Kopioi
Upotus
erDiagram
CAR ||--o{ NAMED-DRIVER : allows
PERSON }o..o{ NAMED-DRIVER : is
Kopioi
Upotus
erDiagram
CAR ||--o{ NAMED-DRIVER : allows
PERSON }o--o{ NAMED-DRIVER : is
Ominaisuus
Entiteetille voidaan määrittää ominaisuuksia määrittämällä entiteetin nimi ja sen jälkeen lohko, joka sisältää useita type name -määrittelyjä ja jonka ympärillä on aaltosulut {}. Ominaisuudet näytetään entiteettilaatikon sisällä, esimerkiksi:
Kopioi
Upotus
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-arvon on alettava aakkosmerkillä, ja se voi sisältää numeroita, yhdysviivoja, alaviivoja, sulkeita ja hakasulkeita. name-arvo noudattaa samankaltaista muotoa kuin type, mutta se voi myös alkaa tähdellä, mikä on toinen vaihtoehto osoittaa, että ominaisuus on pääavain. Tämän lisäksi ei ole muita rajoituksia eikä implisiittistä kelvollisten tietotyyppien joukkoa.
Entiteetin alias
Entiteetille voidaan lisätä alias hakasulkeilla. Jos alias on annettu, kaaviossa näytetään entiteetin nimen sijaan alias, ja alias noudattaa kaikkia samoja sääntöjä kuin entiteetin nimi.
Kopioi
Upotus
erDiagram
p[Person] {
string firstName
string lastName
}
a["Customer Account"] {
string email
}
p ||--o| a : has
Ominaisuuden avaimet ja kommentit
Ominaisuuksille voidaan määrittää myös avaimia tai kommentteja. Avain voi olla pääavain (PK), vierasavain (FK) tai yksilöllinen avain (UK). Useiden avainrajoitusten määrittämiseksi yksittäiselle ominaisuudelle erota ne pilkulla (esimerkiksi PK, FK). Kommentti määritellään ominaisuuden lopussa olevilla lainausmerkeillä, eikä kommentti voi sisältää lainausmerkkejä.
Kopioi
Upotus
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
Suunta
Suuntalause määrittelee kaavion suunnan.
TB määrittelee kaavion suunnaksi ylhäältä alas; BT voi kääntää sen alhaalta ylös.
Kopioi
Upotus
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 määrittelee kaavion suunnaksi vasemmalta oikealle; RL voi kääntää sen oikealta vasemmalle.
Kopioi
Upotus
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
}
Aseta solmun tyyli
Solmuun voidaan soveltaa tiettyä tyyliä, kuten paksumpaa reunusta tai erilaista taustaväriä.
Kopioi
Upotus
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
Voit myös liittää tyylin solmuluetteloon yhdessä lauseessa:
Kopioi
Upotus
style nodeId1,nodeId2 styleList
Luokka
Kätevämpää kuin tyylin määrittäminen joka kerta on määrittää tyyliluokka ja liittää se solmuihin, jotka tarvitsevat erilaisen ulkoasun.
Luokan määrittely on seuraavan esimerkin mukainen:
Kopioi
Upotus
classDef className fill:pink,stroke:#333,stroke-width:4px
Useita luokkia voidaan myös määrittää yhdessä lauseessa:
Kopioi
Upotus
classDef firstClassName,secondClassName font-size:12pt
Luokan liittämisen solmuun syntaksi on seuraava:
Kopioi
Upotus
class nodeId1 className
Voit myös liittää luokan solmuluetteloon yhdessä lauseessa:
Kopioi
Upotus
class nodeId1,nodeId2 className
Voit myös liittää useita luokkia samanaikaisesti:
Kopioi
Upotus
class nodeId1,nodeId2 className1,className2
Helppo tapa lisätä luokka on liittää luokan nimi solmuun :::-operaattorilla seuraavasti:
Kopioi
Upotus
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
Entiteettien välisten suhteiden määrittelyyn voidaan käyttää seuraavaa syntaksia:
Kopioi
Upotus
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
Samoin kuin class-lause, pikasyntaksi voi myös soveltaa useita luokkia kerralla:
Kopioi
Upotus
nodeId:::className1,className2
Oletusluokka
Jos luokan nimi on default, se annetaan kaikille luokille, joilla ei ole tiettyä luokkamäärittelyä.
Kopioi
Upotus
classDef default fill:pink,stroke:#333,stroke-width:4px;
Huomautus: mukautetut tyylit style- tai muista class-lauseista ovat ensisijaisia ja korvaavat oletustyylin. (Esimerkiksi default-luokka asettaa solmulle vaaleanpunaisen taustan, mutta jos blue-luokkaa sovelletaan, solmu saa sinisen taustavärin.)
Kopioi
Upotus
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
Kokoonpano
Asettelu
Kaavion asettelun hoitaa render(), ja oletusasettelu on ELK-asettelu, joka sopii suurempiin ja monimutkaisempiin kaavioihin.
Voit siirtyä klassiseen Dagre-asetteluun asettamalla sen YAML-frontmatterin config-osiossa
Kopioi
Upotus
---
config:
layout: dagre
---
Mermaid-koodin sisältö on seuraava:
Kopioi
Upotus
---
title: Order example
config:
layout: elk
---
erDiagram
CUSTOMER ||--o{ ORDER : places
ORDER ||--|{ LINE-ITEM : contains
CUSTOMER }|..|{ DELIVERY-ADDRESS : uses