RDBMS 정규화

배병일 ㅣ 2023. 9. 23. 20:03

정규화 (Normalization)

이상현상 (Anormaly)

  • 데이터의 중복으로 인해 삽입, 삭제, 갱신 시 발생하는 비 합리적인 현상
  • 발생 원인
    • 정규화 미 충족
    • 여러 특징을 하나의 릴레이션으로만 표현 (즉, 하나의 테이블에 다 때려넣을 때)
  • 종류
    • 삽입 이상 (삽입 시 불필요한 정보도 삽입)
    • 갱신 이상 (중복 값중 하나만 갱신되고 나머지는 갱신 안됨)
    • 삭제 이상 (특정 튜플 삭제할 경우 원하지 않는 정보도 삭제)

정규화의 정의

  • 데이터 중복 제거하여 이상현상 방지하고 일관성 정확성 유지 위한 무손실 분해 과정
  • 단계
    • 1차 정규형 (1NF)
    • 2차 정규형 (2NF)
    • 3차 정규형 (3NF)
    • 3.5차 정규형 (BCNF)
    • 4차 정규형 (4NF)
    • 5차 정규형 (5NF)

1차 정규형 (1NF)

  • 릴레이션의 모든 도메인을 원자값으로 구성하여 중복 값 없게 하는 정규화 단계
  • 만약 다음과 같이 “주문” 테이블이 구성되어 있다고 가정 !
  • 어떠한 문제점이 존재하는가?
  • 다음과 같이 변경한다면 해결 가능 !
  • 위와 같이 도메인(릴레이션)의 중복을 줄이고 원자값으로 유지하도록 변경하는 정규화가 1NF

2차 정규형 (2NF)

  • 1차 정규형 스키마에서 부분함수 종속성을 제거하는 정규화 기법 !
  • 부분종속이란 빨간색 화살표와 같은 부분
    • (학번, 과목코드) 가 학점을 정의할 수 있다 ⇒ 완전함수종속
    • (학번)이 지도교수를 정의 ⇒ 부분함수 종속
    • (학번)이 학과를 정의 ⇒ 부분함수 종속
    • (과목코드)가 과목명을 정의 ⇒ 부분함수 종속
  • 이상 현상은 부분함수 종속에 의해 발생

!

  • 노란색 ⇒ 갱신 이상 발생
  • 파란색 ⇒ 삽입 이상 발생
  • 빨간색 ⇒ 삭제 이상 발생

다음과 같이 변경한다면 해결 가능

3차 정규형 (3NF)

  • 2차 정규형 스키마에서 이행함수 종속성을 제거하는 정규화 기법
  • 이행종속성이란 (A→B, B→ C) 인 경우
  • 즉, A값을 알 때 B값을 알고, B값을 알때 C값을 알게 되는 경우

  • 이상현상은 다음과 같은 상황에 발생
    • 삽입 이상
      • “전혜수”라는 컴퓨터학과 새로운 교수를 추가하고 싶은데 학번을 기재해야 하는 이상현상

  • 삭제 이상
    • 만약 500003 학번의 학생이 중퇴했는데 유관순 교수의 데이터까지 사라지는 현상 발생
  • 다음과 같은 구조로 변경하면 3정규형 만족 (이행종속 제거)
  •  

  • 지도교수 테이블로 분리하여 이행종속을 제거

3.5차 정규형 (BCNF)

  • 3차 정규형에서 결정자 종속성을 제거하는 기법
  • 결정자 ⇒ 어떠한 속성을 결정하는 속성
    • 학번과 과목의 조합이 교수를 결정하지만
    • 교수가 반대로 과목을 결정하기도 함

  • 다음과 같은 형태로 변경하면 BCNF 정규형을 만족

4차 정규형 (4NF)

  • 3차 정규형에서 다치 종속성을 제거하는 기법

5차 정규형 (5NF)

  • 4차 정규형에서 조인 종속성을 제거하는 기법

역정규화 / 반정규화 (Denormalization)

역정규화(반정규화) 정의

  • 정규화로 분해된 릴레이션을 통합하고 중복을 허용하여 성능을 향상시키는 기법
  • 정규화는 무조건 좋은 것일까? (No No)
  • 정규화의 강도가 세질수록 성능이 이슈가 생길 수 있음
    • 정규화가 높아질수록 무결성은 높아지나
    • 정규화가 높아질수록 성능은 떨어짐

역정규화(반정규화)의 주요 기법

  • 테이블 레벨
    • 테이블 병합: 중복을 어느정도 허용하여 Join을 줄이기 위해 테이블을 합친다
    • 테이블 추가
      • 통계 테이블: 통계성 정보의 조회가 많을 경우 통계 데이터만 따로 요약하여 제공
      • 이력 테이블: 이력성 데이터를 위해 전담 테이블 생성
  • 컬럼 레벨
    • 중복 컬럼 추가: 성능을 우선적으로 고려하기 위해 양쪽의 테이블에 같은 데이터를 유지
    • 계산 컬럼 추가: 누적계산결과를 들고 있을 컬럼을 하나 추가 한다
    • 이력 컬럼 추가: 변경 이력, 최신 변경시점 등 이력을 관리하기 위한 컬럼을 추가
  • 관계 레벨
    • 중복 관계 추가: 외래키를 다수 추가하여 Join의 횟수를 줄이기 위한 기법

'DBMS' 카테고리의 다른 글

DDL , DML , DCL  (0) 2024.02.15
Primary Key, Foreign Key  (0) 2023.09.23
RDBMS VS NOSQL  (0) 2023.08.16