본문 바로가기
SQL Professional

[독학! SQLP] 정규형? 정규화? 반정규화?

by 개발자의 2025. 8. 19.

정규화 (Normalization)

  • 정의 : 데이터의 중복을 제거하고, 이상현상을 방지하며, 데이터 일관성을 유지하기 위해 릴레이션을 분해하는 과정
  • 목적 : 데이터 중복 제거, 이상현상 방지, 일관성 확보
  • 장점 : 삽입 / 삭제 / 갱신 이상 제거 → 데이터 무결성 보장
  • 단점 : 테이블 / 조인 수 증가 → 성능 저하 가능
  • 키워드 : 무손실 분해, 종속 보존
참고
무손실 분해(조인): 나눴다가 조인하면 빠짐/중복 없이 원래 그대로. (외래키로 자연조인되게 설계)
종속 보존: 원래 규칙(FD)을 분해된 테이블들에서도 그대로 검사 가능.

정규형 (Normal Form)

1) 1차 정규형 (1NF)

  • 모든 칼럼이 한 칸에 하나의 값(원자값)을 가져야 함.
  • 반복 칼럼(phone1, phone2 …)이나 콤마로 여러 값을 넣거나 JSON/배열로 묶어 넣으면 1NF 위반
  • 1NF 위반
    • phone1, phone2 칼럼이 반복되고, hobbies 칼럼에 값이 ","로 연결되어있다.

student_bad 테이블

  • 1NF 만족
    • student_bad 테이블을 student, student_phone, student_hobby 테이블로 분해
    • 모든 칼럼이 하나의 값을 가짐.

student 테이블
student_phone 테이블
student_hobby 테이블

2) 2차 정규형 (2NF)

  • 부분 함수 종속 제거 (모든 비키 속성은 후보키 전체에 완전 종속)
  • 복합키를 쓰는 테이블에서 키의 일부만으로 비키(일반 속성)가 결정되면 부분 종속 → 2NF 위반
  • 부분종속을 일으키는 속성을 자기 키를 가진 테이블로 분리해야 함.
  • 2NF 위반
    • order_item_bad 테이블의 키가 order_id, product_id 일때, product_name은 product_id에만 종속됨.

order_item_bad 테이블

  • 2NF 만족
    • product_id를 키로 가지는 product 테이블로 분리함.

order_item 테이블
product 테이블

3) 3차 정규형 (3NF)

    • 이행 함수 종속 제거 (비키 속성은 키에만 종속)
    • 이행 함수 종속 : 키가 X를, X가 Y를 결정하면 키가 돌아서 Y를 결정하는 상황(키 → 비키 → 다른 비키)
    • 중간 결정자(X)의 속성들은 그 X를 키로 하는 별도 테이블로 분리.
    • 3NF 위반
      • 주문이 고객ID를, 고객ID가 고객이름·등급을 결정 → 주문이 고객이름을 “우회 결정”

orders_bad 테이블

  • 3NF 만족
    • 비키 속성이 모두 키에만 종속되도록 orders 테이블과 customer 테이블로 분리.

orders 테이블

 

customer 테이블

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

  • 모든 결정자가 슈퍼키여야 함.
  • 함수적 종속 X → Y에서 X가 슈퍼키가 아니면 BCNF 위반.
  • 종속보존이 깨질수 있음. (필요시 3NF에서 타협)
  • 3차 정규형(3NF) 보다 강하다?
    • 3차 정규형을 만족시키는 테이블이라도 BCNF위반할 수 있다.
    • 3차 정규형 보다 엄격하다 정도로 이해
  • BCNF 위반
    • 학생(student), 과목(subject) -> 교수(prof) : 학생, 과목은 슈퍼키, 후보키
    • 교수(prof) -> 과목(subject) : 과목은 주요속성(후보키의 구성원) 그러나 교수가 슈퍼키가 아님. 때문에 3NF는 만족. BCNF 위반

student_subject_prof_bad 테이블

    • BCNF 만족
      • prof → subject를 별도 테이블에서 prof를 키로 유지하고, 학생-교수 매핑으로 바꿈.
      • 모든 결정자가 슈퍼키가 됨. BCNF 만족

prof_subject 테이블
student_prof 테이블

5) 4차 정규형 (4NF)

    • 다치 종속 제거
    • 다치 종속: 한 키 값에 대해 여러 개의 독립적인 반복 값이 존재하는 경우
    • 규칙: 비트리비얼 다치 종속의 결정자는 후보키여야 한다.
      (비트리비얼 = 의미 있는, 자명하지 않은 경우)
    • 4NF 위반
      • 한 가수(키값)가 여러 악기/여러 장르를 서로 독립적으로 가질 수 있음 → 곱집합 중복 발생

artist_instrument_genre_bad 테이블

    • 4NF 만족
      • 악기/장르는 서로 독립. 두 관계로 분리하면 다치 종속 제거 → 4NF 충족.

artist_instrument 테이블
artist_genre 테이블

6) 5차 정규형 (5NF)

    • 조인으로만 표현되는 종속(조인 종속) 제거
    • 어떤 릴레이션이 여러 테이블로 분해되어야만 무손실 조인이 가능한 경우, 그 조인 조건이 후보키에 의해서만 성립해야 함.
    • 규칙: 모든 조인 종속은 후보키에 의해 함축되어야 한다.
    • 5NF 위반
      • supplier-part-project(SPJ). 각 쌍 관계(SP, SJ, PJ)가 독립적으로 관리될 때, 한 테이블에 다 담으면 불필요 조합이 나옴.

supply_bad 테이블

    • 5NF 만족
      • 세 테이블 자연조인(또는 동등조인)으로 원래 의미를 정확히 복원 가능 → 5NF 충족

supplier-part 테이블(sp)
supplier-project 테이블(sj)
part-project 테이블(pj)

반정규화(Denormalization)

  • 정의 : 정규화된 데이터 모델을 성능 향상을 위해 의도적으로 중복을 허용하거나 테이블을 통합/변형하는 과정
  • 목적 : 데이터 조회 성능 향상, 조인 최소화
  • 장점 : SQL 단순화, 조회 속도 상승(JOIN 감소), 집계 / 보고 편리
  • 단점 : 데이터 중복 발생, 일관성 관리 필요
  • 키워드 : 중복 허용, 성능 최적화
  • 반정규화 전
    • 주문상세 테이블에는 가격이 없기 때문에, 금액을 계산하려면 항상 조인이 필요함.
    • 상품 가격이 변동될 경우 예전에 팔린 주문 금액까지 변동되는 오류가 발생함.

반정규화 전 상품, 주문, 주문상세

  • 반정규화 후
    • 주문내역은 팔린 시점 그대로 유지 가능.
    • 매출 집계시 상품테이블과 조인 하지 않음.

반정규화 후 상품, 주문, 주문상세