ER-diagram
Ett entitetsrelationsdiagram (förkortat ER-diagram) beskriver sammanhängande intresseobjekt inom ett specifikt kunskapsområde. Ett grundläggande ER-diagram består av entitetstyper (som klassificerar intresseobjekt) och anger de relationer som kan finnas mellan entiteter (instanser av dessa entitetstyper),Observera att i praktisk användning av ER-diagram förkortas nästan alltid 'entitetstyp' till 'entitet'. Till exempel kallas 'CUSTOMER entitetstyp' vanligtvis helt enkelt 'CUSTOMER entitet'. Detta är mycket vanligt och andra sätt rekommenderas inte, men tekniskt sett är en entitet en abstrakt instans av en entitetstyp, och det är just dessa abstrakta instanser och deras relationer som ER-diagram visar. Det är därför entiteter alltid namnges med singulara substantiv.
Kopiera
Bädda in
---
title: Order example
---
erDiagram
CUSTOMER ||--o{ ORDER : places
ORDER ||--|{ LINE-ITEM : contains
CUSTOMER }|..|{ DELIVERY-ADDRESS : uses
Entitetsnamn skrivs vanligtvis med versaler, även om det inte finns någon erkänd standard för detta och Mermaid-syntaxen inte heller kräver det.
Relationer mellan entiteter representeras av linjer med ändmarkeringar som anger kardinalitet. Mermaid använder den mest populära kråkklo-symbolen; kråkkloen visar intuitivt att entiteten den ansluter till kan ha flera instanser.
ER-diagram kan användas för olika syften, från abstrakta logiska modeller utan några implementationsdetaljer till fysiska modeller av relationsdatabastabeller. Att inkludera attributdefinitioner i ett ER-diagram hjälper till att förstå entitetens syfte och innebörd; dessa attributdefinitioner behöver inte vara uttömmande, vanligtvis räcker en liten delmängd av attribut. Mermaid tillåter att definiera dem med deras typ och namn.
Kopiera
Bädda in
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
}
När du inkluderar attribut i ett ER-diagram måste du bestämma om du ska inkludera främmande nycklar som attribut, vilket kan bero på i vilken utsträckning du vill representera relationstabellens struktur. Om ditt diagram är en logisk modell och inte är avsett att antyda en relationsimplementation, är det bättre att inte inkludera dessa attribut, eftersom associationsrelationen redan förmedlar hur entiteterna är kopplade. Till exempel kan en JSON-datastruktur implementera en ett-till-många-relation med en array utan främmande nyckelattribut. På liknande sätt kan objektorienterade programmeringsspråk använda pekare eller referenser till samlingar. Även för modeller som syftar till relationsimplementation kan man anse att inkludering av främmande nyckelattribut duplicerar den information som relationen visar och inte tillför entiteten någon mening.
Syntax
Entiteter och relationer
Mermaid-syntaxen för ER-diagram är kompatibel med PlantUML och utökar funktionerna för att märka relationer. Varje sats innehåller följande:
Kopiera
Bädda in
<first-entity> [<relationship> <second-entity> : <relationship-label>]
- first-entity är namnet på den första entiteten. Namnet stöder alla Unicode-tecken och kan innehålla mellanslag om det omges av dubbla citattecken.
- relationship beskriver den inbördes relationen mellan två entiteter.
- second-entity är namnet på en annan entitet.
- relationship-label beskriver relationen från den första entitetens perspektiv.
Till exempel:
Kopiera
Bädda in
PROPERTY ||--|{ ROOM : contains
Denna deklaration kan förstås som: en fastighet innehåller ett eller flera rum, och ett rum tillhör endast en fastighet. Etiketten här ses från den första entitetens perspektiv: en fastighet innehåller ett rum, men ett rum innehåller inte en fastighet. Från den andra entitetens perspektiv är den motsvarande etiketten vanligtvis lätt att härleda.
Endast first-entity -delen är obligatorisk. Detta gör det möjligt att visa entiteter utan relationer, vilket är mycket användbart när diagram byggs iterativt. Om andra delar av satsen anges är alla delar obligatoriska.
Unicode-text
Entitetsnamn, relationer och attribut stöder alla unicode-text.
Kopiera
Bädda in
erDiagram
"This ❤ Unicode"
Relationssyntax
Relationsdelen av varje sats kan delas upp i tre delar:
- Den första entitetens kardinalitet i förhållande till den andra entiteten
- Huruvida relationen ger underentiteten identifikation
- Den andra entitetens kardinalitet i förhållande till den första entiteten
Kardinalitet är en egenskap som beskriver antalet element som en annan entitet kan associeras med den aktuella entiteten. I exemplet ovan kan en PROPERTY associeras med en eller flera ROOM-instanser, medan en ROOM endast kan associeras med en PROPERTY. Varje kardinalitetsmarkör har två tecken, där det yttersta tecknet representerar maxvärdet och det innersta tecknet representerar minvärdet. Tabellen nedan sammanfattar möjliga kardinaliteter:
| Värde (vänster) | Värde (höger) | Betydelse |
|---|---|---|
| |o | o| | Noll eller ett |
| || | || | Exakt ett |
| }o | o{ | Noll eller flera (ingen övre gräns) |
| }| | |{ | Ett eller flera (ingen övre gräns) |
| Värde (vänster) | Värde (höger) | Betydelse |
|---|---|---|
| one or zero | one or zero | Noll eller ett |
| zero or one | zero or one | Noll eller ett |
| one or more | one or more | Ett eller flera |
| one or many | one or many | Ett eller flera |
| many(1) | many(1) | Ett eller flera |
| 1+ | 1+ | Ett eller flera |
| zero or more | zero or more | Noll eller flera |
| zero or many | zero or many | Noll eller flera |
| many(0) | many(0) | Noll eller flera |
| 0+ | 0+ | Noll eller flera |
| only one | only one | Exakt ett |
| 1 | 1 | Exakt ett |
Identifikation
Relationer kan delas in i identifierande och icke-identifierande, vilka renderas med heldragen respektive streckad linje. Detta är viktigt när en av entiteterna inte kan existera självständigt utan den andra. Till exempel kan ett företag som tillhandahåller försäkring för personer som kör bilar behöva lagra data om NAMED-DRIVER. Vid modellering kan vi först observera att en CAR kan köras av många PERSON, och en PERSON kan köra många CAR , båda kan existera utan den andra, så detta är en icke-identifierande relation, som vi i Mermaid kan ange som: PERSON }|..|{ CAR : "driver". Observera de två punkterna i mitten av relationen, vilket leder till att en streckad linje ritas mellan de två entiteterna. Men när denna många-till-många-relation löses upp i två en-till-många-relationer observerar vi att NAMED-DRIVER inte kan existera utan PERSON och CAR. Dessa relationer blir identifierande relationer och representeras med ett bindestreck, vilket motsvarar en heldragen linje:
| Värde | Alias |
|---|---|
| -- | Identifierande |
| .. | Icke-identifierande |
| Värde | 别名为 |
|---|---|
| to | Identifierande |
| optionally to | Icke-identifierande |
Kopiera
Bädda in
erDiagram
CAR ||--o{ NAMED-DRIVER : allows
PERSON }o..o{ NAMED-DRIVER : is
Kopiera
Bädda in
erDiagram
CAR ||--o{ NAMED-DRIVER : allows
PERSON }o--o{ NAMED-DRIVER : is
Attribut
Du kan definiera attribut för en entitet genom att ange entitetsnamnet följt av ett block som innehåller flera type name, där blocket omges av klammerparenteser {} . Attributen visas inuti entitetsrutan, till exempel:
Kopiera
Bädda in
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 -värdet måste börja med ett bokstavstecken och kan innehålla siffror, bindestreck, understreck, parenteser och hakparenteser. name -värdet följer ett format liknande type men kan också börja med en asterisk som ett annat alternativ för att ange att attributet är en primärnyckel. Utöver detta finns inga andra begränsningar och ingen underförstådd uppsättning giltiga datatyper.
Entitetsalias
Du kan använda hakparenteser för att lägga till ett alias för en entitet. Om ett alias anges visas aliaset istället för entitetsnamnet i diagrammet, och aliaset följer samma regler som entitetsnamn.
Kopiera
Bädda in
erDiagram
p[Person] {
string firstName
string lastName
}
a["Customer Account"] {
string email
}
p ||--o| a : has
Attributnycklar och kommentarer
Attribut kan också definiera nycklar eller kommentarer. Nycklar kan vara primärnyckel (PK), främmande nyckel (FK) eller unik nyckel (UK). För att ange flera nyckelbegränsningar på ett enskilt attribut, separera dem med kommatecken (till exempel PK, FK). Kommentarer definieras med dubbla citattecken i slutet av attributet, och kommentaren får inte innehålla dubbla citattecken.
Kopiera
Bädda in
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
Riktning
Riktningssatsen deklarerar diagrammets riktning.
TB deklarerar att diagrammets riktning är uppifrån och ned; BT kan vända den till nedifrån och upp.
Kopiera
Bädda in
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 deklarerar att diagrammets riktning är vänster till höger; RL kan vända den till höger till vänster.
Kopiera
Bädda in
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
}
Ange nodstil
Du kan tillämpa en specifik stil på en nod, till exempel tjockare kant eller en annan bakgrundsfärg.
Kopiera
Bädda in
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
Du kan också koppla stil till en lista av noder i en och samma sats:
Kopiera
Bädda in
style nodeId1,nodeId2 styleList
Klass
Istället för att definiera stilen varje gång är det bekvämare att definiera en stilklass och koppla denna klass till de noder som behöver ett annat utseende.
En klassdefinition visas i följande exempel:
Kopiera
Bädda in
classDef className fill:pink,stroke:#333,stroke-width:4px
Du kan också definiera flera klasser i en och samma sats:
Kopiera
Bädda in
classDef firstClassName,secondClassName font-size:12pt
Syntaxen för att koppla en klass till en nod är följande:
Kopiera
Bädda in
class nodeId1 className
Du kan också koppla en klass till en lista av noder i en och samma sats:
Kopiera
Bädda in
class nodeId1,nodeId2 className
Du kan också koppla flera klasser samtidigt:
Kopiera
Bädda in
class nodeId1,nodeId2 className1,className2
Det enkla sättet att lägga till en klass är att använda operatorn ::: för att koppla klassnamnet till noden, som visas nedan:
Kopiera
Bädda in
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
För att deklarera relationer mellan entiteter kan följande syntax användas:
Kopiera
Bädda in
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
Liksom class -satsen kan kortforms-syntaxen också tillämpa flera klasser samtidigt:
Kopiera
Bädda in
nodeId:::className1,className2
Standardklass
Om en klass heter default tilldelas den till alla klasser som inte har en specifik klassdefinition.
Kopiera
Bädda in
classDef default fill:pink,stroke:#333,stroke-width:4px;
Obs: anpassade stilar från style eller andra klass-satser har prioritet och åsidosätter standardstilen. (Till exempel ger klassen default en rosa bakgrund till noder, men om klassen blue tillämpas får noden en blå bakgrundsfärg.)
Kopiera
Bädda in
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
Konfiguration
Layout
Diagrammets layout hanteras av render() , standardlayouten är ELK-layout, lämplig för större och mer komplexa diagram.
För att använda den klassiska Dagre-layouten istället kan du ställa in den i config i YAML frontmatter
Kopiera
Bädda in
---
config:
layout: dagre
---
Mermaid-kodens innehåll är följande:
Kopiera
Bädda in
---
title: Order example
config:
layout: elk
---
erDiagram
CUSTOMER ||--o{ ORDER : places
ORDER ||--|{ LINE-ITEM : contains
CUSTOMER }|..|{ DELIVERY-ADDRESS : uses