Proces Typ
Wyrażenie graficzne
Myślenie Typ
Wyrażenie strukturalne
Notatki Typ
Efektywne wyrażanie

Diagram ERSkładnia

Diagram ER

Diagram relacji encji (w skrócie diagram ER) opisuje powiązane ze sobą obiekty zainteresowania w określonej dziedzinie wiedzy. Podstawowy diagram ER składa się z typów encji (służących do klasyfikowania obiektów zainteresowania) i określa relacje, które mogą istnieć między encjami (wystąpieniami tych typów encji),Należy zauważyć, że w praktyce na diagramach ER prawie zawsze 'typ encji' nazywa się po prostu 'encją'. Na przykład 'typ encji CUSTOMER' jest zwykle nazywany po prostu 'encją CUSTOMER'. Praktyka ta jest bardzo powszechna, dlatego nie zaleca się innych sposobów; technicznie jednak encja jest abstrakcyjnym wystąpieniem typu encji, a diagram ER pokazuje właśnie te abstrakcyjne wystąpienia i relacje między nimi. Dlatego encje zawsze nazywa się rzeczownikami w liczbie pojedynczej.

Kod
                            
Kopiuj
Osadź
--- title: Order example --- erDiagram CUSTOMER ||--o{ ORDER : places ORDER ||--|{ LINE-ITEM : contains CUSTOMER }|..|{ DELIVERY-ADDRESS : uses

Nazwy encji są zwykle pisane wielkimi literami, chociaż nie ma na to powszechnie przyjętego standardu, a składnia Mermaid tego nie wymaga.

Relacje między encjami są przedstawiane za pomocą linii z oznaczeniami końców wskazującymi liczebność. Mermaid stosuje najpopularniejszą notację stopki wrony; stopka wrony wizualnie wskazuje, że połączona encja może mieć wiele wystąpień.

Diagramy ER można stosować do różnych celów, od abstrakcyjnych modeli logicznych niezawierających szczegółów implementacyjnych po modele fizyczne tabel relacyjnych baz danych. Umieszczenie definicji atrybutów na diagramie ER pomaga zrozumieć przeznaczenie i znaczenie encji; te definicje atrybutów nie muszą być wyczerpujące, zwykle wystarczy niewielki podzbiór atrybutów. Mermaid pozwala definiować je według typu i nazwy.

Kod
                            
Kopiuj
Osadź
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 }

Podczas umieszczania atrybutów na diagramie ER musisz zdecydować, czy uwzględnić klucze obce jako atrybuty; może to zależeć od tego, w jakim stopniu chcesz przedstawić strukturę tabel relacyjnych. Jeśli Twój diagram jest modelem logicznym, który nie ma sugerować implementacji relacyjnej, najlepiej jest pominąć te atrybuty, ponieważ relacja asocjacji już przekazuje sposób powiązania encji. Na przykład struktura danych JSON może implementować relację jeden-do-wielu za pomocą tablicy bez atrybutów klucza obcego. Podobnie obiektowe języki programowania mogą używać wskaźników lub odwołań do kolekcji. Nawet w przypadku modeli przeznaczonych do implementacji relacyjnej można uznać, że uwzględnienie atrybutów klucza obcego powiela informacje przekazywane przez relację i nie dodaje encji znaczenia.

Składnia

Encje i relacje

Składnia Mermaid diagramu ER jest zgodna z PlantUML i rozszerza funkcje o oznaczanie relacji. Każda instrukcja obejmuje następujące elementy:

                            
Kopiuj
Osadź
<first-entity> [<relationship> <second-entity> : <relationship-label>]
  • first-entity to nazwa pierwszej encji. Nazwa obsługuje dowolne znaki Unicode i może zawierać spacje, jeśli zostanie ujęta w podwójne cudzysłowy.
  • relationship opisuje wzajemną relację między dwiema encjami.
  • second-entity to nazwa drugiej encji.
  • relationship-label opisuje relację z punktu widzenia pierwszej encji.

Na przykład:

                            
Kopiuj
Osadź
PROPERTY ||--|{ ROOM : contains

To stwierdzenie można rozumieć następująco: jedna nieruchomość zawiera jeden lub więcej pokoi, a jeden pokój należy tylko do jednej nieruchomości. Etykieta tutaj jest podana z punktu widzenia pierwszej encji: nieruchomość zawiera pokój, ale pokój nie zawiera nieruchomości. Z punktu widzenia drugiej encji równoważną etykietę zwykle łatwo wywnioskować.

Tylko część first-entity jest obowiązkowa. Umożliwia to pokazanie encji bez relacji, co jest bardzo przydatne podczas iteracyjnego budowania diagramu. Jeśli określono inne części instrukcji, wszystkie części są wymagane.

Tekst Unicode

Nazwy encji, relacje i atrybuty obsługują tekst unicode.

Kod
                            
Kopiuj
Osadź
erDiagram "This ❤ Unicode"

Składnia relacji

Część relacji każdej instrukcji można podzielić na trzy podczęści:

  • Liczebność pierwszej encji względem drugiej encji
  • Czy ta relacja nadaje tożsamość encji podrzędnej
  • Liczebność drugiej encji względem pierwszej encji

Liczebność to właściwość opisująca liczbę elementów, z którymi inna encja może być powiązana z daną encją. W powyższym przykładzie jedna nieruchomość PROPERTY może być powiązana z jednym lub więcej wystąpieniami ROOM, a jeden ROOM może być powiązany tylko z jedną nieruchomością PROPERTY. W każdym oznaczeniu liczebności znajdują się dwa znaki: najbardziej zewnętrzny znak reprezentuje wartość maksymalną, a najbardziej wewnętrzny wartość minimalną. Poniższa tabela podsumowuje możliwe liczebności:

Wartość (lewa) Wartość (prawa) Znaczenie
|o o| Zero lub jeden
|| || Dokładnie jeden
}o o{ Zero lub więcej (bez górnego limitu)
}| |{ Jeden lub więcej (bez górnego limitu)
Alias
Wartość (lewa) Wartość (prawa) Znaczenie
one or zero one or zero Zero lub jeden
zero or one zero or one Zero lub jeden
one or more one or more Jeden lub więcej
one or many one or many Jeden lub więcej
many(1) many(1) Jeden lub więcej
1+ 1+ Jeden lub więcej
zero or more zero or more Zero lub więcej
zero or many zero or many Zero lub więcej
many(0) many(0) Zero lub więcej
0+ 0+ Zero lub więcej
only one only one Dokładnie jeden
1 1 Dokładnie jeden

Identyfikacja tożsamości

Relacje można podzielić na identyfikujące i nieidentyfikujące, renderowane odpowiednio linią ciągłą lub kreskowaną. Jest to istotne, gdy jedna z encji nie może istnieć niezależnie bez drugiej. Na przykład firma ubezpieczająca ludzi prowadzących samochody może potrzebować przechowywania danych NAMED-DRIVER. Podczas modelowania możemy najpierw zauważyć, że CAR może być prowadzony przez wiele PERSON, a PERSON może prowadzić wiele CAR; oba mogą istnieć bez siebie, więc jest to relacja nieidentyfikująca, którą w Mermaid możemy określić jako: PERSON }|..|{ CAR : "driver". Należy zwrócić uwagę na dwie kropki w środku relacji, co spowoduje narysowanie linii kreskowanej między dwiema encjami. Jednak gdy ta relacja wiele-do-wielu zostanie rozłożona na dwie relacje jeden-do-wielu, zauważamy, że NAMED-DRIVER nie może istnieć bez PERSON i CAR. Te relacje stają się relacjami identyfikującymi i będą oznaczone myślnikiem, co odpowiada linii ciągłej:

Wartość Alias
-- Identyfikująca
.. Nieidentyfikująca
Alias
Wartość 别名为
to Identyfikująca
optionally to Nieidentyfikująca
Kod
                            
Kopiuj
Osadź
erDiagram CAR ||--o{ NAMED-DRIVER : allows PERSON }o..o{ NAMED-DRIVER : is
Kod
                            
Kopiuj
Osadź
erDiagram CAR ||--o{ NAMED-DRIVER : allows PERSON }o--o{ NAMED-DRIVER : is

Atrybut

Atrybuty encji można zdefiniować, określając nazwę encji, a następnie blok zawierający wiele type name, przy czym blok jest otoczony nawiasami klamrowymi {}. Atrybuty są wyświetlane wewnątrz ramki encji, na przykład:

Kod
                            
Kopiuj
Osadź
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 }

Wartość type musi zaczynać się od znaku alfabetycznego i może zawierać cyfry, myślniki, podkreślenia, nawiasy okrągłe i nawiasy kwadratowe. Wartość name podlega podobnemu formatowi jak type, ale może również zaczynać się od gwiazdki jako innej opcji wskazującej, że atrybut jest kluczem głównym. Poza tym nie ma innych ograniczeń ani niejawnego zestawu prawidłowych typów danych.

Alias encji

Do encji można dodać alias za pomocą nawiasów kwadratowych. Jeśli podano alias, na diagramie będzie wyświetlany alias zamiast nazwy encji; alias podlega tym samym zasadom co nazwa encji.

Kod
                            
Kopiuj
Osadź
erDiagram p[Person] { string firstName string lastName } a["Customer Account"] { string email } p ||--o| a : has

Klucze atrybutów i komentarze

Atrybuty mogą również definiować klucze lub komentarze. Klucz może być kluczem głównym (PK), kluczem obcym (FK) lub kluczem unikalnym (UK). Aby określić wiele ograniczeń klucza na jednym atrybucie, oddziel je przecinkami (np. PK, FK). Komentarze definiuje się za pomocą podwójnych cudzysłowów na końcu atrybutu; komentarz nie może zawierać znaku podwójnego cudzysłowu.

Kod
                            
Kopiuj
Osadź
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

Kierunek

Instrukcja kierunku deklaruje kierunek diagramu.

TB deklaruje kierunek diagramu od góry do dołu; BT może go odwrócić na od dołu do góry.

Kod
                            
Kopiuj
Osadź
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 deklaruje kierunek diagramu od lewej do prawej; RL może go odwrócić na od prawej do lewej.

Kod
                            
Kopiuj
Osadź
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 }

Ustawianie stylu węzła

Do węzła można zastosować określony styl, na przykład pogrubioną ramkę lub inny kolor tła.

Kod
                            
Kopiuj
Osadź
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

Możesz także dołączyć styl do listy węzłów w jednej instrukcji:

                            
Kopiuj
Osadź
style nodeId1,nodeId2 styleList

Klasa

Wygodniejszym niż każdorazowe definiowanie stylu jest zdefiniowanie klasy stylu i dołączenie jej do węzłów wymagających innego wyglądu.

Definicja klasy jest pokazana w poniższym przykładzie:

                            
Kopiuj
Osadź
classDef className fill:pink,stroke:#333,stroke-width:4px

Można także zdefiniować wiele klas w jednej instrukcji:

                            
Kopiuj
Osadź
classDef firstClassName,secondClassName font-size:12pt

Składnia dołączania klasy do węzła jest następująca:

                            
Kopiuj
Osadź
class nodeId1 className

Możesz także dołączyć klasę do listy węzłów w jednej instrukcji:

                            
Kopiuj
Osadź
class nodeId1,nodeId2 className

Możesz także dołączyć wiele klas jednocześnie:

                            
Kopiuj
Osadź
class nodeId1,nodeId2 className1,className2

Prostym sposobem dodania klasy jest użycie operatora :::, aby dołączyć nazwę klasy do węzła, jak pokazano poniżej:

Kod
                            
Kopiuj
Osadź
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

Do zadeklarowania relacji między encjami można użyć następującej składni:

Kod
                            
Kopiuj
Osadź
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

Podobnie jak instrukcja class, składnia skrócona może również zastosować wiele klas naraz:

                            
Kopiuj
Osadź
nodeId:::className1,className2

Klasa domyślna

Jeśli klasa nosi nazwę default, zostanie przypisana do wszystkich klas bez określonej definicji klasy.

                            
Kopiuj
Osadź
classDef default fill:pink,stroke:#333,stroke-width:4px;

Uwaga: niestandardowe style pochodzące ze stylu lub innych instrukcji klas mają priorytet i nadpisują styl domyślny. (Na przykład klasa default ustawia różowe tło dla węzła, ale jeśli zastosowano klasę blue, węzeł otrzyma niebieski kolor tła.)

Kod
                            
Kopiuj
Osadź
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

Konfiguracja

Układ

Układ diagramu jest obsługiwany przez render(); domyślnym układem jest układ ELK, odpowiedni dla większych i bardziej złożonych diagramów.

Aby zamiast tego użyć klasycznego układu Dagre, możesz ustawić go w config w YAML frontmatter

Kod
                            
Kopiuj
Osadź
--- config: layout: dagre ---

Treść kodu Mermaid jest następująca:

Kod
                            
Kopiuj
Osadź
--- title: Order example config: layout: elk --- erDiagram CUSTOMER ||--o{ ORDER : places ORDER ||--|{ LINE-ITEM : contains CUSTOMER }|..|{ DELIVERY-ADDRESS : uses