[DB] 정규화 (Normalization)

·2025년 1월 21일

데이터베이스

목록 보기
20/22
post-thumbnail

정규화 (Normalization)

정규화란?

  • 데이터 중복과 이상현상(삽입, 갱신, 삭제)를 최소화하기 위해 데이터를 정규형(normal form - NF)에 맞도록 구조화하는 프로세스
  • 정규화 단계: 제1정규형 → 제2정규형 → 제3정규형 → BCNF → 제4정규형 → 제5정규형
  • 보통 실무에서는 3정규형, BCNF형까지 많이 쓴다고 알려짐

제 1 정규형 (1NF)

  • 테이블에 속한 모든 속성의 도메인(domain)이 원자값(atomic value)만으로 구성되어있으면 제1정규형
    • 도메인: 속성 하나가 가질 수 있는 모든 값의 집합

제 1 정규형을 만족하지 못하는 테이블

학생ID학생이름수강과목
1홍길동수학, 과학
2이몽룡영어, 사회, 과학
  • 수강과목 컬럼이 복합값(수학, 과학)으로 구성되어 있어 원자값의 조건을 충족하지 못함

제 1 정규형을 만족하는 테이블로 변경

학생ID학생이름수강과목
1홍길동수학
1홍길동과학
2이몽룡영어
2이몽룡사회
2이몽룡과학
  • 모든 컬럼 값이 원자값으로 구성되어 있어 제 1 정규형을 만족

제 2 정규형 (2NF)

  • 테이블이 제1정규형에 속하고, 기본키가 아닌 모든 속성이 기본키에 완전 함수적 종속되면 제2정규형
  • 부분 함수적 종속를 제거해야함
  • 즉, 기본키의 일부에만 종속된 속성을 제거해야함

제 2 정규형을 만족하지 못하는 테이블

고객ID(PK)이벤트ID(PK)당첨여부등급할인율
appleE001Ygold10%
appleE005Ngold10%
appleE010Ygold10%
bananaE002Nvip20%
bananaE005Yvip20%
carrotE003Ygold10%
carrotE007Ygold10%
orangeE004Nsilver5%
  • 기본키: (고객ID, 이벤트ID)
  • 문제점:
    • 등급, 할인율고객ID에만 종속 (부분 함수적 종속)
    • 고객ID등급, 고객ID할인율

제 2 정규형을 만족하는 테이블로 변경

1. 고객 릴레이션

고객ID(PK)등급할인율
applegold10%
bananavip20%
carrotgold10%
orangesilver5%

2. 이벤트참여 릴레이션

고객ID(PK)이벤트ID(PK)당첨여부
appleE001Y
appleE005N
appleE010Y
bananaE002N
bananaE005Y
carrotE003Y
carrotE007Y
orangeE004N

제 3 정규형 (3NF)

  • 테이블이 제2정규형에 속하고, 기본키가 아닌 모든 속성이 기본키에 이행적 함수적 종속이 되지 않으면 제3정규형

제 3 정규형을 만족하지 못하는 테이블

고객ID(PK)등급할인율
applegold10%
bananavip20%
carrotgold10%
orangesilver5%
  • 문제점:
    • 등급고객ID에 종속 (고객ID → 등급)
    • 할인율등급에 종속 (등급 → 할인율)
    • 따라서, 고객ID등급할인율이행적 함수적 종속(고객ID할인율)이 발생

제 3 정규형을 만족하는 테이블로 변경

1. 고객 릴레이션

고객ID(PK)등급(FK)
applegold
bananavip
carrotgold
orangesilver

2. 등급 릴레이션

등급(PK)할인율
gold10%
vip20%
silver5%

BCNF (Boyce-Codd Normal Form)

  • 테이블이 제3정규형에 속하고, 모든 결정자후보키가 되도록 하는 정규형
    • 후보키: 테이블에서 각 행(row)을 고유하게 식별할 수 있는 속성 또는 속성들의 집합
    • 결정자: (A -> B) 함수적 종속 관계에서 A가 결정자

BCNF를 만족하지 못하는 테이블

학생ID(PK)과목ID(PK)강의실교수ID
S001C001R101P001
S002C001R101P001
S001C002R102P002
S003C002R102P002
  • 결정자:
    • 강의실교수ID (강의실에서 담당 교수는 고유)
    • 그러나 강의실후보키가 아니므로 BCNF를 만족하지 않음

BCNF를 만족하는 테이블로 변경

1. 강의실-교수 릴레이션

강의실(PK)교수ID
R101P001
R102P002

2. 학생-과목 릴레이션

학생ID(PK)과목ID(PK)강의실(FK)
S001C001R101
S002C001R101
S001C002R102
S003C002R102

제4정규형(4NF)과 제5정규형(5NF)

  • 보통 4NF나 5NF는 실무에서 거의 사용하지 않으며, 이론적 측면이 강함

제4정규형

  • 테이블이 BCNF정규형에 속하고, 다중값 종속(Multi-Valued Dependency)을 제거한 정규형
  • 다중값 종속은 여러 다중값 속성이 서로 독립적으로 존재할 때 발생
  • 하나의 다중값 속성만 존재하면, 독립적 가능성이 없으므로 4NF 위반아님

제 4 정규형을 만족하지 못하는 테이블

예시:

  • 한 학생이 여러 전화번호와 여러 주소를 가질 때, 전화번호와 주소는 독립적으로 여러 값을 가짐
  • 학생ID → 전화번호 (1:N)
  • 학생ID → 주소 (1:N)
학생ID전화번호주소
1010-1234서울시 강남구
1010-5678서울시 강남구
1010-1234부산시 해운대

제 4 정규형을 만족하는 테이블로 변경

1. 학생-전화번호 릴레이션

학생ID전화번호
1010-1234
1010-5678

2. 학생-주소 릴레이션

학생ID주소
1서울시 강남구
1부산시 해운대

제5정규형

  • 테이블이 제4정규형을 만족하고, 조인 종속(Join Dependency)을 제거한 정규형
  • 조인 종속은 테이블을 여러 개로 분해한 후 다시 조인했을 때, 원래의 테이블을 복원할 수 없는 경우에 발생

제 5 정규형을 만족하지 못하는 테이블

1. 학생-전화번호 릴레이션

학생ID전화번호
1010-1234
1010-5678

2. 학생-주소 릴레이션

학생ID주소
1서울시 강남구
1부산시 해운대

문제: 조합 관계

위 두 테이블을 조인하면 다음과 같이 모든 조합이 생성됨:

학생ID전화번호주소
1010-1234서울시 강남구
1010-1234부산시 해운대
1010-5678서울시 강남구
1010-5678부산시 해운대

제 5 정규형을 만족하는 테이블로 변경

  • 아래 테이블을 조인하면 원래 테이블이 복원됨

1. 학생-전화번호 릴레이션

학생ID전화번호
1010-1234
1010-5678

2. 학생-주소 릴레이션

학생ID주소
1서울시 강남구
1부산시 해운대

3. 전화번호-주소 릴레이션

전화번호주소
010-1234서울시 강남구
010-1234부산시 해운대
010-5678부산시 해운대

비정규화 (Denormalization, 역정규화)

  • 정규화로 인해 여러 개로 분해된 테이블에서 원하는 정보를 얻으려면 조인을 사용하여 연결해야함
  • 자주 조인을 사용하면, 응답 속도가 떨어지므로 정규화에 위배되지만 성능 향상을 위해 다시 테이블을 합침
  • 이것을 비정규화 또는 역정규화라고 함

정규화는 데이터 중복과 이상 현상을 제거하여 데이터 무결성을 보장하고, 비정규화는 성능 최적화를 위해 이를 의도적으로 완화하는 작업으로, 상황에 따라 적절히 사용해야함


Reference

https://terms.naver.com/entry.naver?docId=3431248&cid=58430&categoryId=58430&expCategoryId=58430

0개의 댓글