ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Database] 정규화(1NF~BCNF) 개념과 예시
    업무 자동화/Database 2025. 11. 8. 19:44

    정규화란?

    데이터베이스 정규화는 데이터 구조를 체계적으로 나누어 중복을 줄이고, 이상 현상(삽입·수정·삭제 시 모순)을 방지하는 과정이다.
    제대로 정규화된 스키마는

    • 같은 정보가 여러 테이블에 중복 저장되는 것을 줄이고,
    • 특정 컬럼만 수정해도 전체 데이터가 일관되게 유지되며,
    • 조회·변경 로직을 단순하게 만들어 유지보수를 쉽게 한다.

     

    정규형의 의미와 기준

    1. 제1정규형 (1NF)

    모든 속성이 더 이상 쪼갤 수 없는 원자 값(Atomic Value) 만을 가지는 상태
    한 칸에 여러 값을 넣지 않고, 반복 컬럼 없이 “표 형태”를 깔끔하게 만드는 것이 핵심이다.

    2. 제2정규형 (2NF)

    1NF를 만족한 상태에서, 복합키의 일부에만 의존하는 컬럼(부분함수종속) 을 제거한 상태
    기본키가 여러 컬럼으로 이루어져 있다면, 모든 비키 컬럼은 그 전체 키에 의존해야 한다.

    3. 제3정규형 (3NF)

    2NF를 만족하면서, 기본키가 아닌 컬럼이 또 다른 기본키가 아닌 컬럼에 의존하지 않도록(이행함수종속 제거) 정리한 상태
    “키가 아닌 값은 오직 키에만 의존한다”는 구조를 만드는 단계다.

    4. BCNF (Boyce-Codd 정규형)

    모든 함수 종속 X → Y 에 대해, X가 반드시 슈퍼키인 상태
    3NF보다 더 엄격하게 “결정자=키” 원칙을 적용해, 애매한 종속 관계와 이상 현상을 최대한 제거한 형태

     

     

    1. 제1정규형 (1NF)

    1) 정규형 (정의)

    모든 속성이 더 이상 나눌 수 없는 원자 값(Atomic) 만 가지도록 만든 상태”

    조건:

    • 한 셀에 값 하나만
    • 반복 컬럼 없음 (전화1, 전화2, 전화3… 이런 거 X)
    • 레코드들이 동일한 컬럼 구조를 가짐

    2) 정규화

    • 반복되는 값 / 목록 컬럼을 분리해서 별도 테이블로 뺀다.
    • 기본 키(PK)를 명확히 정한다.

    3) 예시

    (정규화 전) — 한 고객이 여러 전화번호를 한 칸에:

    고객ID고객명전화번호
    C001 김철수 010-1111-1111, 010-2222-2222

    문제:

    • 전화번호 검색/수정이 애매함 (“두 번째 번호만 바꾸기” 같은 경우)

    (1NF 정규화 후) — 전화번호를 행 단위로:

    고객

    고객ID고객명
    C001 김철수

    고객전화

    고객ID전화번호
    C001 010-1111-1111
    C001 010-2222-2222

     

    2. 제2정규형 (2NF)

    1) 정규형

    1NF이고, 기본키가 복합키일 때 부분함수종속이 없는 상태

    • 기본키가 (A, B) 같이 둘 이상일 때
    • 다른 컬럼들이 A 또는 B 일부에만 의존하면 안 되고,
    • 항상 (A, B) 전체에 의존해야 한다.

    2) 정규화

    • 복합키의 일부에만 의존하는 속성을 분리하여 새로운 테이블로 이동
    • 의존 대상이 되는 속성 쪽에 PK를 두고, 원래 테이블은 FK로 참조

    3) 예시

    (정규화 전) — 주문 상세 테이블:

    주문ID상품ID상품명단가수량
    O001 P10 키보드 30 2
    O001 P20 마우스 20 1

    여기서 PK는 (주문ID, 상품ID)
    그런데 상품명, 단가는 사실 상품ID에만 의존함 → 부분함수종속 → 2NF 위반

    (2NF 정규화 후)

    주문상세

    주문ID상품ID수량
    O001 P10 2
    O001 P20 1

    상품

    상품ID상품명단가
    P10 키보드 30
    P20 마우스 20

    효과:

    • 상품 가격 변경 시 상품 테이블만 수정하면 됨.

     

    3. 제3정규형 (3NF)

    1) 정규형

    2NF이고, 기본키가 아닌 속성이 또 다른 기본키가 아닌 속성에 의존하지 않는 상태

    = 이행함수종속(키 → A → B) 제거.

    2) 정규화

    • “키가 아닌 컬럼 → 키가 아닌 컬럼” 의존 관계를 찾아서,
    • 그 부분을 별도 테이블로 분리하고,
    • 원래 테이블에서는 해당 키만 남기고 참조하도록 한다.

    3) 예시

    (정규화 전) — 고객 테이블:

    고객ID고객명우편번호도시배송비구간
    C001 김철수 06236 서울 A구간
    C002 이영희 48058 부산 B구간

    가정:

    • 우편번호 → 도시
    • 도시 → 배송비구간

    즉 고객ID → 우편번호 → 도시 → 배송비구간
    키 아닌 컬럼들끼리 의존 → 3NF 위반

    (3NF 정규화 후)

    고객

    고객ID고객명우편번호
    C001 김철수 06236
    C002 이영희 48058

    우편번호_지역

    우편번호도시배송비구간
    06236 서울 A구간
    48058 부산 B구간

    효과: 도시/배송 정책이 바뀌어도 지역 테이블만 수정

     

    4. BCNF (Boyce-Codd 정규형)

    BCNF(보이스-코드 정규형)

    1) 정규형 (정의)

    모든 함수 종속 X → Y에 대해, X가 반드시 슈퍼키(Super Key)인 상태

    3NF보다 한 단계 더 엄격함.
    주로 복합 키 + 여러 후보키가 얽혀 있을 때 문제를 잡아낸다.

    2) 정규화

    1. 함수 종속들을 정리한다. (업무 규칙 기반)
    2. “좌변(X)이 슈퍼키가 아닌데도 종속 관계가 있는 경우”를 찾는다.
    3. 그 종속을 기준으로 테이블을 분해:
      • 하나는 X를 키로 갖는 테이블
      • 다른 하나는 기존 키를 유지하는 테이블

    3) 예시

    상황 가정

    • 한 과목은 한 명의 교수만 담당
    • 한 교수는 특정 과목만 강의
    • 어떤 시간대/강의실에는 하나의 (교수-과목)만 배정

    (정규화 전) — 강의 배정 테이블:

    교수과목강의실
    김교수 DB 101
    이교수 네트워크 101

    업무 규칙:

    • 교수 → 과목
    • 과목 → 교수 (1:1 관계라고 가정)
    • 실제로는 (교수, 강의실)이 키처럼 보이지만,
      교수 자체가 다른 속성을 결정할 수 있어 슈퍼키가 아닌 결정자 문제가 생김 → BCNF 위반

    (BCNF 정규화 후)

    교수과목

    교수과목
    김교수 DB
    이교수 네트워크

    강의배정

    과목강의실
    DB 101
    네트워크 101

    모든 함수 종속의 좌변이 각 테이블에서 슈퍼키가 되도록 분해

Designed by Tistory.