Prozess Typ
Grafischer Ausdruck
Denken Typ
Strukturierter Ausdruck
Notizen Typ
Effizienter Ausdruck

ER-DiagrammSyntax

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.

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

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

Code
                            
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)
Alias
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
Alias
Wert 别名为
to Identifizierend
optionally to Nicht identifizierend
Code
                            
Kopieren
Einbetten
erDiagram CAR ||--o{ NAMED-DRIVER : allows PERSON }o..o{ NAMED-DRIVER : is
Code
                            
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:

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

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

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

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

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

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

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

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

Code
                            
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

Code
                            
Kopieren
Einbetten
--- config: layout: dagre ---

Der Mermaid-Code-Inhalt lautet wie folgt:

Code
                            
Kopieren
Einbetten
--- title: Order example config: layout: elk --- erDiagram CUSTOMER ||--o{ ORDER : places ORDER ||--|{ LINE-ITEM : contains CUSTOMER }|..|{ DELIVERY-ADDRESS : uses