본문으로 건너뛰기

관계

SQLD 목차데이터 모델링의 이해레슨 5 / 35

목차

관계(relationship)는 엔터티의 인스턴스끼리 맺는 연관입니다. 관계선 양 끝의 기호로 몇 개와 짝짓는지(차수)와 짝이 꼭 있어야 하는지(선택성)를 나타냅니다.

사원과 부서를 따로 정의해도 '어느 사원이 어느 부서 소속인가', '부서 없는 사원이 있어도 되는가'는 관계를 그려야 알 수 있습니다.

8단계 중 1단계. 사원 하나와 부서 하나가 맺은 짝을 페어링이라 하고, 이 짝들의 집합이 관계입니다.

1페어링과 관계명

이서연과 20번 부서처럼 인스턴스끼리 맺은 짝 하나가 페어링(pairing)이고, 짝을 모두 모은 것이 관계입니다. 모델에는 짝 대신 선 하나를 긋고, 양쪽에 관계명(membership)을 '소속된다'처럼 현재형 동사로 하나씩 붙입니다. '관계가 있다' 같은 애매한 말은 피합니다.

둘이 있는 것만으로 맺는 '소속된다'는 존재에 의한 관계, 행위가 있어야 생기는 '주문한다'는 행위에 의한 관계입니다. ERD(Entity Relationship Diagram, 엔터티와 관계를 그린 그림)는 둘을 같은 선으로 그립니다. UML(소프트웨어 설계를 그리는 표준 표기법) 클래스 다이어그램은 존재에 의한 관계를 연관 관계(Association, 실선)로, 행위에 의한 관계를 의존 관계(Dependency, 점선)로 나눠 그립니다.

2관계 차수와 선택성

부서 하나에 사원이 여럿이고 사원은 부서 하나에만 속하므로, 관계 차수(cardinality)는 1 : N입니다. 차수에는 1 : 1, 1 : N, M : N이 있습니다. M : N은 짝을 한 줄씩 담는 관계 엔터티(엔터티 레슨의 주문상품 같은)를 사이에 두어 1 : N 둘로 풉니다. 관계 선택사양(optionality), 줄여 선택성은 짝이 꼭 있어야 하는지(필수 참여), 없어도 되는지(선택 참여)입니다.

IE(Information Engineering) 표기는 선 끝마다 기호 둘을 붙입니다. 상자에 붙은 쪽이 최대, 바깥쪽이 최소이고, 여럿을 뜻하는 <를 까마귀발이라 부릅니다. 부서 하나가 사원 몇 명과 짝짓는지는 상대인 사원 쪽 끝에 적습니다.

끝 모양뜻이 관계에서
○<0개 이상사원 쪽 — 40번 부서는 사원 0명
○|0개 또는 1개부서 쪽 — 정하늘은 부서 없음
|<1개 이상사원 쪽 — 부서마다 사원이 꼭 있을 때
||꼭 1개부서 쪽 — 사원마다 부서가 꼭 있을 때

3IE 표기와 바커 표기

바커(Barker) 표기는 선을 두 반쪽으로 나눠, 엔터티마다 자기 쪽 반선을 실선(필수)이나 점선(선택)으로 그립니다. 그래서 같은 규칙이 IE와 반대쪽에 그려집니다.

같은 규칙IE바커
필수 참여상대 쪽 끝에 |자기 쪽 반선이 실선
선택 참여상대 쪽 끝에 ○자기 쪽 반선이 점선
점선의 뜻선 전체 — 비식별 관계(부모의 주식별자가 자식의 주식별자가 아닌 속성으로만 들어가는 관계 — 식별자 레슨에서 자세히)반선 — 선택 참여

바커 상자에서는 DEPTNO·EMPNO에 #(식별자), 꼭 값이 있는 DNAME·ENAME·SAL에 *, 비어도 되는 LOC에 o를 붙입니다. 관계로 받은 DEPTNO·MGR은 관계선이 나타내므로 사원 상자에 적지 않습니다.

4관계 읽기와 그리는 순서

관계는 기준 엔터티를 정해 네 조각으로 읽습니다. 사원이 반드시 부서에 속하는 규칙이라면 '각 사원은 · 한 부서에 · 항상 · 소속된다'입니다. 가운데 두 조각인 '몇 개'와 '항상·때때로'는 기준이 아닌 대상 쪽 끝 기호에서 가져옵니다. 부서가 기준이면 "각 부서는 여러 사원을 때때로 포함한다"이고, 사원 쪽 관계명으로 "각 부서에는 여러 사원이 때때로 소속된다"라고 읽어도 같습니다.

ERD는 엔터티 그리기 → 배치 → 관계 설정 → 관계명 → 관계 차수 → 관계 선택사양 차례로 그립니다. 관계는 업무 설명에서 두 엔터티를 잇는 동사로 찾습니다.

예제

20번 부서에는 사원이 여럿입니다(1 : N의 N 쪽).

SELECT EMPNO,
  ENAME,
  DEPTNO
FROM EMP
WHERE DEPTNO = 20
ORDER BY EMPNO;
EMPNOENAMEDEPTNO
1002이서연20
1003박지호20
1006강도윤20

40번 부서에는 사원이 없습니다(사원 쪽 끝의 ○).

SELECT COUNT(*) AS EMP_CNT
FROM EMP
WHERE DEPTNO = 40;
EMP_CNT
0

부서가 없는 사원이 있습니다(부서 쪽 끝의 ○).

SELECT EMPNO,
  ENAME,
  DEPTNO
FROM EMP
WHERE DEPTNO IS NULL;
EMPNOENAMEDEPTNO
1005정하늘NULL

그래서 실제 모델은 양쪽 모두 선택입니다. '사원은 반드시 부서에 속한다'로 바꾸려고 DEPTNO를 NOT NULL로 고치면 정하늘 때문에 거절됩니다.

SQL로 확인하기
ALTER TABLE EMP
  MODIFY (DEPTNO
    NOT NULL);

ORA-02296(cannot enable - null values found) 오류가 납니다.

시험 포인트

  • 관계 표기의 세 요소는 관계명·관계 차수·관계 선택사양이고, 관계명은 양쪽에 하나씩 둘입니다.
  • 필수·선택을 IE는 상대 쪽 끝에, 바커는 자기 쪽 반선에 그립니다. 위치를 바꾼 보기가 함정으로 나옵니다.
  • 점선은 IE에서 비식별 관계, 바커에서 선택 참여, UML에서 의존 관계입니다.
  • 필수 참여·선택 참여를 필수 관계·선택 관계라고도 부릅니다. 어느 이름으로 나와도 같은 것입니다.
  • ERD에서 관계명은 차수·선택사양보다 먼저 붙입니다.

확인 문제

1. 사원은 주차권을 받지 않거나 한 장만 받고, 주차권은 꼭 한 사원의 것입니다. 이 규칙을 IE 표기로 그릴 때 (가) 사원 쪽 끝과 (나) 주차권 쪽 끝에 올 모양을 ○< · ○| · |< · || 가운데에서 고르세요.

정답

(가) ||, (나) ○|이고, 그리면 [사원] ||──○| [주차권]입니다. 사원 하나가 받는 주차권 수(0장 또는 1장)는 상대인 주차권 쪽 끝에 적습니다. 주차권 하나의 주인 수(꼭 한 명)는 상대인 사원 쪽 끝에 적습니다. (가)와 (나)를 바꿔 골랐다면 기호를 자기 쪽 끝에 적은 것입니다.

2. 바커 표기에서 사원 쪽 반선은 점선, 부서 쪽 반선은 실선이고, 사원 쪽 끝에 까마귀발이 있습니다. 이 관계를 두 문장으로 읽으세요.

정답

"각 사원은 한 부서에 때때로 소속된다." "각 부서는 여러 사원을 항상 포함한다."

사원 쪽 점선은 사원이 부서 없이 있을 수 있다는 뜻이고, 부서 쪽 실선은 부서마다 사원이 꼭 있다는 뜻입니다.

3. 다음 두 관계를 존재에 의한 관계와 행위에 의한 관계로 나누고, UML 클래스 다이어그램에서 (나)를 실선과 점선 가운데 무엇으로 그리는지 답하세요.

  • (가) 상품은 상품분류에 속한다.
  • (나) 회원은 도서를 대출한다.
정답

(가) 존재, (나) 행위이고, UML에서 (나)는 점선입니다. 상품은 아무 일이 없어도 분류에 들어 있지만, 대출 관계는 회원이 책을 빌려야 생깁니다. UML은 행위에 의한 관계를 의존 관계로 그리고, 의존 관계가 점선입니다.

끝까지 내려오면 저절로 표시됩니다. 이 기기에만 저장합니다.

SQLD 목차로