데이터 페이스 정규화 정리

오정빈·2025년 12월 16일

데이터베이스 정규화(1NF~3NF)


1) 정규형 개념 (1NF ~ 3NF)

  • 1NF(제1 정규형) : 모든 컬럼 값은 원자값(하나의 값)이어야 한다.
  • 2NF(제2 정규형) : 1NF + 부분 함수 종속 제거
  • 3NF(제3 정규형) : 2NF + 이행적 종속 제거

함수 종속 : X → Y는 “X가 정해지면 Y가 하나로 정해진다”는 의미


2) “주문” 테이블을 1NF → 2NF → 3NF로 분해

2-1. 비정규형(UNF) 예시

UNF_주문 (문제: 한 칸에 상품목록이 여러 개 들어감)

주문ID고객ID고객명고객주소상품목록(상품ID:수량)
O100C10홍길동서울P1:2, P2:1
O101C11김영희부산P2:3

문제점

  • 상품목록다중 값(리스트) → 1NF 위반
  • 특정 상품 수량만 수정/삭제하기가 까다로움

2-2. 1NF 적용 (원자값으로 “행을 풀기”)

상품목록을 행으로 풀어 주문-상품 라인 아이템 형태로 만든다.

1NF_주문라인(임시)

주문ID상품ID수량고객ID고객명고객주소상품명상품가격
O100P12C10홍길동서울아메리카노3000
O100P21C10홍길동서울베이글2500
O101P23C11김영희부산베이글2500
  • 각 컬럼은 원자값 → 1NF 만족
  • 하지만 아직 중복이 많고(고객명/주소, 상품명/가격 반복) 규칙(함수 종속)에 어긋나는 구조가 남아 있다.

키(Primary Key) 가정

  • 이 테이블의 PK를 (주문ID, 상품ID)로 잡으면 “한 주문에서 같은 상품은 한 번만 등장”한다고 가정할 수 있다.

2-3. 2NF 적용 (부분 함수 종속 제거)

(1) 현재 함수 종속(FD) 예시

  • (주문ID, 상품ID) -> 수량
  • 주문ID → 고객ID, 고객명, 고객주소 주문ID(키 일부)에만 의존
  • 상품ID → 상품명, 상품가격 상품ID(키 일부)에만 의존

즉 PK가 복합키 (주문ID, 상품ID)인데,

  • 고객 관련 컬럼은 주문ID만으로 결정
  • 상품 관련 컬럼은 상품ID만으로 결정
    부분 함수 종속이므로 2NF 위반

(2) 2NF 분해 결과

부분 종속되는 속성을 각각의 테이블로 분리한다.

(A) Orders_2NF (주문)

주문ID (PK)고객ID고객명고객주소
O100C10홍길동서울
O101C11김영희부산

(B) Products_2NF (상품)

상품ID (PK)상품명상품가격
P1아메리카노3000
P2베이글2500

(C) OrderItems_2NF (주문 상세)

주문ID (PK, FK)상품ID (PK, FK)수량
O100P12
O100P21
O101P23

이제 상품명/가격은 Products로, 고객명/주소는 Orders로 이동하여 2NF 만족


2-4. 3NF 적용 (이행적 종속 제거)

2NF까지 끝냈는데도 Orders_2NF 안을 보면:

  • 주문ID → 고객ID
  • 고객ID → 고객명, 고객주소 (고객ID가 고객 정보를 결정)
  • 결과적으로 주문ID → 고객명, 고객주소이행적(간접)으로 성립

주문ID → 고객ID → 고객명/주소 구조가 남아 있어 3NF 위반

3NF 분해 결과

고객 정보를 별도 테이블로 분리하고, 주문은 고객ID만 참조하도록 만듭니다.

(A) Customers_3NF (고객)

고객ID (PK)고객명고객주소
C10홍길동서울
C11김영희부산

(B) Orders_3NF (주문)

주문ID (PK)고객ID (FK)
O100C10
O101C11

(C) Products_3NF (상품) (2NF와 동일)

상품ID (PK)상품명상품가격
P1아메리카노3000
P2베이글2500

(D) OrderItems_3NF (주문 상세) (2NF와 동일)

주문ID (PK, FK)상품ID (PK, FK)수량
O100P12
O100P21
O101P23

이제 주문 테이블에는 “주문 자체”의 속성만 남고, 고객/상품 정보는 각 마스터 테이블에만 존재 → 3NF 만족한다.

0개의 댓글