플로우차트
그래픽 표현
마인드맵
구조화된 표현
노트
효율적인 표현

ER 다이어그램구문

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 다이어그램에 속성을 포함할 때, 외래 키를 속성으로 포함할지 여부를 결정해야 하며, 이는 관계 테이블 구조를 얼마나 표현하고 싶은지에 따라 달라질 수 있습니다. 다이어그램이 논리 모델이고 관계 구현을 암시할 의도가 없다면, 연관 관계가 이미 엔티티 간의 연관 방식을 전달하므로 이러한 속성을 포함하지 않는 것이 좋습니다. 예를 들어 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| 0 또는 1
|| || 정확히 하나
}o o{ 0개 이상(상한 없음)
}| |{ 하나 이상(상한 없음)
별칭
값(왼쪽) 값(오른쪽) 의미
one or zero one or zero 0 또는 1
zero or one zero or one 0 또는 1
one or more one or more 하나 이상
one or many one or many 하나 이상
many(1) many(1) 하나 이상
1+ 1+ 하나 이상
zero or more zero or more 0개 이상
zero or many zero or many 0개 이상
many(0) many(0) 0개 이상
0+ 0+ 0개 이상
only one only one 정확히 하나
1 1 정확히 하나

식별

관계는 식별 관계와 비식별 관계로 나눌 수 있으며, 각각 실선 또는 점선으로 렌더링됩니다. 이는 한 엔티티가 다른 엔티티 없이 독립적으로 존재할 수 없을 때 중요합니다. 예를 들어 사람이 자동차를 운전하는 것에 대한 보험을 제공하는 회사는 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;

참고: 스타일이나 다른 class 문에서 온 사용자 정의 스타일이 우선하며 기본 스타일을 덮어씁니다. (예: 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