💡 핵심 인사이트
다치 종속성(MVD)은 BCNF까지 완벽하게 정규화를 마쳐 단 1개의 이상한 결정자도 없는 깔끔한 테이블에서, 서로 아무런 상관도 없는 독립적인 '다중값 속성(예: 취미, 자격증)' 2개를 한 테이블에 우겨 넣었을 때 기형적으로 발생하는 데이터의 폭발적 중복 현상입니다.
$X \twoheadrightarrow Y$ 기호로 쓰며, 이를 찢어버리는 수술이 **제4정규형(4NF)**입니다.
Ⅰ. 다치 종속성의 발생 조건 (1타 2피의 저주)
다치 종속성은 속성이 3개 이상인 테이블에서, X의 값 하나에 대해 Y의 값이 "여러 개(Multi-Valued)" 존재하고, Z의 값도 "여러 개" 존재하는데, Y와 Z는 서로 완전 남남인 관계일 때 발생합니다.
[ 개발자 이력서 테이블 (BCNF 만족) ]
- 속성:
( [사원, 프로그래밍언어, 취미] (3개가 묶인 복합 기본키) )
| 사원 (X) | 프로그래밍 언어 (Y) | 취미 (Z) |
|---|---|---|
| 김철수 | Java | 등산 |
| 김철수 | Java | 수영 |
| 김철수 | Python | 등산 |
| 김철수 | Python | 수영 |
[ 종속성 X-Ray 분석 ]
- 김철수(X)는 'Java'와 'Python'이라는 2개의 언어(Y)를 할 줄 압니다. ($X \twoheadrightarrow Y$)
- 김철수(X)는 '등산'과 '수영'이라는 2개의 취미(Z)를 가집니다. ($X \twoheadrightarrow Z$)
- 그런데 'Java를 짜는 것'과 '등산' 사이에는 아무런 논리적 연관성(종속성)이 없습니다. (완전 남남).
Ⅱ. 다치 종속성의 참상 (이상 현상 폭발)
이 독립적인 두 개의 다중값을 한 테이블에 우겨 넣으려다 보니, 데이터베이스는 어쩔 수 없이 **모든 경우의 수(곱하기, Cartesian Product)**를 다 만들어서 행(튜플)으로 채워 넣어야 합니다.
- 중복의 폭발: 김철수가 언어 2개, 취미 2개를 가지면 테이블에는 $2 \times 2 = 4$줄이 낭비되며 들어갑니다. 만약 철수가 C++ 언어를 하나 더 배우면?
(철수, C++, 등산)과(철수, C++, 수영)2줄을 동시에 억지로 INSERT 해야만 일관성이 유지되는 삽입 이상이 터집니다. 하나라도 안 넣으면 데이터 모순이 됩니다. - 삭제 이상: 철수가 수영을 그만두었습니다. 수영을 지우려다 보니 Java와 Python 줄 2개를 다 찾아서 지워야 하는 번거로움과 위험성이 생깁니다.
이 끔찍한 현상을 **"Y와 Z가 서로 무관한데 X를 매개로 억지로 묶여, X에 대해 다중값 종속을 가진다 ($X \twoheadrightarrow Y \mid Z$)"**라고 표현합니다.
Ⅲ. 해결책: 제4정규형 (4NF)
해결책은 늘 똑같습니다. 연관성 없는 놈들을 같이 살게 두지 말고 아예 원룸 2개로 찢어서 방을 빼줍니다.
[ 4NF 수술 후 분해 결과 ] 테이블을 두 개로 쪼개어 무관한 Y와 Z를 격리 시킵니다.
- 개발자_언어 테이블:
( [사원, 프로그래밍언어] )- (김철수, Java), (김철수, Python) ➔ 단 2줄로 끝남.
- 개발자_취미 테이블:
( [사원, 취미] )- (김철수, 등산), (김철수, 수영) ➔ 단 2줄로 끝남.
- 결과: 총 4줄로 쪼그라들었으며, 김철수가 C++을 배우면 1번 테이블에 딱 1줄만 INSERT 하면 완벽하게 끝납니다. 더 이상 카테시안 곱으로 인한 중복 지옥(다치 종속)이 사라졌습니다!
📢 섹션 요약 비유: 다치 종속성(MVD)은 한 직원의 '사내 동호회 명단(취미)'과 '보유 자격증 명단(언어)'을 억지로 엑셀 표 하나에 모조리 곱해서 짬뽕해 놓은 미친 행정입니다. 자격증과 동호회는 아무 상관이 없는데 억지로 엮어놔서, 자격증을 하나 딸 때마다 가입된 동호회 개수만큼 엑셀 줄을 복사 붙여넣기(중복) 해야 합니다. 제4정규형은 이를 쿨하게 "동호회 장부 따로, 자격증 장부 따로 관리해!"라고 엑셀 탭을 2개로 쪼개어 행정의 효율(무중복)을 되찾아주는 수술입니다.