본문 바로가기

CS/데이터베이스

[DB] crow feet notation

엔티티 사이의 관계를 표현할 때 사용하는 방법에는 여러가지가 있을 수 있다. 여기에 대해서는 ER Model에 대해 설명하는 과정에서 예전에 내가 써둔 글이 있어서 첨부한다.

https://blaxsior-repository.tistory.com/104

 

[데이터베이스 03] Entity Relationship Model

하나의 프로그램을 설계할 때는 어플리케이션 디자인 및 데이터베이스 디자인이 필요하다. 이때 수행되는 데이터베이스 디자인은 엄밀하게 따지면 분석(analysis) 및 디자인(design) 작업을 포함하

blaxsior-repository.tistory.com

Chen notation / min-max notation

위 글에 기록한 내용에 따르면 우리는 최소 2개의 표기법을 알고 있다.

  1.  chen notation
    1. 1개의 AN개의 B와 R 관계를 가진다.
    2. partition(관계 참여 여부, 2줄이면 mandatory) 및 cardinality를 이용하여 관계를 표현한다.
  2. min-max notation
    1. A는 최소 1, 최대 1의 B와 관계 R을 가진다.
      B는 최소 3, 최대 N의 B와 관계 R을 가진다.
    2. min-max notation, A와 B 간의 관계를 정확하게 표현하기 좋다.

위 표기법이 나쁜 것은 아니지만, 엔티티와 속성을 따로 표기하며 관계를 마름모(diamond) 형식으로 표현하기 때문에 전체 ERD를 구성하는데 많은 공간을 차지한다. 이에 따라 데이터베이스 규모가 복잡해질 수록 이해하기 어려워지는 경향이 있다. 따라서 엔티티 사이의 관계를 표현하는 경우에는 보통 다른 방식을 많이 사용한다.

매우 복잡한 ER 다이어그램:https://www.datasciencecentral.com/intro-to-the-e-r-diagram/

아... 위 다이어그램은 보기만 해도 아찔해진다. 엔티티와 사이 관계를 파악하기만 해도 복잡한데, 속성을 모두 묘사하기 시작하면서 가독성이 끝장난 형태가 나와버렸다. 대충 봐도 알겠지만, 개념적으로 이해할 때는 위 표기법이 좋을지 몰라도 실제로 사용하기에는 무리수가 있다.


Crow's foot notation

ER 다이어그램이라고 구글에 검색하면 아래와 같은 표기법도 많이 볼 수 있을 것이다.

mysql workbench에서 기본 제공 DB를 ER로 구성한 모습

위 표기법은 E-R 다이어그램을 표현하는 다른 방식 중 하나인 crow's foot notation이다. 모양이 마치 까마귀의 발처럼 생겼다고 해서 이런 이름을 붙였다는데, 확실히 카툰 만화의 새 발처럼 생긴 것 같긴 하다.

crow's foot 표기법의 특징 중 하나는 관계 및 카디널리티를 하나의 선만으로 표현할 수 있다는 점이다. 위 언급한 2개 방식의 경우 관계를 표기하기 위해 마름모를, 연결을 표현하기 위해 실선을, 카디널리티를 표현하기 위해 숫자를 따로 사용해야 하므로 표현이 복잡하고 가독성이 떨어진다.

반면, crow's foot 표기법은 3가지 요소를 하나의 선과 막대기 정도로 전부 표현이 가능하다. 속성은 테이블 형태로 모아서 표현하며, FK, PK, UK 등의 정보 역시 밑줄 같은 그림으로 표현하는 대신 각 속성 옆에 표기하므로 이해하기 쉽다. 이러한 간결함에 의해 실제로 엔티티 사이 관계를 묘사할 때 crow's foot을 많이 사용하는 것 같다.

표기법에 대한 설명은 다음과 같다.

crow's foot notation

  • 원: 0을 의미
  • 선: 1을 의미
  • 새 발: N을 의미

기본적으로 위 3개 기호를 기반으로 카디널리티를 표현한다. 맨 위 2줄의 표현법을 자주 사용한다.

  • optional one( o| ): 0 또는 1로 관계에 참여
  • mandatory one( || ): 반드시 1개로 관계에 참여
  • optional many( o{ ): 0이상으로 관계에 참여
  • mandatory many( |{ ): 1이상으로 관계에 참여

해석 방식은 chen notation과 동일하게 하면 된다.

Chen 표기법과 crow's foot 표기법의 관계

위 그림에서 A와 B는 =으로 선이 표기되어 있으므로 관계에 필수적으로 참여한다. 카디널리티의 경우 1 : N이므로, A와 B는 필수적으로 관계에 참여하며, 그 관계는 1대 N 비율임을 알 수 있다.

crow's foot 표기법에서도 표현 방식이 다를 뿐 해석 방법은 동일하다. mandatory + 1의 정보는 || 으로, mandatory  + N의 정보는 |{ 으로 표현되며, 동일하게 A와 B가 필수로 참여하되, 1대 N 비율이라는 의미가 된다.

Github README.md 파일 내에서 그래프 표현에 사용될 수 있는 mermaid.js에서도 crow's foot 표기법에 따른 ERD를 제공한다. 작성법은 대략 아래와 같다.

```mermaid
---
title: 상세 구조
---
erDiagram
  User {
    int id PK "AUTO_INC"
    string login_id "[5..20]"
    string email UK "email 포맷"
    string name "[2..20]"
    string password "[8..20]"
    date createdAt "유저 생성 시 자동 생성"
    date updatedAt "유저 업데이트 시 자동 갱신"
  }

  Channel {
    string chan_id PK "param 부분"
    string name "채널 이름"
    string description "채널에 대한 간략한 설명"
    date createdAt "채널 생성일, 자동 생성"
    date updatedAt "채널 정보 갱신일"
  }

  Admin {
    int id PK
    int admin_id FK "어드민 유저의 ID"
    string chan_id FK "채널 ID"
    string type "어드민 타입"
  }

  Category {
    int id PK "AUTO_INC"
    string chan_id FK "채널 ID"
    string name "카테고리 이름" 
  }

  Article {
    int id PK "AUTO_INC"
    string chan_id FK "채널 ID"
    string cat_id FK "카테고리 ID"
    string user_id FK "유저 ID"
  }

  Comment {
    int id PK "AUTO_INC"
    string content "댓글 내용"
    int user_id FK "유저 ID"
    int article_id "글 ID" 
    date createdAt
    date updatedAt
    int p_comment_id FK "부모 댓글 ID"
  }

  User ||--o{ Admin: "존재"
  User ||--o{ Article: "작성"
  User ||--o{ Comment: "작성"
  Channel |o--|{ Admin: "보유"
  Channel ||--o{ Category: "보유"
  Channel ||--o{ Article: "보유"
  Category ||--o{ Article: "보유"
  Article ||--o{ Comment: "보유"
  Comment ||--o| Comment: "참조 댓글"
```

vscode 확장을 이용하여 위 다이어그램을 표현한 모습

 crow's 표기법은 정확한 카디널리티(3 : N 등의 경우)가 필요한 상황에서는 min-max notation을 완벽히 대체하지 못한다. 그러나 많은 상황에서 chen, min-max 표기법보다 가독성 있게 표현할 수 있다는 부분에서 좋다고 생각한다.