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

ER-diagramSyntax

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.

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

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

Kod
                            
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)
Alias
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
Alias
Värde 别名为
to Identifierande
optionally to Icke-identifierande
Kod
                            
Kopiera
Bädda in
erDiagram CAR ||--o{ NAMED-DRIVER : allows PERSON }o..o{ NAMED-DRIVER : is
Kod
                            
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:

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

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

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

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

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

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

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

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

Kod
                            
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

Kod
                            
Kopiera
Bädda in
--- config: layout: dagre ---

Mermaid-kodens innehåll är följande:

Kod
                            
Kopiera
Bädda in
--- title: Order example config: layout: elk --- erDiagram CUSTOMER ||--o{ ORDER : places ORDER ||--|{ LINE-ITEM : contains CUSTOMER }|..|{ DELIVERY-ADDRESS : uses