orders_1nf를 다시 살펴보면, 상품 가격 컬럼 product_price만 있고, 주문 시점에 찍힌 가격 스냅샷(예: 쿠폰, 할인 등이 반영된 실제 주문 가격)이 없다.
실무에서는 보통 주문 가격 스냅샷 컬럼을 둔다. 그래서 order_price 컬럼을 추가했다고 가정한다.
order_id | member_id | member_name | product_id | product_name | product_price | order_price | order_quantity
------------------------------------------------------------------------------------------------------------
1001 | 1 | 션 | 10 | 노트북 | 1500000 | 1500000 | 2
1001 | 1 | 션 | 15 | 키보드 | 50000 | 50000 | 1
1002 | 2 | 네이트 | 10 | 노트북 | 1500000 | 1500000 | 1
1003 | 1 | 션 | 20 | 마우스 | 30000 | 30000 | 1
(표 길이를 줄이기 위해 ordered_at은 생략해도 된다.)
orders_1nf의 기본 키(PK)는 (order_id, product_id) 복합 키라고 가정한다. 이제 이 테이블의 함수 종속 관계를 분석한다.
(order_id, product_id) → order_price(order_id, product_id) → order_quantityorder_id → member_idorder_id → member_nameorder_id → ordered_atproduct_id → product_name, product_price기본 키의 일부에만 종속되는 관계를 부분 함수 종속(Partial Functional Dependency) 이라고 부른다.
부분 함수 종속이 존재하면 다음과 같은 문제가 생긴다.
member_name과 ordered_at이 10번 반복 저장된다.이런 문제를 제거하는 것이 제2 정규형의 목표이다.
제2 정규형(2NF)
- 제1 정규형을 만족해야 한다.
- 테이블의 모든 컬럼이 기본 키 전체에 완전 함수 종속되어야 한다.
즉, 부분 함수 종속이 존재하면 안 된다.
부분 함수 종속을 제거하는 방법은 간단하다. 종속 관계에 맞게 테이블을 쪼개면 된다.
order_id에만 종속되는 컬럼 → orders 테이블로 분리product_id에만 종속되는 컬럼 → product 테이블로 분리