6강에서 만든 테이블이 좋은 구조인지 판단하는 도구를 봅니다.
1. 정규화되지 않은 테이블
| item_no | order_no | customer_name | stage_code | stage_name | plan_date |
|---|---|---|---|---|---|
| L101 | O2401 | 가고객 | P10 | 픽킹 | 2026-03-01 |
| L101 | O2401 | 가고객 | P20 | 포장 | 2026-03-05 |
| L102 | O2401 | 가고객 | P10 | 픽킹 | 2026-03-02 |
| L201 | O2402 | 나고객 | P10 | 픽킹 | 2026-04-01 |
2. 세 가지 이상현상
| 이상 | 현상 | 예시 |
|---|---|---|
| 삽입 이상 | 불필요한 데이터 없이는 삽입 불가 | 새 처리단계 "P30 출고"를 등록하려면 주문항목이 있어야 함 |
| 갱신 이상 | 같은 사실을 여러 행에서 고쳐야 함 | O2401의 고객이 상호를 바꾸면 3행 수정, 일부 누락 시 불일치 |
| 삭제 이상 | 하나를 지우면 다른 사실도 사라짐 | L201을 지우면 "O2402의 고객은 나고객"이라는 사실이 소멸 |
원인은 하나입니다. 서로 다른 사실(고객명, 처리단계 이름, 계획일)이 한 테이블에 섞여 있기 때문입니다. 이를 형식적으로 분석하는 도구가 함수 종속성입니다.
3. 함수 종속성(FD)의 정의
X → Y : X 값이 같은 두 행은 반드시 Y 값도 같다. "X가 Y를 결정한다", X를 결정자, Y를 종속자라 부른다.
위 테이블의 FD:
order_no → customer_name
item_no → order_no
stage_code → stage_name
{item_no, stage_code} → plan_date주의: FD는 데이터 샘플에서 발견하는 것이 아니라 업무 규칙에서 도출합니다. 샘플 4행만 보면 plan_date → stage_code처럼 보이는 우연한 패턴이 있을 수 있지만, 업무상 성립하지 않으면 FD가 아닙니다.
4. FD의 종류
| 종류 | 정의 | 예시 |
|---|---|---|
| 자명한 FD | Y ⊆ X | {item_no, order_no} → order_no |
| 완전 함수 종속 | X의 어떤 진부분집합도 Y를 결정하지 못함 | {item_no, stage_code} → plan_date |
| 부분 함수 종속 | X의 일부만으로 Y를 결정 | {item_no, stage_code} → order_no (item_no만으로 충분) |
| 이행적 종속 | X → Y, Y → Z 이고 Y ↛ X | item_no → order_no → customer_name |
부분 종속은 2NF 위반, 이행적 종속은 3NF 위반의 원인입니다 (8강).
5. 암스트롱 공리
FD 집합에서 새로운 FD를 추론하는 규칙입니다.
| 규칙 | 내용 |
|---|---|
| 반사 (Reflexivity) | Y ⊆ X 이면 X → Y |
| 증가 (Augmentation) | X → Y 이면 XZ → YZ |
| 이행 (Transitivity) | X → Y, Y → Z 이면 X → Z |
유도 규칙:
| 규칙 | 내용 |
|---|---|
| 합집합 (Union) | X → Y, X → Z 이면 X → YZ |
| 분해 (Decomposition) | X → YZ 이면 X → Y, X → Z |
| 의사이행 (Pseudotransitivity) | X → Y, WY → Z 이면 WX → Z |
6. 속성 폐포(Closure)로 키 찾기
X⁺ = X로부터 결정되는 모든 속성의 집합입니다. X⁺가 전체 속성이면 X는 슈퍼키입니다.
R(item_no, order_no, customer_name, stage_code, stage_name, plan_date) 에서 {item_no, stage_code}⁺ 계산:
| 단계 | 적용 FD | 폐포 |
|---|---|---|
| 시작 | — | {item_no, stage_code} |
| 1 | item_no → order_no | + order_no |
| 2 | order_no → customer_name | + customer_name |
| 3 | stage_code → stage_name | + stage_name |
| 4 | {item_no, stage_code} → plan_date | + plan_date |
| 결과 | 전체 속성 → 슈퍼키 |
{item_no}⁺ = {item_no, order_no, customer_name} → 전체가 아니므로 키가 아님
{stage_code}⁺ = {stage_code, stage_name} → 키가 아님
따라서 {item_no, stage_code}는 최소성까지 만족하는 후보키입니다.
키 찾기 팁: 어떤 FD의 우변에도 나타나지 않는 속성은 모든 후보키에 반드시 포함됩니다. 여기서는 item_no, stage_code가 그렇습니다.
7. 최소 커버(Canonical Cover)
FD 집합에서 중복을 제거한 동치 집합입니다.
- 우변을 단일 속성으로 분해
- 좌변의 불필요한 속성 제거 (부분 종속 발견)
- 다른 FD로 유도 가능한 FD 제거
최소 커버는 8강의 3NF 합성 알고리즘의 입력이 됩니다.
7강 정리
- 이상현상은 서로 다른 사실이 한 테이블에 섞여서 생긴다.
- FD는 데이터 샘플이 아니라 업무 규칙에서 도출한다.
- 부분 종속과 이행적 종속이 정규화의 대상이다.
- 속성 폐포로 후보키를 기계적으로 찾을 수 있다.