1-2-1. 정규화

박은서's avatar
Feb 25, 2026
1-2-1. 정규화

1. 정규화의 개념

1️⃣ 정규화의 정의

1) 정규화(Normalization)

  • 데이터를 결정하는 결정자에 의해 함수적 종속을 가지고 있는 일반 속성을 의존자로 하여 입력/수정/삭제 이상 현상을 제거하는 것 (한국데이터진흥원)
  • 목적 : 데이터베이스 설계에서 중복 최소화, 데이터 구조 체계화
    • 데이터의 일관성과 무결성을 보장하는 데 필수적
  • 정규화를 충분히 고려하지 않고 설계된 데이터베이스는 데이터가 증가함에 따라 많은 문제 발생할 수 있음

2️⃣ 정규화의 필요성

  • 데이터의 중복 ↓, 데이터 구조화 → 데이터의 일관성과 무결성 보장
  • 정규화를 통해 테이블을 더 작고, 관리하기 쉬운 여러 테이블로 분리
    • → 데이터의 추가, 삭제, 수정 시 발생할 수 있는 다양한 이상 현상(Anomalies) 방지

3️⃣ 다양한 정규 형태

  • 1차 정규형(1NF), 2차 정규형(2NF), 3차 정규형(3NF)
  • 복잡한 데이터 구조의 경우 확장된 규칙 적용
    • 보이스/코드 정규형(BCNF), 4차 정규형(4NF), 5차 정규형(5NF)

2. 정규화 형태

💡
제1정규형(1NF)
모든 속성은 하나의 값만 가져야 하며, 테이블에 중복된 데이터가 없어야 함
제2정규형(2NF)
제1정규형을 만족하며, 기본 키의 부분적 종속성이 제거되어 기본 키 전체에 종속되어야 함
제3정규형(3NF)
제2정규형을 만족하며, 모든 비주요 속성이 모든 주식별자에만 종속되고 비주요 속성 간의 종속성이 없어야 함
제4정규형(4NF)
제3정규형을 만족하며, 모든 다치 종속성이 후보 키를 통해서만 존재하는 상태로, 데이터 중복과 이상현상을 제거해야 함
제5정규형(5NF)
제4정규형을 만족하며, 모든 조인 종속이 후보 키를 통해서만 존재하는 상태로, 데이터 중복과 이상 현상을 제거해야 함

1️⃣ 제1정규형 (1NF)

  • 기본 명제 : 속성은 하나의 값만 가져야 한다
    • 하나의 칼럼에는 하나의 값만 포함되어야 함
  • 제1정규형 원칙 X → 데이터 검색, 조회, 추출 시 데이터베이스 성능 저하 및 데이터의 입력, 수정 복잡해짐 → 개발 복잡해지고, 장기적으로 데이터 구조가 불안정해져 데이터 품질 저하

2️⃣ 제2정규형 (2NF)

  • 모든 일반 속성이 모든 식별자 전체에 완전 함수적으로 종속해야 한다
    • 함수종속성(Functional Dependency) : 데이터가 특정 기준값에 의해 종속되는 현상
      • 이 때, 기준값을 결정자(Determinant), 종속되는 값을 종속자(Dependent)라고 함
  • 부분 함수 종속성을 제거해야 함 → 데이터 중복 ↓, 데이터 무결성 보장, 데이터 효율적으로 활용 가능

3️⃣ 제3정규형 (3NF)

  • 제2정규형을 만족하면서 모든 비주요 속성이 모든 주식별자에만 종속되고, 비주요 속성간의 종속성이 없어야 한다
    • → 이행적 종속성(Transitive Dependency) 제거
    • 이행적 종속성 : A가 B에게 영향을 주고, B가 C에게 영향을 준다면, A가 C에게 간접적으로 영향을 줌
      • (DB관점) 한 테이블 내에서 특정 속성 값이 다른 속성을 통해 세 번째 속성 값을 결정짓는 상황

4️⃣ 고급 정규화

교재 p.49 참고

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

2) 제4정규형 (4NF)

3) 제5정규형 (5NF)

3. 반정규화

1️⃣ 반정규화의 개념

1) 반정규화 (Denormalization)

  • 데이터베이스 설계 과정에서 정규화의 원칙을 일부 또는 전부 역행하여, 데이터의 중복을 의도적으로 허용하거나 테이블 구조를 단순화하는 과정
  • 정규화의 반대
  • 목적 : 성능 최적화, 쿼리의 복잡성 감소, 데이터 접근 속도 향상

2️⃣ 반정규화가 고려되는 상황

1) 조회 성능 향상

  • 정규화된 테이블을 조인하는 것보다 하나의 테이블에서 데이터를 읽는 것이 더 빠를 수 있음
  • 특히 읽기 연산이 많은 시스템에서 효과적

2) 쿼리 간소화

  • 여러 테이블에 걸친 데이터를 조인 없이 접근할 수 있어 쿼리를 단순화할 수 있음 → 개발자가 시스템을 더 쉽게 이해하고 유지보수 할 수 있음

3) 트랜잭션 처리 시간 단축

  • 데이터를 한 곳에 집중 → 트랜잭션 처리 시간 단축
  • 데이터 쓰기 작업에서 성능 이점 제공

3️⃣ 반정규화의 방법

1) 테이블 병합

  • 서로 관련된 여러 테이블을 하나로 합쳐서 관리 → 쿼리의 조인 연산 ↓

2) 중복 데이터 추가

  • 자주 접근하는 데이터를 여러 테이블에 중복 저장 → 데이터 접근 시간 단축

3) 집계 데이터 저장

  • 집계 함수를 사용해 조회하는 데이터(평균, 합계 등)를 사전에 계산하여 별도의 테이블에 저장 → 집계 쿼리의 실행 시간 단축

4️⃣ 반정규화 시 고려해야 할 사항

1) 데이터 무결성

  • 중복된 데이터는 데이터 무결성 문제 일으킬 수 있음
  • 반정규화 시 무결성을 유지할 방법 함께 고려해야 함

2) 유지 보수

  • 데이터 구조가 복잡해지고 중복 데이터가 많아질수록 유지 보수 어려워질 수 있음
  • 반정규화 시 필요한 최소한의 범위에서 신중히 적용해야 함

3) 적용 필요성 검토

  • 데이터 무결성, 시스템 복잡성, 유지보수성 등을 신중히 고려한 뒤 꼭 필요한 경우에만 반정규화 적용해야 함

4) 합리적인 판단

  • 반정규화는 데이터 정합성 문제와 불필요한 트랜잭션으로 인한 성능 저하를 유발할 수 있음
  • 조회 성능에서 미미한 이점을 얻기 위해 반정규화를 적용했으나, 결과적으로 갱신 과정에서 다른 성능을 손해본다면 이는 합리적이지 않
Share article