400. 제4정규형 (4NF)과 다치 종속 (Multi-Valued Dependency)

⚠️ 이 문서는 BCNF까지 마쳐서 일반적인 함수 종속 문제가 다 사라진 깨끗한 테이블에서도, **하나의 기본 키(PK)에 서로 아무런 관련이 없는 두 개의 '다중값(리스트)'이 억지로 묶여있을 때 발생하는 끔찍한 데이터 폭발 현상을 막아내는 제4정규형(4NF)**을 다룹니다.

핵심 인사이트 (3줄 요약)

  1. 본질: 다치 종속(MVD)은 A값이 정해지면 B값이 딱 하나로 떨어지는 게 아니라 여러 개(집합)로 나타나고, C값도 여러 개로 나타나는데, B와 C가 서로 아무 상관이 없는 상태를 말한다. ($A \twoheadrightarrow B$, $A \twoheadrightarrow C$)
  2. 문제점: 이 상태로 테이블을 만들면, B값의 개수와 C값의 개수를 곱한 것만큼 행(Row)이 무식하게 뻥튀기되는 '카테시안 곱(Cartesian Product)' 현상이 발생한다.
  3. 해결책: 서로 남남인 B와 C를 같은 식탁에 앉히지 말고, [A, B] 테이블과 [A, C] 테이블로 두 개로 찢어버리면(분리) 완벽한 제4정규형이 달성된다.

Ⅰ. 개요: 끔찍한 데이터 뻥튀기 (Context & Necessity)

"김철수"라는 개발자가 있다.

  • 철수가 할 줄 아는 프로그래밍 언어(A): Java, Python (2개)
  • 철수가 취미로 하는 운동(B): 축구, 수영, 등산 (3개)

이걸 하나의 테이블 개발자_테이블(이름, 언어, 취미)에 다 구겨 넣으면 어떻게 될까? (기본 키는 이름+언어+취미 3개 다 합쳐야 함) 언어(2개) $\times$ 취미(3개) = 총 6줄의 데이터가 만들어진다.

이름 (PK)언어 (PK)취미 (PK)
김철수Java축구
김철수Java수영
김철수Java등산
김철수Python축구
김철수Python수영
김철수Python등산

여기서 철수가 Go 언어를 하나 더 배우면? 데이터를 무려 3줄이나 더 Insert 해야 한다. 만약 철수의 취미가 10개였다면 10줄을 Insert 해야 한다. 언어와 취미는 서로 아무런 관련이 없는 남남인데, 한 테이블에 묶어놨다는 이유만으로 억지로 짝꿍을 지어주며 데이터가 폭발하는 현상, 이것이 **다치 종속(MVD)**이다.

📢 섹션 요약 비유: 다치 종속은 '아빠의 직업'과 '아빠의 넥타이 색깔'을 억지로 짝지어 기록하는 것과 같습니다. 아빠가 직업이 2개(투잡)고 넥타이가 10개면, 20개의 쓸데없는 조합이 생겨나죠. 직업은 직업대로, 넥타이는 넥타이대로 따로 적어두는 것이 훨씬 똑똑한 정리법(4NF)입니다.


Ⅱ. 다치 종속 (MVD)의 수학적 이해 ★

다치 종속은 화살표 두 개($\twoheadrightarrow$)로 표시한다.

  • 이름 $\twoheadrightarrow$ 언어 (이름을 알면 언어 '집합'을 알 수 있다)
  • 이름 $\twoheadrightarrow$ 취미 (이름을 알면 취미 '집합'을 알 수 있다)

제4정규형(4NF)의 조건:

  • 테이블에 다치 종속 A $\twoheadrightarrow$ B가 존재한다면, A는 반드시 이 테이블의 '후보 키'여야 한다.
  • 만약 위 테이블처럼 A, B, C가 모두 합쳐져야만 후보 키(PK)가 되는 상황에서 A $\twoheadrightarrow$ B, A $\twoheadrightarrow$ C가 성립한다면 4NF 위반이다.

Ⅲ. 4NF 달성 방법: 무조건 찢어라

해결책은 아주 간단하다. 서로 상관없는 다중값들을 찢어놓으면 된다.

기존 테이블 (BCNF 통과, 4NF 위반)

  • 개발자_테이블 [이름, 언어, 취미] (6줄)

테이블 분리 후 (4NF 달성)

  1. 개발자_언어_테이블 [이름, 언어] (2줄: 철수-Java, 철수-Python)
  2. 개발자_취미_테이블 [이름, 취미] (3줄: 철수-축구, 철수-수영, 철수-등산)

총 6줄이던 데이터가 5줄로 줄어들었다. 이제 철수가 Go 언어를 배워도 1번 테이블에 딱 1줄(철수-Go)만 Insert 하면 된다. 데이터 폭발(삽입 이상)이 완벽하게 사라졌다.

┌──────────────────────────────────────────────────────────────┐
│           다치 종속(MVD)의 데이터 폭발과 4NF 분리 과정 시각화            │
├──────────────────────────────────────────────────────────────┤
│                                                              │
│ [ ❌ 4NF 위반 (다치 종속 방치) ]                                   │
│  "철수 ──▶ Java ──▶ 축구"                                      │
│  "철수 ──▶ Java ──▶ 수영" (언어 하나당 취미 개수만큼 데이터가 곱해짐)    │
│  "철수 ──▶ Java ──▶ 등산"                                      │
│  "철수 ──▶ Python ──▶ 축구"...                                 │
│                                                              │
│ [ 🟢 4NF 달성 (테이블 분리) ]                                    │
│  [ 테이블 1 ]           [ 테이블 2 ]                           │
│  "철수 ──▶ Java"        "철수 ──▶ 축구"                          │
│  "철수 ──▶ Python"      "철수 ──▶ 수영"                          │
│                       "철수 ──▶ 등산"                          │
│                                                              │
│ ★ 특징: 서로 남남인 두 다중값(언어, 취미)의 연결고리를 끊어버림!          │
└──────────────────────────────────────────────────────────────┘

Ⅳ. 결론

"관계없는 다중값들을 한 지붕 아래 살게 하지 마라." 실무에서 데이터베이스 설계를 할 때, 4NF 위반을 만날 확률은 극히 드물다. 왜냐하면 애초에 ERD를 그릴 때 "철수는 언어도 여러 개고 취미도 여러 개네?"라고 판단하는 순간, 매핑 룰(396번 문서)에 따라 이 두 개를 독립된 테이블로 자연스럽게 빼버리기 때문이다. 하지만 정규화 이론의 빈틈을 메꾸는 학술적인 관점에서, 함수 종속(1대1)뿐만 아니라 다치 종속(1대다)까지 통제하려 했던 4NF는 데이터 무결성의 극한을 보여주는 아름다운 규칙이다.


📌 관련 개념 맵

  • 선행 조건: BCNF (보이스-코드 정규형 - 399번 문서)
  • 후행 과정: 제5정규형 (5NF - 조인 종속 제거, 401번 문서)
  • 기호: MVD (Multi-Valued Dependency), $\twoheadrightarrow$ 기호 사용
  • 발생하는 문제점: 다중값의 교차곱(Cartesian Product)으로 인한 삽입 이상, 삭제 이상

👶 어린이를 위한 3줄 비유 설명

  1. 햄버거 가게에서 '빵 종류(2개)'와 '음료수 종류(3개)'를 파는데, 세트 메뉴판에 모든 조합(2x3=6개)을 다 적어놓으면 메뉴판이 꽉 차버리겠죠? (4NF 위반)
  2. 빵과 음료수는 서로 아무 상관이 없잖아요?
  3. 그래서 메뉴판을 두 개로 쪼개서, 왼쪽엔 빵 2개만 적고 오른쪽엔 음료수 3개만 따로 적어놓는 게 훨씬 똑똑한 정리법(제4정규형)이랍니다!