본문 바로가기
자격증/SQLD

[SQLD] 2-1: 정규화(Normalization)와 반정규화(Denormalization)

by rnasterofmysea 2025. 2. 13.
반응형

Chapter 2: 데이터 모델과 SQL

데이터 모델과 SQL의 이해는 데이터베이스 설계 및 운영에서 핵심적인 역할을 합니다. 이번 장에서는 정규화, 관계와 조인의 이해, 모델이 표현하는 트랜잭션의 이해, NULL 속성의 이해, 반정규화에 대해 다룹니다.

 

[SQLD] Chapter 2-1 정규화(Normalization)와 반정규화(Denormalization)

데이터 모델링에서 정규화는 데이터 중복을 최소화하고, 데이터 무결성을 유지하는 과정이며, 반정규화는 성능 최적화를 위해 일부 정규화 규칙을 완화하는 과정입니다. 데이터 모델을 설계할 때 이 두 가지 개념을 균형 있게 적용하는 것이 중요합니다.

 


1. 정규화(Normalization)

1.1 정규화의 개요

정규화는 관계형 데이터베이스에서 데이터 중복을 방지하고, 데이터 무결성을 유지하는 과정입니다. 이를 통해 데이터 저장 공간을 절약하고, 데이터 갱신 시 이상(Anomaly)이 발생하는 것을 방지할 수 있습니다.


1.2 정규화의 단계

정규화는 일반적으로 다음의 단계를 거칩니다:

  1. 제1정규형(1NF): 모든 속성이 **원자값(Atomic Value)**을 가져야 함
  2. 제2정규형(2NF): 부분 함수적 종속 제거 (기본 키에 대해 완전 함수적 종속 유지)
  3. 제3정규형(3NF): 이행적 종속 제거 (기본 키에만 종속되도록 구성)
  4. BCNF(Boyce-Codd Normal Form): 모든 결정자가 후보 키가 되도록 구성
  5. 제4정규형(4NF): 다치 종속 제거 (하나의 속성이 두 개 이상의 독립적인 다중 값을 가지지 않도록 함)
  6. 제5정규형(5NF): 조인 종속 제거 (테이블이 여러 개로 분해되었을 때 데이터 손실 없이 조인 가능하도록 구성)

1.3 정규화 예제

1) 제1정규형(1NF): 원자값(Atomic Value) 적용

비정규형 테이블 (중복 속성 포함)

 

주문번호 주류코드 주문수량 주류명
202501 A1001 2 참이슬, 진로
202502 B1002 1 처음처럼
202503 A1001 3 참이슬

👉 문제점: 주류명이 여러 개의 값을 포함하고 있음 (비원자적 속성 존재)

 

제1정규형 변환 (속성 분리)

주문번호 주류코드 주문수량 주류명
202501 A1001 2 참이슬
202501 B1002 1 진로
202502 B1002 1 처음처럼
202503 A1001 3 참이슬

👉 해결: 모든 속성이 **단일 값(Atomic Value)**을 가지도록 변환

 

2) 제2정규형(2NF): 부분 함수 종속 제거

 

1NF 테이블 (부분 함수 종속 존재)

주문번호 (PK) 주류코드 주문수량 주류명
202501 A1001 2 참이슬
202501 B1002 1 진로
202502 B1002 1 처음처럼
202503 A1001 3 참이슬

👉 문제점: 주류명주류코드에 종속되어 있음 (부분 함수 종속 발생)

 

제2정규형 변환 (주류 정보를 별도 테이블로 분리)

 

주문 테이블

주문번호 (PK) 주류코드 (FK) 주문수량
202501 A1001 2
202501 B1002 1
202502 B1002 1
202503 A1001 3

 

주류 테이블

주류코드 (PK) 주류명
A1001 참이슬
B1002 진로
B1003 처음처럼

👉 해결: 주류명주류코드만 참조하도록 분리하여 데이터 중복을 제거

3) 제3정규형(3NF): 이행적 종속 제거

2NF 테이블 (이행적 종속 존재)

주문번호 (PK) 고객ID (FK) 주류코드 (FK) 주문수량 고객명 고객연락처
202501 C001 A1001 2 홍길동 010-1234
202501 C001 B1002 1 홍길동 010-1234
202502 C002 B1003 1 김철수 010-5678
202503 C001 A1001 3 홍길동 010-1234

👉 문제점: 고객명고객연락처고객ID를 통해 유추 가능 (이행적 종속 발생)

 

제3정규형 변환 (고객 정보를 별도 테이블로 분리)

주문 테이블

주문번호 (PK) 고객ID (FK)
202501 C001
202502 C002
202503 C001

 

고객 테이블

고객ID (PK) 고객명 고객연락처
C001 홍길동 010-1234
C002 김철수 010-5678

👉 해결: 고객명과 고객연락처를 고객ID만 참조하도록 분리하여 데이터 중복을 제거

 

 


2. 반정규화(Denormalization)

 

정규화가 데이터 무결성을 유지하고 중복을 방지하는 반면, 반정규화는 성능 최적화를 위해 일부 정규화 규칙을 완화하는 기법입니다. 업무 프로세스상 JOIN 등 연산이 많이 필요한 경우 테이블을 통합하는 것이 성능 측면에서 유리할 경우 고려할 수 있습니다.

2.1 테이블 반정규화

  • 여러 개로 분할된 테이블을 하나로 합쳐 조회 성능 향상
  • 예: 고객 테이블과 주문 테이블을 합쳐 고객 정보를 빠르게 조회

2.2 컬럼 반정규화

  • 자주 조회하는 데이터를 추가 컬럼으로 저장하여 성능 향상
  • 예: 고객 테이블에 최근 주문일자 추가하여 빠른 조회 가능

2.3 관계 반정규화 (중복 관계 추가)

  • 특정 조인을 줄이기 위해 중복 데이터를 추가하여 성능 개선
  • 예: 주문 테이블에 고객명을 직접 저장하여 조인 없이 조회 가능

3. 마무리

이번 장에서는 정규화와 반정규화에 대해 학습했습니다.

  • 정규화는 데이터 중복을 방지하고 무결성을 유지하기 위한 과정이며, 1NF, 2NF, 3NF까지 예제를 통해 설명했습니다.
  • 반정규화는 성능 향상을 위해 정규화 규칙을 완화하는 방법이며, 테이블 반정규화, 컬럼 반정규화, 관계 반정규화를 포함합니다.
반응형