Search
moon
sun

05.관계와 조인의 이해 · 모델이 표현하는 트랜잭션의 이해

•
계층 관계 · 순환 관계 · 상호배타적 관계를 ERD에서 구분할 수 있다.
•
관계의 차수와 선택사양이 조인 결과 건수를 어떻게 바꾸는지 설명할 수 있다.
•
트랜잭션의 원자성을 설명할 수 있다.
•
ERD의 관계선만 보고 "어디까지가 하나의 트랜잭션인지" 읽어낼 수 있다.

1. 관계의 종류

1) 세 가지 특수한 관계

관계
정의
실습 스키마/실무 예시
특징
계층 관계
같은 성격의 엔터티가 여러 단계로 이어짐
부서 → 하위부서, 상품분류
깊이가 정해지지 않음
순환 관계
엔터티가 자기 자신과 맺는 관계
EMP.MGR → EMP.EMPNO
셀프 조인 필요
상호배타적 관계
여러 부모 중 하나와만 관계를 맺음
결제수단: 카드 or 계좌
한쪽 FK만 값이 있고 나머지는 NULL

2) 순환 관계 — 사원과 관리자 ⭐

EMP 테이블의 MGR(관리자)는 같은 EMP 테이블의 EMPNO 를 가리킵니다.
사원번호
사원명
직무
MGR (관리자 사원번호)
관리자명
7839
KING
PRESIDENT
(NULL)
— (최상위)
7566
JONES
MANAGER
7839
KING
7788
SCOTT
ANALYST
7566
JONES
7876
ADAMS
CLERK
7788
SCOTT
⭐ 순환 관계의 두 가지 특징
1.
최상위 인스턴스는 FK가 NULL 이다 (KING) → 반드시 선택적 관계
2.
조회하려면 같은 테이블을 두 번 사용해야 한다 = 셀프 조인

3) 상호배타적 관계 (Arc) ⭐

"둘 중 하나만" — 한 자식이 여러 부모 중 오직 하나와만 관계를 맺는 구조
주문번호
개인고객번호
법인고객번호
판정
O001
C10
(NULL)
✅ 개인고객 주문
O002
(NULL)
B20
✅ 법인고객 주문
O003
C11
B21
❌ 둘 다 있으면 안 됨
O004
(NULL)
(NULL)
❌ 둘 다 없으면 안 됨
⚠️ 상호배타적 관계에서는 FK 중 정확히 하나만 값을 가져야 하므로, 나머지 FK는 반드시 NULL 허용(선택적 관계) 으로 설계됩니다.

2. 관계가 조인 결과를 결정한다 ⭐⭐⭐

🔥 핵심입니다. "조인했더니 왜 행이 늘었지?"의 답이 전부 여기 있습니다.

1) 차수(Cardinality)별 조인 결과 건수

관계 차수
조인 결과 건수
이유
1 : 1
매칭되는 건수만큼 (늘어나지 않음)
짝이 하나씩만 있음
1 : M
M쪽 건수만큼
1쪽 데이터가 M번 반복됨 ⚠️
M : N
교차 엔터티 건수만큼
양쪽 모두 반복됨

2) 1:M 조인 — 1쪽 데이터가 반복된다 ⭐

[DEPT] 4건
부서번호
부서명
10
ACCOUNTING
20
RESEARCH
30
SALES
40
OPERATIONS
[EMP] 14건 (일부)
사원번호
사원명
부서번호
7782
CLARK
10
7369
SMITH
20
7566
JONES
20
7499
ALLEN
30
조인 결과 — 부서명이 사원 수만큼 반복된다
사원명
부서번호
부서명
CLARK
10
ACCOUNTING
SMITH
20
RESEARCH
JONES
20
🔁 RESEARCH
ALLEN
30
SALES
⭐ 결과 건수 = 14건 (EMP 건수), DEPT 건수(4)가 아닙니다. 1:M 조인의 결과 건수는 항상 M쪽 건수입니다.
select * from DEPT d join EMP e on d.deptno = e.deptno # 결과는 14건
SQL
복사

3) 선택사양이 결과 건수를 바꾼다 ⭐⭐

DEPT 40번(OPERATIONS)에는 소속 사원이 하나도 없습니다.
조인 방식
결과 건수
40번 부서
언제 쓰나
INNER JOIN
14건
❌ 사라짐
양쪽 다 있는 것만 필요할 때
OUTER JOIN (DEPT 기준)
15건
✅ 사원명 NULL로 표시
"사원이 없는 부서도 보여줘" 일 때
-- INNER JOIN : 짝이 있는 것만 → 14건 SELECT D.DNAME, E.ENAME FROM DEPT D, EMP E WHERE D.DEPTNO = E.DEPTNO; -- OUTER JOIN : 짝이 없어도 DEPT는 전부 → 15건 SELECT D.DNAME, E.ENAME FROM DEPT D, EMP E WHERE D.DEPTNO = E.DEPTNO(+); -- (+) 는 '부족한 쪽'인 EMP 에 붙인다
SQL
복사
OUTER JOIN 결과의 마지막 행
부서명
사원명
ACCOUNTING
CLARK
…
…
OPERATIONS
(NULL) ← 사원이 없어도 부서는 나온다 ✅

4) 모델의 관계선 → 조인 종류 매핑표 ⭐⭐

1과목의 관계 표기가 곧 2과목의 조인 선택으로 이어집니다.
모델(ERD)에서
물리적으로는
SQL에서는
필수 관계 (●)
FK가 NOT NULL
INNER JOIN으로 충분
선택 관계 (○)
FK가 NULL 허용
OUTER JOIN 필요 ⚠️
1:M 관계
M쪽에 FK
결과 건수 = M쪽 건수
M:N 관계
교차 엔터티 경유
테이블 3개 조인 (조인 조건 2개)
순환 관계
자기 테이블 참조
셀프 조인 (별칭 2개)
상호배타적 관계
FK 여러 개 중 하나만 값
조건 분기 필요 (CASE, UNION)
⚠️ 가장 흔한 실수 "조인했더니 원래 데이터보다 행이 많아졌다" → 1:M 조인에서 1쪽이 반복된 것입니다. 정상입니다. "조인했더니 행이 줄었다" → 선택적 관계인데 INNER JOIN 을 쓴 것입니다. 이건 버그입니다.

3. 계층 관계와 셀프 조인

1) 순환 관계를 조회하려면 같은 테이블을 두 번 쓴다

SELECT E.ENAME AS 사원, M.ENAME AS 관리자 FROM EMP E, -- 별칭 E = 사원 역할 EMP M -- 별칭 M = 관리자 역할 (같은 테이블!) WHERE E.MGR = M.EMPNO(+); -- 최상위(KING)도 보이도록 OUTER JOIN
SQL
복사
사원
관리자
비고
SMITH
FORD
JONES
KING
KING
(NULL)
최상위 — OUTER JOIN 이라 살아남음 ✅
⭐ 02강 「같은 테이블이라도 역할이 다르면 다른 별칭으로 여러 번 조인」 과 같은 원리입니다. SCHEDULE 에서 TEAM 을 홈팀/원정팀으로 두 번 조인한 것과 똑같습니다.

2) 셀프 조인의 한계 — 깊이가 정해져야 한다

알고 싶은 것
셀프 조인으로 가능?
사원의 직속 관리자
✅ 조인 1번
사원의 관리자의 관리자
✅ 조인 2번
사원의 최상위까지 전체 경로
❌ 깊이를 모르면 불가능
💡 깊이를 모르는 계층 구조는 계층형 질의(CONNECT BY) 로 풀어야 합니다. → 2과목 계층형 질의(쿼리)에서 다룹니다.

4. 트랜잭션이란

1) 정의와 원자성

•
트랜잭션(Transaction): 업무적으로 하나의 단위로 처리되어야 하는 작업의 묶음
•
핵심 성질 = 원자성(Atomicity) — 전부 성공하거나, 전부 취소되거나. 중간은 없다.
상황
처리
이유
①②가 모두 성공
COMMIT (확정)
정상 이체 완료
①은 성공, ②가 실패
ROLLBACK (전체 취소)
①만 남으면 돈이 사라진다 ⚠️
⭐ 만약 ①만 저장되고 끝난다면 A계좌에서는 돈이 빠졌는데 B계좌에는 안 들어옵니다. "부분 성공"이 허용되지 않는 것이 트랜잭션의 본질입니다.

5. 모델이 표현하는 트랜잭션의 이해 ⭐⭐⭐

1) 핵심 원리

ERD의 관계선(필수 / 선택)이 곧 트랜잭션의 범위를 알려준다.
관계
트랜잭션 범위
이유
필수 관계 (양쪽 다 ●)
반드시 하나의 트랜잭션
한쪽만 저장되면 모델 규칙 위반
선택 관계 (한쪽 ○)
분리 가능
상대가 없어도 존재할 수 있음

2) 필수 관계 = 하나의 트랜잭션 ⭐

시도
허용?
이유
주문 + 주문상세를 함께 입력
✅
정상
주문만 입력하고 상세는 나중에
❌
상품 없는 주문이 존재하게 됨
주문상세만 입력
❌
주문 없는 상세는 존재할 수 없음
주문 삭제 시 상세도 함께 삭제
✅
필수 관계이므로 당연
⭐ 03강에서 배운 식별관계(주문상세 PK = 주문번호 + 순번)가 곧 "필수 관계" 이고, 필수 관계는 곧 "하나의 트랜잭션" 입니다. 세 개념이 연결됩니다.

3) 선택 관계 = 분리 가능한 트랜잭션

시도
허용?
이유
사원만 등록
✅
교육을 안 받은 사원도 있을 수 있음
나중에 교육이력만 추가
✅
별개의 업무 행위
교육이력만 등록 (사원 없이)
❌
사원 쪽은 필수이므로

4) 모델을 보고 트랜잭션 범위를 읽는 연습 ⭐

관계
선택사양
트랜잭션 판정
주문 ─ 주문상세
필수 ─ 필수
🔒 하나의 트랜잭션
사원 ─ 부서
필수 ─ 선택
🔓 부서 등록과 사원 등록은 별개
회원 ─ 회원상세정보 (1:1 필수)
필수 ─ 필수
🔒 하나의 트랜잭션
고객 ─ 주문
선택 ─ 필수
🔓 고객만 가입해도 됨
경기장 ─ 팀
필수 ─ 선택
🔓 경기장만 등록 가능
⚠️ 시험 함정"1:1 관계면 항상 하나의 트랜잭션" → 오답입니다. 1:1이어도 한쪽이 선택이면 분리할 수 있습니다. 차수가 아니라 선택사양이 기준입니다.

5) 트랜잭션을 잘못 잡으면 생기는 일

잘못된 처리
결과
필수 관계를 분리해서 처리
주문만 있고 상세가 없는 불완전 데이터 발생
선택 관계를 묶어서 처리
교육이력이 없으면 사원 등록 자체가 실패 → 불필요한 제약

6. 출제 포인트 한눈에 정리

#
꼭 외울 것
핵심
1
관계의 특수 형태
계층 / 순환 / 상호배타적(Arc)
2
순환 관계
자기 테이블 참조 → 셀프 조인, 최상위는 FK가 NULL
3
상호배타적 관계
FK 여러 개 중 정확히 하나만 값을 가짐
4
1:M 조인 결과 건수
M쪽 건수 (1쪽이 반복됨)
5
필수 관계
FK NOT NULL → INNER JOIN으로 충분
6
선택 관계
FK NULL 허용 → OUTER JOIN 필요
7
조인 후 행이 줄었다
선택적 관계인데 INNER JOIN 을 쓴 것 = 버그
8
트랜잭션의 원자성
전부 성공 or 전부 취소 (부분 성공 없음)
9
필수 ─ 필수 관계
🔒 하나의 트랜잭션
10
트랜잭션 판정 기준
차수(1:1, 1:M)가 아니라 선택사양(필수/선택) ⭐

7. 확인 문제

Q1. 1:M 관계인 TEAM(15건)과 PLAYER(480건)를 조인하면 결과는 몇 건인가?
정답 보기
Q2. 순환(자기참조) 관계의 특징으로 옳지 않은 것은? ① 같은 테이블을 두 번 사용하는 셀프 조인이 필요하다 ② 최상위 인스턴스는 외래키가 NULL이다 ③ 반드시 필수 관계로 설계해야 한다 ④ EMP의 MGR 컬럼이 대표적인 예다
정답 보기