Diagram ER
Diagram relasi entitas (disingkat diagram ER) mendeskripsikan hal-hal yang menjadi perhatian dan saling terkait dalam bidang pengetahuan tertentu. Sebuah diagram ER dasar terdiri dari jenis entitas (untuk mengklasifikasikan hal-hal yang menjadi perhatian), dan menentukan relasi yang dapat ada antar entitas (instance dari jenis entitas tersebut),Perlu diperhatikan bahwa dalam praktik diagram ER, hampir selalu menyebut "jenis entitas" sebagai "entitas". Misalnya, "jenis entitas CUSTOMER" biasanya langsung disebut "entitas CUSTOMER". Praktik ini sangat umum, sehingga cara lain tidak disarankan; namun secara teknis, entitas adalah instance abstrak dari jenis entitas, dan diagram ER menampilkan instance abstrak tersebut beserta relasi di antaranya. Inilah alasan mengapa entitas selalu dinamai menggunakan kata benda tunggal.
Salin
Sematkan
---
title: Order example
---
erDiagram
CUSTOMER ||--o{ ORDER : places
ORDER ||--|{ LINE-ITEM : contains
CUSTOMER }|..|{ DELIVERY-ADDRESS : uses
Nama entitas biasanya menggunakan huruf kapital, meskipun tidak ada standar yang diakui untuk hal ini, dan sintaks Mermaid juga tidak mewajibkannya.
Relasi antar entitas direpresentasikan dengan garis yang memiliki penanda ujung yang menunjukkan kardinalitas. Mermaid menggunakan notasi kaki gagak yang paling populer; kaki gagak secara visual menunjukkan bahwa entitas yang terhubung dengannya mungkin memiliki beberapa instance.
Diagram ER dapat digunakan untuk berbagai keperluan, mulai dari model logis abstrak yang tidak memuat detail implementasi apa pun, hingga model fisik tabel basis data relasional. Menyertakan definisi atribut pada diagram ER membantu memahami kegunaan dan makna entitas; definisi atribut ini tidak harus lengkap, biasanya sebagian kecil atribut sudah cukup. Mermaid memungkinkan pendefinisiannya berdasarkan jenis dan namanya.
Salin
Sematkan
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
}
Saat menyertakan atribut pada diagram ER, Anda harus memutuskan apakah akan menyertakan kunci asing sebagai atribut, yang mungkin bergantung pada sejauh mana Anda ingin merepresentasikan struktur tabel relasional. Jika diagram Anda adalah model logis dan tidak dimaksudkan untuk menyiratkan implementasi relasional, sebaiknya jangan menyertakan atribut tersebut, karena relasi asosiasi sudah menyampaikan cara entitas terkait. Misalnya, struktur data JSON dapat mengimplementasikan relasi satu-ke-banyak menggunakan larik tanpa atribut kunci asing. Serupa dengan itu, bahasa pemrograman berorientasi objek dapat menggunakan pointer atau referensi ke koleksi. Bahkan untuk model yang ditujukan untuk implementasi relasional, menyertakan atribut kunci asing mungkin dianggap menduplikasi informasi yang sudah ditampilkan oleh relasi, dan tidak menambah makna pada entitas.
Sintaks
Entitas dan relasi
Sintaks Mermaid untuk diagram ER kompatibel dengan PlantUML, dan diperluas dengan fitur untuk menandai relasi. Setiap pernyataan mencakup hal-hal berikut:
Salin
Sematkan
<first-entity> [<relationship> <second-entity> : <relationship-label>]
- first-entity adalah nama entitas pertama. Nama mendukung karakter Unicode apa pun, dan jika dibungkus dengan tanda kutip ganda, dapat berisi spasi.
- relationship mendeskripsikan hubungan timbal balik antara dua entitas.
- second-entity adalah nama entitas lainnya.
- relationship-label mendeskripsikan relasi dari sudut pandang entitas pertama.
Misalnya:
Salin
Sematkan
PROPERTY ||--|{ ROOM : contains
Pernyataan ini dapat dipahami sebagai: sebuah properti berisi satu atau lebih kamar, sedangkan satu kamar hanya milik satu properti. Label di sini dilihat dari sudut pandang entitas pertama: sebuah properti berisi sebuah kamar, tetapi sebuah kamar tidak berisi properti. Dari sudut pandang entitas kedua, label yang setara biasanya mudah disimpulkan.
Hanya bagian first-entity yang bersifat wajib. Hal ini memungkinkan menampilkan entitas tanpa relasi, yang sangat berguna saat membangun diagram secara iteratif. Jika bagian lain dari pernyataan ditentukan, maka semua bagian bersifat wajib.
Teks Unicode
Nama entitas, relasi, dan atribut semuanya mendukung teks unicode.
Salin
Sematkan
erDiagram
"This ❤ Unicode"
Sintaks relasi
Bagian relasi pada setiap pernyataan dapat dipecah menjadi tiga subbagian:
- Kardinalitas entitas pertama terhadap entitas kedua
- Apakah relasi tersebut memberikan identifikasi pada entitas anak
- Kardinalitas entitas kedua terhadap entitas pertama
Kardinalitas adalah atribut yang mendeskripsikan jumlah elemen entitas lain yang dapat dikaitkan dengan entitas yang bersangkutan. Pada contoh di atas, satu PROPERTY dapat dikaitkan dengan satu atau lebih instance ROOM, sedangkan satu ROOM hanya dapat dikaitkan dengan satu PROPERTY. Setiap penanda kardinalitas memiliki dua karakter; karakter paling luar merepresentasikan nilai maksimum, dan karakter paling dalam merepresentasikan nilai minimum. Tabel berikut merangkum kemungkinan kardinalitas:
| Nilai (kiri) | Nilai (kanan) | Makna |
|---|---|---|
| |o | o| | Nol atau satu |
| || | || | Tepat satu |
| }o | o{ | Nol atau banyak (tanpa batas) |
| }| | |{ | Satu atau banyak (tanpa batas) |
| Nilai (kiri) | Nilai (kanan) | Makna |
|---|---|---|
| one or zero | one or zero | Nol atau satu |
| zero or one | zero or one | Nol atau satu |
| one or more | one or more | Satu atau banyak |
| one or many | one or many | Satu atau banyak |
| many(1) | many(1) | Satu atau banyak |
| 1+ | 1+ | Satu atau banyak |
| zero or more | zero or more | Nol atau banyak |
| zero or many | zero or many | Nol atau banyak |
| many(0) | many(0) | Nol atau banyak |
| 0+ | 0+ | Nol atau banyak |
| only one | only one | Tepat satu |
| 1 | 1 | Tepat satu |
Identifikasi
Relasi dapat dibagi menjadi mengidentifikasi dan tidak mengidentifikasi, masing-masing dirender dengan garis padat atau garis putus-putus. Hal ini penting ketika salah satu entitas tidak dapat berdiri sendiri tanpa entitas lainnya. Misalnya, sebuah perusahaan yang menyediakan asuransi untuk orang yang mengemudikan mobil mungkin perlu menyimpan data NAMED-DRIVER. Saat memodelkan, kita mungkin pertama-tama mengamati bahwa satu CAR dapat dikemudikan oleh banyak PERSON, dan satu PERSON dapat mengemudikan banyak CAR, keduanya dapat berdiri sendiri tanpa satu sama lain, sehingga ini adalah relasi non-identifikasi, yang dapat kita tentukan dalam Mermaid sebagai: PERSON }|..|{ CAR : "driver". Perhatikan dua titik di tengah relasi, ini akan menyebabkan garis putus-putus digambar antara kedua entitas. Namun, ketika relasi banyak-ke-banyak ini diuraikan menjadi dua relasi satu-ke-banyak, kita mengamati bahwa NAMED-DRIVER tidak mungkin ada tanpa PERSON dan CAR. Relasi ini menjadi relasi identifikasi, dan akan dilambangkan dengan tanda hubung, yang sesuai dengan garis padat:
| Nilai | Alias |
|---|---|
| -- | Mengidentifikasi |
| .. | Tidak mengidentifikasi |
| Nilai | 别名为 |
|---|---|
| to | Mengidentifikasi |
| optionally to | Tidak mengidentifikasi |
Salin
Sematkan
erDiagram
CAR ||--o{ NAMED-DRIVER : allows
PERSON }o..o{ NAMED-DRIVER : is
Salin
Sematkan
erDiagram
CAR ||--o{ NAMED-DRIVER : allows
PERSON }o--o{ NAMED-DRIVER : is
Atribut
Atribut dapat didefinisikan untuk entitas dengan menentukan nama entitas, lalu diikuti blok yang berisi beberapa type name, di mana blok tersebut diapit oleh kurung kurawal {}. Atribut akan ditampilkan di dalam kotak entitas, misalnya:
Salin
Sematkan
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
}
Nilai type harus diawali dengan karakter huruf, dan dapat berisi angka, tanda hubung, garis bawah, tanda kurung biasa, dan tanda kurung siku. Nilai name mengikuti format yang serupa dengan type, tetapi juga dapat diawali dengan tanda bintang, sebagai opsi lain untuk menunjukkan bahwa atribut tersebut adalah kunci utama. Selain itu, tidak ada batasan lain, dan tidak ada kumpulan jenis data valid yang tersirat.
Alias entitas
Anda dapat menambahkan alias pada entitas menggunakan tanda kurung siku. Jika alias diberikan, diagram akan menampilkan alias alih-alih nama entitas; alias mengikuti semua aturan yang sama seperti nama entitas.
Salin
Sematkan
erDiagram
p[Person] {
string firstName
string lastName
}
a["Customer Account"] {
string email
}
p ||--o| a : has
Kunci dan komentar atribut
Atribut juga dapat mendefinisikan kunci atau komentar. Kunci dapat berupa kunci utama (PK), kunci asing (FK), atau kunci unik (UK). Untuk menentukan beberapa batasan kunci pada satu atribut, pisahkan dengan koma (misalnya, PK, FK). Komentar didefinisikan melalui tanda kutip ganda di akhir atribut; komentar tidak boleh berisi karakter tanda kutip ganda.
Salin
Sematkan
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
Arah
Pernyataan arah mendeklarasikan arah diagram.
TB mendeklarasikan arah diagram dari atas ke bawah, BT dapat membalikkannya menjadi dari bawah ke atas.
Salin
Sematkan
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 mendeklarasikan arah diagram dari kiri ke kanan, RL dapat membalikkannya menjadi dari kanan ke kiri.
Salin
Sematkan
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
}
Mengatur gaya simpul
Anda dapat menerapkan gaya tertentu pada simpul, misalnya batas yang lebih tebal atau warna latar belakang yang berbeda.
Salin
Sematkan
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
Anda juga dapat melampirkan gaya pada daftar simpul dalam satu pernyataan:
Salin
Sematkan
style nodeId1,nodeId2 styleList
Kelas
Lebih praktis daripada mendefinisikan gaya setiap kali, Anda dapat mendefinisikan kelas gaya dan melampirkan kelas tersebut pada simpul yang memerlukan tampilan berbeda.
Definisi kelas seperti yang ditunjukkan pada contoh berikut:
Salin
Sematkan
classDef className fill:pink,stroke:#333,stroke-width:4px
Anda juga dapat mendefinisikan beberapa kelas dalam satu pernyataan:
Salin
Sematkan
classDef firstClassName,secondClassName font-size:12pt
Sintaks untuk melampirkan kelas pada simpul adalah sebagai berikut:
Salin
Sematkan
class nodeId1 className
Anda juga dapat melampirkan satu kelas pada daftar simpul dalam satu pernyataan:
Salin
Sematkan
class nodeId1,nodeId2 className
Anda juga dapat melampirkan beberapa kelas sekaligus:
Salin
Sematkan
class nodeId1,nodeId2 className1,className2
Cara praktis untuk menambahkan kelas adalah menggunakan operator ::: untuk melampirkan nama kelas pada simpul, seperti yang ditunjukkan di bawah ini:
Salin
Sematkan
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
Untuk mendeklarasikan relasi antar entitas, Anda dapat menggunakan sintaks berikut:
Salin
Sematkan
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
Serupa dengan pernyataan class, sintaks singkat juga dapat menerapkan beberapa kelas sekaligus:
Salin
Sematkan
nodeId:::className1,className2
Kelas bawaan
Jika sebuah kelas dinamai default, kelas tersebut akan ditugaskan ke semua kelas yang tidak memiliki definisi kelas khusus.
Salin
Sematkan
classDef default fill:pink,stroke:#333,stroke-width:4px;
Catatan: gaya khusus dari pernyataan gaya atau kelas lain memiliki prioritas, dan menimpa gaya bawaan. (Misalnya, kelas default menetapkan latar belakang merah muda untuk simpul, tetapi jika kelas blue diterapkan, akan memberikan warna latar belakang biru untuk simpul tersebut.)
Salin
Sematkan
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
Konfigurasi
Tata letak
Tata letak diagram ditangani oleh render(), tata letak bawaannya adalah tata letak ELK, cocok untuk diagram yang lebih besar dan lebih kompleks.
Untuk beralih ke tata letak Dagre klasik, Anda dapat mengaturnya di config pada YAML frontmatter
Salin
Sematkan
---
config:
layout: dagre
---
Konten kode Mermaid adalah sebagai berikut:
Salin
Sematkan
---
title: Order example
config:
layout: elk
---
erDiagram
CUSTOMER ||--o{ ORDER : places
ORDER ||--|{ LINE-ITEM : contains
CUSTOMER }|..|{ DELIVERY-ADDRESS : uses