3. 제2 정규형 – 부분 함수 종속 제거

3-1. orders_1nf에서 발견되는 문제

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) 복합 키라고 가정한다. 이제 이 테이블의 함수 종속 관계를 분석한다.

기본 키의 일부에만 종속되는 관계를 부분 함수 종속(Partial Functional Dependency) 이라고 부른다.

부분 함수 종속이 존재하면 다음과 같은 문제가 생긴다.

이런 문제를 제거하는 것이 제2 정규형의 목표이다.


3-2. 제2 정규형 정의

제2 정규형(2NF)

  1. 제1 정규형을 만족해야 한다.
  2. 테이블의 모든 컬럼이 기본 키 전체에 완전 함수 종속되어야 한다.

즉, 부분 함수 종속이 존재하면 안 된다.

부분 함수 종속을 제거하는 방법은 간단하다. 종속 관계에 맞게 테이블을 쪼개면 된다.