ER-Diagramm
Ein Entity-Relationship-Diagramm (kurz ER-Diagramm) beschreibt die miteinander verbundenen Dinge von Interesse in einem bestimmten Wissensbereich. Ein grundlegendes ER-Diagramm besteht aus Entitätstypen (zur Klassifizierung der Dinge von Interesse) und gibt die Beziehungen an, die zwischen Entitäten (Instanzen dieser Entitätstypen) bestehen können,Beachte, dass in der praktischen Arbeit mit ER-Diagrammen der 'Entitätstyp' fast immer einfach als 'Entität' bezeichnet wird. Zum Beispiel wird 'der Entitätstyp CUSTOMER' üblicherweise direkt als 'die Entität CUSTOMER' bezeichnet. Diese Praxis ist sehr verbreitet, weshalb andere Formulierungen nicht empfohlen werden; technisch gesehen ist eine Entität jedoch eine abstrakte Instanz eines Entitätstyps, und ER-Diagramme zeigen genau diese abstrakten Instanzen und ihre Beziehungen. Das ist der Grund, warum Entitäten immer mit einem Substantiv im Singular benannt werden.
Kopieren
Einbetten
---
title: Order example
---
erDiagram
CUSTOMER ||--o{ ORDER : places
ORDER ||--|{ LINE-ITEM : contains
CUSTOMER }|..|{ DELIVERY-ADDRESS : uses
Entitätsnamen werden üblicherweise großgeschrieben, obwohl es dafür keinen anerkannten Standard gibt und die Mermaid-Syntax dies nicht vorschreibt.
Die Beziehungen zwischen Entitäten werden durch Linien mit Endpunktmarkierungen dargestellt, die die Kardinalität angeben. Mermaid verwendet die beliebteste Krähenfuß-Notation; der Krähenfuß zeigt anschaulich an, dass die Entität, mit der er verbunden ist, möglicherweise mehrere Instanzen hat.
ER-Diagramme können für verschiedene Zwecke verwendet werden, vom abstrakten logischen Modell ohne jegliche Implementierungsdetails bis zum physischen Modell relationaler Datenbanktabellen. Das Einbeziehen von Attributdefinitionen in ein ER-Diagramm hilft, den Zweck und die Bedeutung einer Entität zu verstehen. Diese Attributdefinitionen müssen nicht erschöpfend sein, meist genügt eine kleine Teilmenge der Attribute. Mermaid ermöglicht es, sie mit ihrem Typ und Namen zu definieren.
Kopieren
Einbetten
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
}
Wenn du Attribute in ein ER-Diagramm aufnimmst, musst du entscheiden, ob du Fremdschlüssel als Attribute aufnimmst, was davon abhängen kann, in welchem Umfang du die relationale Tabellenstruktur darstellen möchtest. Wenn dein Diagramm ein logisches Modell ist und keine relationale Implementierung andeuten soll, ist es besser, diese Attribute nicht aufzunehmen, da die Assoziationsbeziehung bereits vermittelt, wie die Entitäten miteinander verbunden sind. Beispielsweise kann eine JSON-Datenstruktur eine Eins-zu-viele-Beziehung ohne Fremdschlüsselattribute mithilfe eines Arrays implementieren. Ähnlich können objektorientierte Programmiersprachen Zeiger oder Referenzen auf Sammlungen verwenden. Selbst bei Modellen, die auf eine relationale Implementierung abzielen, kann man der Ansicht sein, dass das Aufnehmen von Fremdschlüsselattributen die von der Beziehung dargestellten Informationen dupliziert und der Entität keine zusätzliche Bedeutung verleiht.
Syntax
Entitäten und Beziehungen
Die Mermaid-Syntax für ER-Diagramme ist mit PlantUML kompatibel und erweitert die Funktionen zur Kennzeichnung von Beziehungen. Jede Anweisung enthält Folgendes:
Kopieren
Einbetten
<first-entity> [<relationship> <second-entity> : <relationship-label>]
- first-entity ist der Name der ersten Entität. Der Name unterstützt beliebige Unicode-Zeichen und kann Leerzeichen enthalten, wenn er in doppelte Anführungszeichen gesetzt wird.
- relationship beschreibt die gegenseitige Beziehung zwischen zwei Entitäten.
- second-entity ist der Name der anderen Entität.
- relationship-label beschreibt die Beziehung aus Sicht der ersten Entität.
Zum Beispiel:
Kopieren
Einbetten
PROPERTY ||--|{ ROOM : contains
Diese Deklaration kann wie folgt verstanden werden: Eine Property enthält ein oder mehrere Rooms, und ein Room gehört zu genau einer Property. Hier wird das Label aus Sicht der ersten Entität betrachtet: Eine Property enthält einen Room, aber ein Room enthält keine Property. Aus Sicht der zweiten Entität lässt sich das entsprechende Label in der Regel leicht ableiten.
Nur der Teil first-entity ist zwingend erforderlich. Dadurch ist es möglich, Entitäten ohne Beziehungen darzustellen, was beim iterativen Aufbau von Diagrammen sehr nützlich ist. Wenn andere Teile der Anweisung angegeben werden, sind alle Teile erforderlich.
Unicode-Text
Entitätsnamen, Beziehungen und Attribute unterstützen alle Unicode-Text.
Kopieren
Einbetten
erDiagram
"This ❤ Unicode"
Beziehungssyntax
Der Beziehungsteil jeder Anweisung kann in drei Unterteile aufgeteilt werden:
- Die Kardinalität der ersten Entität relativ zur zweiten Entität
- Ob die Beziehung der untergeordneten Entität Identität verleiht
- Die Kardinalität der zweiten Entität relativ zur ersten Entität
Die Kardinalität ist eine Eigenschaft, die beschreibt, wie viele Elemente einer anderen Entität mit der betroffenen Entität verknüpft sein können. Im obigen Beispiel kann eine PROPERTY mit einer oder mehreren ROOM-Instanzen verknüpft sein, während ein ROOM nur mit einer PROPERTY verknüpft sein kann. Jede Kardinalitätsmarkierung enthält zwei Zeichen, wobei das äußerste Zeichen den Maximalwert und das innerste Zeichen den Minimalwert repräsentiert. Die folgende Tabelle fasst die Möglichkeiten der Kardinalität zusammen:
| Wert (links) | Wert (rechts) | Bedeutung |
|---|---|---|
| |o | o| | Null oder eins |
| || | || | Genau eins |
| }o | o{ | Null oder mehrere (ohne Obergrenze) |
| }| | |{ | Eins oder mehrere (ohne Obergrenze) |
| Wert (links) | Wert (rechts) | Bedeutung |
|---|---|---|
| one or zero | one or zero | Null oder eins |
| zero or one | zero or one | Null oder eins |
| one or more | one or more | Eins oder mehrere |
| one or many | one or many | Eins oder mehrere |
| many(1) | many(1) | Eins oder mehrere |
| 1+ | 1+ | Eins oder mehrere |
| zero or more | zero or more | Null oder mehrere |
| zero or many | zero or many | Null oder mehrere |
| many(0) | many(0) | Null oder mehrere |
| 0+ | 0+ | Null oder mehrere |
| only one | only one | Genau eins |
| 1 | 1 | Genau eins |
Identifizierung
Beziehungen können in identifizierende und nicht identifizierende unterteilt werden und werden jeweils mit einer durchgezogenen oder gestrichelten Linie gerendert. Dies ist wichtig, wenn eine der Entitäten ohne die andere nicht eigenständig existieren kann. Beispielsweise muss ein Unternehmen, das Menschen das Fahren von Autos versichert, möglicherweise Daten zu NAMED-DRIVER speichern. Bei der Modellierung könnte man zunächst beobachten, dass ein CAR von vielen PERSONs gefahren werden kann und eine PERSON viele CARs fahren kann; beide können ohne einander existieren, es handelt sich also um eine nicht identifizierende Beziehung, die wir in Mermaid als PERSON }|..|{ CAR : "driver" angeben können. Beachte die beiden Punkte in der Mitte der Beziehung, die dazu führen, dass zwischen den beiden Entitäten eine gestrichelte Linie gezeichnet wird. Wenn diese Viele-zu-viele-Beziehung jedoch in zwei Eins-zu-viele-Beziehungen aufgelöst wird, beobachten wir, dass NAMED-DRIVER ohne PERSON und CAR nicht existieren könnte. Diese Beziehungen werden zu identifizierenden Beziehungen und mit einem Bindestrich dargestellt, was einer durchgezogenen Linie entspricht:
| Wert | Alias |
|---|---|
| -- | Identifizierend |
| .. | Nicht identifizierend |
| Wert | 别名为 |
|---|---|
| to | Identifizierend |
| optionally to | Nicht identifizierend |
Kopieren
Einbetten
erDiagram
CAR ||--o{ NAMED-DRIVER : allows
PERSON }o..o{ NAMED-DRIVER : is
Kopieren
Einbetten
erDiagram
CAR ||--o{ NAMED-DRIVER : allows
PERSON }o--o{ NAMED-DRIVER : is
Attribut
Du kannst Attribute für eine Entität definieren, indem du den Entitätsnamen angibst, gefolgt von einem Block mit mehreren type name, wobei der Block von geschweiften Klammern {} umschlossen wird. Die Attribute werden im Entitätskästchen angezeigt, zum Beispiel:
Kopieren
Einbetten
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
}
Der type-Wert muss mit einem alphabetischen Zeichen beginnen und kann Ziffern, Bindestriche, Unterstriche, runde Klammern und eckige Klammern enthalten. Der name-Wert folgt einem ähnlichen Format wie type, kann aber auch mit einem Sternchen beginnen, als weitere Option, um anzugeben, dass das Attribut ein Primärschlüssel ist. Darüber hinaus gibt es keine weiteren Einschränkungen und keine implizite Menge gültiger Datentypen.
Entitäts-Alias
Mit eckigen Klammern kann ein Alias für eine Entität hinzugefügt werden. Wenn ein Alias angegeben wird, zeigt das Diagramm den Alias anstelle des Entitätsnamens an; der Alias folgt denselben Regeln wie der Entitätsname.
Kopieren
Einbetten
erDiagram
p[Person] {
string firstName
string lastName
}
a["Customer Account"] {
string email
}
p ||--o| a : has
Attributschlüssel und Kommentare
Attribute können auch Schlüssel oder Kommentare definieren. Ein Schlüssel kann ein Primärschlüssel (PK), ein Fremdschlüssel (FK) oder ein eindeutiger Schlüssel (UK) sein. Um mehrere Schlüsseleinschränkungen für ein einzelnes Attribut anzugeben, trenne sie durch Kommas (z. B. PK, FK). Ein Kommentar wird durch doppelte Anführungszeichen am Ende des Attributs definiert; der Kommentar darf kein doppeltes Anführungszeichen enthalten.
Kopieren
Einbetten
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
Richtung
Die Richtungsanweisung deklariert die Richtung des Diagramms.
TB deklariert, dass die Richtung des Diagramms von oben nach unten verläuft; BT kann sie in von unten nach oben umkehren.
Kopieren
Einbetten
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 deklariert, dass die Richtung des Diagramms von links nach rechts verläuft; RL kann sie in von rechts nach links umkehren.
Kopieren
Einbetten
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
}
Knotenstil festlegen
Auf einen Knoten kann ein bestimmter Stil angewendet werden, zum Beispiel ein dickerer Rahmen oder eine andere Hintergrundfarbe.
Kopieren
Einbetten
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 kannst Stile auch in einer Anweisung an eine Knotenliste anhängen:
Kopieren
Einbetten
style nodeId1,nodeId2 styleList
Klasse
Bequemer als jedes Mal einen Stil zu definieren, ist es, eine Stilklasse zu definieren und diese Klasse an Knoten anzuhängen, die ein anderes Aussehen benötigen.
Die Klassendefinition ist im folgenden Beispiel dargestellt:
Kopieren
Einbetten
classDef className fill:pink,stroke:#333,stroke-width:4px
Mehrere Klassen können auch in einer Anweisung definiert werden:
Kopieren
Einbetten
classDef firstClassName,secondClassName font-size:12pt
Die Syntax zum Anhängen einer Klasse an einen Knoten lautet wie folgt:
Kopieren
Einbetten
class nodeId1 className
Du kannst eine Klasse auch in einer Anweisung an eine Knotenliste anhängen:
Kopieren
Einbetten
class nodeId1,nodeId2 className
Du kannst auch mehrere Klassen gleichzeitig anhängen:
Kopieren
Einbetten
class nodeId1,nodeId2 className1,className2
Eine einfache Möglichkeit, eine Klasse hinzuzufügen, ist die Verwendung des Operators :::, um den Klassennamen an einen Knoten anzuhängen, wie unten gezeigt:
Kopieren
Einbetten
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
Die Beziehungen zwischen Entitäten können mit folgender Syntax deklariert werden:
Kopieren
Einbetten
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
Ähnlich wie bei der class-Anweisung kann die Kurzschreibweise auch mehrere Klassen auf einmal anwenden:
Kopieren
Einbetten
nodeId:::className1,className2
Standardklasse
Wenn eine Klasse default genannt wird, wird sie allen Klassen zugewiesen, die keine spezifische Klassendefinition haben.
Kopieren
Einbetten
classDef default fill:pink,stroke:#333,stroke-width:4px;
Hinweis: Benutzerdefinierte Stile aus Stil- oder anderen class-Anweisungen haben Vorrang und überschreiben den Standardstil. (Zum Beispiel legt die Klasse default einen rosa Hintergrund für einen Knoten fest, aber wenn die Klasse blue angewendet wird, erhält der Knoten eine blaue Hintergrundfarbe.)
Kopieren
Einbetten
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
Das Layout des Diagramms wird von render() verarbeitet; das Standardlayout ist das ELK-Layout, das für größere und komplexere Diagramme geeignet ist.
Um stattdessen das klassische Dagre-Layout zu verwenden, kannst du es im config des YAML-Frontmatters festlegen
Kopieren
Einbetten
---
config:
layout: dagre
---
Der Mermaid-Code-Inhalt lautet wie folgt:
Kopieren
Einbetten
---
title: Order example
config:
layout: elk
---
erDiagram
CUSTOMER ||--o{ ORDER : places
ORDER ||--|{ LINE-ITEM : contains
CUSTOMER }|..|{ DELIVERY-ADDRESS : uses