ERD 표기법 — 선을 읽는 법
까마귀발, 바커, 첸이 같은 관계를 서로 다르게 그립니다. 각 기호가 무엇을 뜻하고 어느 것을 쓸지 정리했습니다.
선 하나가 두 가지를 말한다
관계선은 서로 다른 두 질문에 답하는데, ERD 를 읽을 때 생기는 혼란은 대부분 이 둘을 하나로 읽는 데서 옵니다. 첫째는 카디널리티 — 이쪽 행 몇 개가 저쪽 한 행과 짝이 되는가. 둘째는 선택성 — 아예 없어도 되는가.
까마귀발 표기법은 둘을 선의 같은 끝에 몰아 둡니다. 기호가 늘 짝으로 오는 이유가 그것입니다. 상자에 가까운 기호가 카디널리티, 그 바로 앞이 선택성입니다. 바깥에서 안으로 읽는 것, 그것이 전부입니다.
| 기호 | 뜻 | 읽는 법 |
|---|---|---|
| 세로줄 하나 | 정확히 하나 | 하나, 오직 하나 |
| 까마귀발 | 여럿 | 하나 이상 |
| 동그라미 | 선택 | 없어도 됨 |
| 동그라미 + 까마귀발 | 0 또는 여럿 | 없거나, 하나거나, 여럿 |
| 세로줄 + 까마귀발 | 1 이상 | 적어도 하나 |
| 동그라미 + 세로줄 | 0 또는 1 | 없거나, 정확히 하나 |
| 세로줄 + 세로줄 | 정확히 하나 | 필수이고 하나뿐 |
어느 끝에 무슨 기호를 다나
기호는 자기가 닿아 있는 상자를 설명합니다. 고객–주문 선에서 주문 쪽에 까마귀발이 있으면 "고객 하나에 주문이 여럿" 이지 "주문 하나에 고객이 여럿" 이 아닙니다. 처음에는 거꾸로 읽히고, 손으로 그린 다이어그램에서 가장 흔한 실수가 이것입니다.
확인하는 방법이 있습니다. 선의 한쪽 끝을 가리고, 보이는 상자에서 시작해 소리 내어 읽어 보세요. "고객 하나에 주문이 0개 이상 있다." 그다음 반대쪽을 가립니다. "주문 하나는 정확히 고객 하나에 속한다." 두 문장이 다 참이면 기호가 제자리에 있습니다.
까마귀발·바커·첸
아직 쓰이는 표기법이 셋인데, 무엇을 담을지가 아니라 어디에 담을지에서 갈립니다.
| 까마귀발(IE) | 바커 | 첸 | |
|---|---|---|---|
| 카디널리티 | 선 끝의 기호 | 선 끝의 기호 | 선 위에 숫자 |
| 선택성 | 선 끝의 동그라미 | 점선 반쪽 | (0,n) 으로 표기 |
| 다대다 | 바로 그리고 나중에 푼다 | 바로 그린다 | 상자 사이에 마름모 |
| 속성 | 상자 안에 나열 | 상자 안에 나열 | 상자에 타원을 붙임 |
| 주로 쓰는 곳 | 대부분의 현대 도구 | 오라클 문서 | 교과서와 과제 |
도구들이 까마귀발을 기본으로 삼는 이유는 모든 정보가 선 끝에 있어서 상자가 수백 개인 도면에서도 버티기 때문입니다. 첸은 다대다가 눈에 보이는 제3의 무언가라 가르치기에 좋지만, 타원 때문에 작은 스키마도 한 페이지를 씁니다.
식별 관계와 비식별 관계
실선은 자식이 부모 없이 존재할 수 없고 부모의 키가 자식의 기본키 안에 들어간다는 뜻입니다. 점선은 자식이 부모를 참조만 한다는 뜻입니다. 앞의 예는 주문 품목 — 주문 없는 품목은 아무것도 아닙니다 — 이고, 뒤의 예는 주문의 배송 주소입니다.
실제로는 대부분의 도구가 전부 실선으로 그리고 구분은 키 정의에 남습니다. 도면이 둘을 구분하지 않으면 외래키가 기본키의 일부인지 보세요. 같은 정보입니다.
다대다를 읽는 법
양쪽 끝이 다 까마귀발이면 그 관계는 살 곳이 없다는 뜻입니다. 개념 도면에서는 정당하지만 관계형 데이터베이스에서는 불가능해서, 그 사이 어딘가에서 연결 테이블이 생깁니다 — 쌍마다 한 행, 외래키 둘이 함께 키가 되는 형태입니다.
눈여겨볼 순간은 그 연결 테이블에 자기 컬럼이 생길 때입니다. 누가 언제 태그를 달았는지까지 담는 글–태그 연결 테이블은 더 이상 조인이 아니라 개체이고, post_tags 가 아니라 자기 이름을 가질 자격이 있습니다.
자주 묻는 것
- 어느 표기법을 써야 하나요?
- 첸으로 내라는 과제가 아니라면 까마귀발입니다. 현대 도구가 전부 그렇게 그리고, 대부분의 엔지니어가 범례 없이 읽으며, 테이블이 백 개인 도면에서도 읽힙니다.
- 관계선의 동그라미는 무슨 뜻인가요?
- 0 입니다 — 그쪽이 선택이라는 뜻입니다. 동그라미와 까마귀발이 같이 있으면 0 또는 여럿이고, 동그라미와 세로줄이면 0 또는 1 인데 선택적 일대일을 그렇게 그립니다.
- 연결 테이블을 도면에 그려야 하나요?
- 물리 도면이라면 그렇습니다. 데이터베이스에 실제로 있으니까요. 개념 도면에서는 다대다를 바로 긋고 나중에 풀어도 됩니다. 다만 일찍 그리는 편이 대개 낫습니다 — 연결 테이블이 자기 컬럼을 원한다는 것을 그때 알아차리게 됩니다.
- 실선과 점선 관계선의 차이는요?
- 실선은 식별 관계로, 자식의 기본키에 부모의 키가 들어가고 자식이 혼자 존재할 수 없습니다. 점선은 비식별 관계로 참조만 합니다. 도구가 전부 실선으로 그린다면 외래키가 기본키의 일부인지 확인하세요.
- 기호가 자꾸 거꾸로 읽힙니다
- 각 기호가 선 건너편이 아니라 자기가 닿은 상자를 설명하기 때문입니다. 양쪽 끝을 각각 가까운 상자에서 시작하는 문장으로 읽으면 둘 다 맞게 나옵니다.