3NF 점검

이행 종속은 기준 테이블로 분리한다

주문이 고객ID를 담고, 고객ID가 고객명과 현재 주소를 결정한다면 그 속성은 주문이 아니라 고객 테이블의 책임이다.

주문 행

주문ID가 고객ID를 가진다

주문ID 주문일 고객ID

주문 자체를 식별하는 행에는 고객을 가리키는 값만 있으면 된다.

결정자

고객ID

고객ID는 고객 한 명의 이름과 현재 주소를 결정한다.

고객 속성

고객명 · 현재 주소

주문ID에 바로 붙이면 같은 고객 정보가 주문마다 반복된다.

주문ID에서 고객 속성까지 이어지는 이행 종속 주문ID가 고객ID를 결정하고 고객ID가 고객명과 현재 주소를 결정하므로 고객 속성은 주문ID에 이행 종속된다. 주문ID 기본키 후보 고객ID 비키 결정자 고객명 현재 주소 직접 이행 주문ID → 고객ID → 고객명·주소 : 비키 속성이 비키 속성을 결정
01 주문ID 주문 행의 기본키 후보이며 고객ID를 직접 가진다.
02 고객ID 고객명과 현재 주소를 결정하는 비키 결정자다.
03 고객 속성 주문 사실이 아니라 고객 테이블의 책임에 가깝다.
04 3NF 판단 주문ID가 고객ID를 거쳐 고객 속성을 결정하므로 기준 테이블을 분리한다.
갱신 이상

고객 주소 변경이 주문 여러 행을 동시에 흔든다

상황 혼합 테이블 3NF 분리
C01 주소 변경 O100, O103, O118을 모두 수정 고객 C01 한 행만 수정
고객만 먼저 등록 주문 없이는 고객 속성을 넣기 어려움 고객 테이블에 먼저 저장
마지막 주문 삭제 고객명·주소 기록도 함께 사라질 수 있음 주문 삭제와 고객 보존을 분리

판정: 고객명과 현재 주소는 주문의 사건 정보가 아니라 고객ID가 결정하는 기준 정보다. 주문에는 고객ID 참조와 주문 시점 사실만 남기는 쪽이 3NF에 맞다.

분리 전

주문 테이블에 고객 속성이 섞인 상태

주문_혼합
주문ID고객ID고객명현재 주소배송지
O100C01김철수서울서울
O101C02이영희부산부산
주문ID고객ID
고객ID고객명 · 현재 주소
3NF 분리

고객 속성은 고객 테이블로 옮긴다

고객
고객ID고객명현재 주소
C01김철수서울
C02이영희부산
주문
주문ID고객ID주문일배송지
O100C012026-05-01서울
O101C022026-05-02부산
주문 품목
주문ID상품ID수량단가
O100P1029,000
O100P20115,000

예외: 배송지는 고객의 현재 주소가 아니라 주문 당시의 사실이다. 그래서 고객 테이블로 옮기지 않고 주문 테이블에 남길 수 있다.

1
결정자 확인 고객ID처럼 비키 속성을 결정하는 값이 있는가.
2
속성 위치 고객명과 현재 주소가 주문이 아니라 고객을 설명하는가.
3
시점 구분 배송지처럼 주문 시점에 고정된 사실은 남길 수 있다.