ER डायग्राम
एंटिटी रिलेशनशिप डायग्राम (संक्षेप में ER डायग्राम) किसी विशिष्ट ज्ञान क्षेत्र में परस्पर संबंधित रुचि की वस्तुओं का वर्णन करता है। एक बुनियादी ER डायग्राम एंटिटी प्रकारों (रुचि की वस्तुओं को वर्गीकृत करने के लिए) से बना होता है, और यह निर्दिष्ट करता है कि एंटिटी (इन एंटिटी प्रकारों के इंस्टेंस) के बीच कौन से संबंध मौजूद हो सकते हैं,कृपया ध्यान दें कि ER डायग्राम के व्यावहारिक उपयोग में, 'एंटिटी प्रकार' को लगभग हमेशा संक्षेप में 'एंटिटी' कहा जाता है। उदाहरण के लिए, 'CUSTOMER एंटिटी प्रकार' को आमतौर पर सीधे 'CUSTOMER एंटिटी' कहा जाता है। यह प्रथा बहुत सामान्य है, इसलिए अन्य तरीकों की सिफ़ारिश नहीं की जाती; हालाँकि तकनीकी रूप से, एंटिटी एंटिटी प्रकार का एक अमूर्त इंस्टेंस है, और ER डायग्राम इन्हीं अमूर्त इंस्टेंस तथा उनके बीच के संबंधों को दिखाता है। यही कारण है कि एंटिटी को हमेशा एकवचन संज्ञा से नाम दिया जाता है।
कॉपी करें
एम्बेड
---
title: Order example
---
erDiagram
CUSTOMER ||--o{ ORDER : places
ORDER ||--|{ LINE-ITEM : contains
CUSTOMER }|..|{ DELIVERY-ADDRESS : uses
एंटिटी नाम आमतौर पर बड़े अक्षरों में होते हैं, हालाँकि इसके लिए कोई मान्यता प्राप्त मानक नहीं है, और Mermaid सिंटैक्स भी इसे अनिवार्य नहीं करता।
एंटिटी के बीच के संबंधों को उन रेखाओं से दर्शाया जाता है जिनके सिरों पर कार्डिनैलिटी दर्शाने वाले चिह्न होते हैं। Mermaid सबसे लोकप्रिय क्रोज़ फ़ुट संकेतन का उपयोग करता है, क्रोज़ फ़ुट सहज रूप से दर्शाता है कि जिस एंटिटी से यह जुड़ा है उसके कई इंस्टेंस हो सकते हैं।
ER डायग्राम विभिन्न उद्देश्यों के लिए उपयोग किया जा सकता है, बिना किसी कार्यान्वयन विवरण वाले अमूर्त लॉजिकल मॉडल से लेकर रिलेशनल डेटाबेस तालिकाओं के भौतिक मॉडल तक। ER डायग्राम पर एट्रिब्यूट परिभाषाएँ शामिल करना एंटिटी के उद्देश्य और अर्थ को समझने में मदद करता है; इन एट्रिब्यूट परिभाषाओं का विस्तृत होना आवश्यक नहीं है, आमतौर पर एट्रिब्यूट का एक छोटा भाग पर्याप्त होता है। Mermaid आपको उन्हें उनके प्रकार और नाम से परिभाषित करने की अनुमति देता है।
कॉपी करें
एम्बेड
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
}
ER डायग्राम पर एट्रिब्यूट शामिल करते समय, आपको यह तय करना होगा कि विदेशी कुंजी (foreign key) को एट्रिब्यूट के रूप में शामिल करना है या नहीं, जो इस बात पर निर्भर हो सकता है कि आप रिलेशनल तालिका संरचना को कितनी हद तक दर्शाना चाहते हैं। यदि आपका चार्ट एक लॉजिकल मॉडल है और इसका उद्देश्य रिलेशनल कार्यान्वयन का संकेत देना नहीं है, तो इन एट्रिब्यूट को शामिल न करना बेहतर है, क्योंकि संबंध पहले ही बता देते हैं कि एंटिटी कैसे जुड़ी हुई हैं। उदाहरण के लिए, JSON डेटा संरचना विदेशी कुंजी एट्रिब्यूट के बिना ऐरे का उपयोग करके एक-से-अनेक संबंध लागू कर सकती है। इसी तरह, ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग भाषाएँ पॉइंटर या कलेक्शन के संदर्भ का उपयोग कर सकती हैं। उन मॉडलों के लिए भी जिनका उद्देश्य रिलेशनल कार्यान्वयन है, यह माना जा सकता है कि विदेशी कुंजी एट्रिब्यूट शामिल करने से संबंध द्वारा दिखाई गई जानकारी दोहराई जाती है और एंटिटी में कोई अर्थ नहीं जुड़ता।
सिंटैक्स
एंटिटी और संबंध
ER डायग्राम की Mermaid सिंटैक्स PlantUML के साथ संगत है, और संबंधों को लेबल करने की कार्यक्षमता से विस्तारित है। प्रत्येक कथन में निम्नलिखित शामिल होते हैं:
कॉपी करें
एम्बेड
<first-entity> [<relationship> <second-entity> : <relationship-label>]
- first-entity पहली एंटिटी का नाम है। नाम किसी भी Unicode अक्षर का समर्थन करता है, और यदि दोहरे उद्धरण चिह्नों में लपेटा जाए, तो इसमें स्पेस भी शामिल हो सकते हैं।
- relationship दो एंटिटी के बीच का पारस्परिक संबंध वर्णित करता है।
- second-entity दूसरी एंटिटी का नाम है।
- relationship-label पहली एंटिटी के दृष्टिकोण से संबंध का वर्णन करता है।
उदाहरण के लिए:
कॉपी करें
एम्बेड
PROPERTY ||--|{ ROOM : contains
इस कथन को इस प्रकार समझा जा सकता है: एक प्रॉपर्टी में एक या अधिक कमरे होते हैं, और एक कमरा केवल एक प्रॉपर्टी से संबंधित होता है। यहाँ लेबल पहली एंटिटी के दृष्टिकोण से है: एक प्रॉपर्टी में एक कमरा शामिल है, लेकिन एक कमरे में प्रॉपर्टी शामिल नहीं है। दूसरी एंटिटी के दृष्टिकोण से, समतुल्य लेबल आमतौर पर आसानी से अनुमानित किया जा सकता है।
केवल first-entity भाग अनिवार्य है। इससे बिना संबंध वाली एंटिटी दिखाना संभव हो जाता है, जो चार्ट को पुनरावृत्त रूप से बनाते समय बहुत उपयोगी होता है। यदि कथन के अन्य भाग निर्दिष्ट किए जाते हैं, तो सभी भाग अनिवार्य होते हैं।
Unicode टेक्स्ट
एंटिटी नाम, संबंध और एट्रिब्यूट सभी unicode टेक्स्ट का समर्थन करते हैं।
कॉपी करें
एम्बेड
erDiagram
"This ❤ Unicode"
संबंध सिंटैक्स
प्रत्येक कथन के संबंध भाग को तीन उपभागों में विभाजित किया जा सकता है:
- दूसरी एंटिटी के सापेक्ष पहली एंटिटी की कार्डिनैलिटी
- क्या यह संबंध चाइल्ड एंटिटी को पहचान प्रदान करता है
- पहली एंटिटी के सापेक्ष दूसरी एंटिटी की कार्डिनैलिटी
कार्डिनैलिटी एक विशेषता है जो बताती है कि संबंधित एंटिटी से किसी अन्य एंटिटी के कितने तत्व जुड़ सकते हैं। ऊपर दिए गए उदाहरण में, एक PROPERTY एक या अधिक ROOM इंस्टेंस से जुड़ी हो सकती है, और एक ROOM केवल एक PROPERTY से जुड़ी हो सकती है। प्रत्येक कार्डिनैलिटी चिह्न में दो अक्षर होते हैं, सबसे बाहरी अक्षर अधिकतम मान दर्शाता है और सबसे भीतरी अक्षर न्यूनतम मान दर्शाता है। नीचे दी गई तालिका कार्डिनैलिटी की संभावनाओं को सारांशित करती है:
| मान (बायाँ) | मान (दायाँ) | अर्थ |
|---|---|---|
| |o | o| | शून्य या एक |
| || | || | ठीक एक |
| }o | o{ | शून्य या अधिक (कोई सीमा नहीं) |
| }| | |{ | एक या अधिक (कोई सीमा नहीं) |
| मान (बायाँ) | मान (दायाँ) | अर्थ |
|---|---|---|
| one or zero | one or zero | शून्य या एक |
| zero or one | zero or one | शून्य या एक |
| one or more | one or more | एक या अधिक |
| one or many | one or many | एक या अधिक |
| many(1) | many(1) | एक या अधिक |
| 1+ | 1+ | एक या अधिक |
| zero or more | zero or more | शून्य या अधिक |
| zero or many | zero or many | शून्य या अधिक |
| many(0) | many(0) | शून्य या अधिक |
| 0+ | 0+ | शून्य या अधिक |
| only one | only one | ठीक एक |
| 1 | 1 | ठीक एक |
पहचान
संबंधों को पहचानने वाले (identifying) और गैर-पहचानने वाले (non-identifying) में विभाजित किया जा सकता है, जिन्हें क्रमशः ठोस या बिंदुदार रेखा से रेंडर किया जाता है। यह तब महत्वपूर्ण होता है जब कोई एक एंटिटी दूसरी एंटिटी के बिना स्वतंत्र रूप से मौजूद नहीं रह सकती। उदाहरण के लिए, लोगों को कार चलाने के लिए बीमा प्रदान करने वाली कंपनी को NAMED-DRIVER का डेटा संग्रहीत करने की आवश्यकता हो सकती है। मॉडलिंग करते समय, हम पहले यह देख सकते हैं कि एक CAR को कई PERSON चला सकते हैं, और एक PERSON कई CAR चला सकते हैं, दोनों एक-दूसरे के बिना मौजूद रह सकते हैं, इसलिए यह एक गैर-पहचानने वाला संबंध है, जिसे हम Mermaid में इस प्रकार निर्दिष्ट कर सकते हैं: PERSON }|..|{ CAR : "driver"। कृपया संबंध के बीच के दो बिंदुओं पर ध्यान दें, जिससे दोनों एंटिटी के बीच बिंदुदार रेखा खींची जाएगी। लेकिन, जब इस अनेक-से-अनेक संबंध को दो एक-से-अनेक संबंधों में हल किया जाता है, तो हम देखते हैं कि PERSON और CAR के बिना NAMED-DRIVER मौजूद नहीं हो सकता। ये संबंध पहचानने वाले संबंध बन जाते हैं, और इन्हें हाइफ़न से दर्शाया जाएगा, जो एक ठोस रेखा के अनुरूप है:
| मान | उपनाम |
|---|---|
| -- | पहचान |
| .. | गैर-पहचान |
| मान | 别名为 |
|---|---|
| to | पहचान |
| optionally to | गैर-पहचान |
कॉपी करें
एम्बेड
erDiagram
CAR ||--o{ NAMED-DRIVER : allows
PERSON }o..o{ NAMED-DRIVER : is
कॉपी करें
एम्बेड
erDiagram
CAR ||--o{ NAMED-DRIVER : allows
PERSON }o--o{ NAMED-DRIVER : is
एट्रिब्यूट
एंटिटी का नाम निर्दिष्ट करके, उसके बाद कई type name वाला ब्लॉक देकर एंटिटी के लिए एट्रिब्यूट परिभाषित किए जा सकते हैं, जहाँ ब्लॉक एक घुंघराले कोष्ठक {} से घिरा होता है। एट्रिब्यूट एंटिटी बॉक्स के भीतर प्रदर्शित होते हैं, उदाहरण के लिए:
कॉपी करें
एम्बेड
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 मान अक्षर से शुरू होना चाहिए, और इसमें अंक, हाइफ़न, अंडरस्कोर, छोटे कोष्ठक और वर्ग कोष्ठक शामिल हो सकते हैं। name मान type के समान फ़ॉर्मेट का पालन करता है, लेकिन यह तारांकन चिह्न से भी शुरू हो सकता है, जो यह इंगित करने का एक अन्य विकल्प है कि प्रॉपर्टी प्राइमरी की है। इसके अलावा, कोई अन्य प्रतिबंध नहीं है, और कोई निहित वैध डेटा प्रकार समूह भी नहीं है।
एंटिटी उपनाम
एंटिटी में उपनाम जोड़ने के लिए वर्ग कोष्ठक का उपयोग किया जा सकता है। यदि उपनाम प्रदान किया गया है, तो चार्ट में एंटिटी नाम के बजाय उपनाम प्रदर्शित होगा; उपनाम एंटिटी नाम के समान सभी नियमों का पालन करता है।
कॉपी करें
एम्बेड
erDiagram
p[Person] {
string firstName
string lastName
}
a["Customer Account"] {
string email
}
p ||--o| a : has
एट्रिब्यूट कुंजी और टिप्पणी
एट्रिब्यूट में कुंजी या टिप्पणी भी परिभाषित की जा सकती है। कुंजी प्राइमरी की (PK), फ़ॉरेन की (FK) या यूनिक की (UK) हो सकती है। एक ही एट्रिब्यूट पर कई कुंजी बाधाएँ निर्दिष्ट करने के लिए, उन्हें अल्पविराम से अलग करें (उदाहरण: PK, FK)। टिप्पणी एट्रिब्यूट के अंत में दोहरे उद्धरण चिह्नों द्वारा परिभाषित की जाती है; टिप्पणी में दोहरे उद्धरण चिह्न नहीं हो सकते।
कॉपी करें
एम्बेड
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
दिशा
दिशा कथन चार्ट की दिशा घोषित करता है।
TB चार्ट की दिशा ऊपर से नीचे घोषित करता है, और BT इसे उलटकर नीचे से ऊपर कर सकता है।
कॉपी करें
एम्बेड
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 चार्ट की दिशा बाएँ से दाएँ घोषित करता है, और RL इसे उलटकर दाएँ से बाएँ कर सकता है।
कॉपी करें
एम्बेड
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
}
नोड शैली सेट करें
नोड पर विशिष्ट शैली लागू की जा सकती है, जैसे मोटा बॉर्डर या भिन्न बैकग्राउंड रंग।
कॉपी करें
एम्बेड
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
आप एक ही कथन में नोड सूची पर शैली भी संलग्न कर सकते हैं:
कॉपी करें
एम्बेड
style nodeId1,nodeId2 styleList
क्लास
हर बार शैली परिभाषित करने से अधिक सुविधाजनक यह है कि एक शैली क्लास परिभाषित करें और उस क्लास को उन नोड्स पर संलग्न करें जिन्हें अलग रूप चाहिए।
क्लास परिभाषा नीचे दिए गए उदाहरण की तरह है:
कॉपी करें
एम्बेड
classDef className fill:pink,stroke:#333,stroke-width:4px
एक ही कथन में कई क्लास भी परिभाषित की जा सकती हैं:
कॉपी करें
एम्बेड
classDef firstClassName,secondClassName font-size:12pt
क्लास को नोड पर संलग्न करने का सिंटैक्स इस प्रकार है:
कॉपी करें
एम्बेड
class nodeId1 className
आप एक ही कथन में एक क्लास को नोड सूची पर भी संलग्न कर सकते हैं:
कॉपी करें
एम्बेड
class nodeId1,nodeId2 className
आप एक साथ कई क्लास भी संलग्न कर सकते हैं:
कॉपी करें
एम्बेड
class nodeId1,nodeId2 className1,className2
क्लास जोड़ने का आसान तरीका यह है कि ::: ऑपरेटर का उपयोग करके क्लास नाम को नोड पर संलग्न किया जाए, जैसा कि नीचे दिखाया गया है:
कॉपी करें
एम्बेड
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
एंटिटी के बीच संबंध घोषित करने के लिए निम्नलिखित सिंटैक्स का उपयोग किया जा सकता है:
कॉपी करें
एम्बेड
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
class कथन के समान, शॉर्टहैंड सिंटैक्स भी एक बार में कई क्लास लागू कर सकता है:
कॉपी करें
एम्बेड
nodeId:::className1,className2
डिफ़ॉल्ट क्लास
यदि किसी क्लास का नाम default है, तो यह उन सभी क्लासों को सौंपी जाएगी जिनमें विशिष्ट क्लास परिभाषा नहीं है।
कॉपी करें
एम्बेड
classDef default fill:pink,stroke:#333,stroke-width:4px;
नोट: शैली या अन्य क्लास कथनों से आने वाली कस्टम शैलियों को प्राथमिकता मिलती है, और वे डिफ़ॉल्ट शैली को ओवरराइड कर देती हैं। (उदाहरण के लिए, default क्लास नोड के लिए गुलाबी बैकग्राउंड सेट करती है, लेकिन यदि blue क्लास लागू की जाए, तो उस नोड को नीला बैकग्राउंड रंग मिलेगा।)
कॉपी करें
एम्बेड
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
कॉन्फ़िगरेशन
लेआउट
चार्ट का लेआउट render() द्वारा संभाला जाता है, डिफ़ॉल्ट लेआउट ELK लेआउट है, जो बड़े और अधिक जटिल चार्ट के लिए उपयुक्त है।
क्लासिक Dagre लेआउट पर स्विच करने के लिए, आप इसे YAML frontmatter के config में सेट कर सकते हैं
कॉपी करें
एम्बेड
---
config:
layout: dagre
---
Mermaid कोड की सामग्री इस प्रकार है:
कॉपी करें
एम्बेड
---
title: Order example
config:
layout: elk
---
erDiagram
CUSTOMER ||--o{ ORDER : places
ORDER ||--|{ LINE-ITEM : contains
CUSTOMER }|..|{ DELIVERY-ADDRESS : uses