나의 잡다한 노트 및 메모

비정규화(denormalization) 본문

DB

비정규화(denormalization)

peanutwalnut 2025. 3. 7. 16:11

**비정규화(Denormalization)**는 **정규화(Normalization)**로 설계된 데이터베이스 스키마에서, 쿼리 성능 개선 또는 개발 편의성 등을 위해 중복 데이터를 허용하고 테이블 구조를 단순화하는 작업을 말합니다. 즉, 정규화를 통해 중복을 최소화하고 데이터 무결성을 높이려는 원칙과 반대 방향이지만, 실무에서 특정 목적(속도, 편의성)을 위해 의도적으로 일부 정규화 규칙을 완화하는 것을 의미합니다.


1. 정규화 vs 비정규화

  1. 정규화(Normalization)
    • 중복 데이터를 최소화하고, 무결성을 유지하도록 테이블을 분리하는 방식.
    • 일반적으로 **1NF(제1정규형)**부터 **BCNF(Boyce–Codd Normal Form)**까지 여러 단계가 있음.
    • 데이터 변경 시 **갱신 이상(수정, 삭제, 삽입 이상)**이 발생하지 않도록 하는 것이 목적.
  2. 비정규화(Denormalization)
    • 정규화를 통해 분리된 테이블들을 쿼리 성능이나 편의성을 위해 일부 합치거나, 데이터 중복을 허용하는 형태로 변경.
    • 일부 정규화 규칙을 희생함으로써, 테이블 조인(join) 과정을 줄이고 조회 성능이나 개발 생산성을 높일 수 있음.
    • 중복 데이터가 늘어나므로, 데이터 무결성 유지가 까다로워지고 저장 공간이 늘어날 수 있음.

2. 왜 비정규화를 할까?

  1. 쿼리 성능 향상
    • 애플리케이션에서 특정 쿼리가 매우 빈번하게 발생하고, 조인이 많은 테이블 구조라면 성능이 저하될 수 있음.
    • 해당 쿼리에 필요한 정보를 하나의 테이블에 모아두면 조인 없이 빠른 조회 가능.
  2. 개발 편의성
    • 스키마가 지나치게 정규화되어 있으면, 간단한 통계나 조회 로직도 여러 테이블 조인을 거쳐야 할 수 있음.
    • 비정규화를 통해 가독성 좋고 단순한 SQL을 작성할 수 있음.
  3. 분산 환경 및 Big Data
    • 분산 DB나 NoSQL 환경에서는 조인 연산이 비효율적이거나 지원이 제한될 수 있음.
    • 이 경우 비정규화를 적극 활용하여 한 문서나 레코드에 필요한 정보를 모두 넣어둠으로써, 한 번의 조회로 데이터를 가져오는 것이 일반적.

3. 비정규화의 단점과 고려사항

  1. 데이터 중복
    • 여러 곳에 같은 데이터가 존재하므로, 변경(UPDATE), 삭제(DELETE), 삽입(INSERT) 시 불일치데이터 무결성 문제가 생길 수 있음.
    • 중복된 데이터들은 유지보수 비용을 증가시킴.
  2. 저장 공간 증가
    • 중복 데이터가 늘어나면, 물리적인 저장 공간이 커질 수 있음.
  3. 데이터 정합성 유지
    • 비정규화된 시스템에서 데이터가 변경될 때, 동일한 데이터를 여러 곳에서 갱신해야 하므로 로직이 복잡해짐.
    • 이 과정을 자동화하지 않으면 장애나 데이터 불일치가 발생하기 쉬움.
  4. 적절한 비정규화 판단
    • 트래픽, 조회 패턴, 시스템 규모 등을 종합적으로 검토해, 이점이 단점을 상회하는지 판단해야 함.
    • “어떤 테이블을 비정규화할지, 어떤 부분을 중복시킬지”는 쿼리 빈도, 데이터 변경 빈도, 시스템 확장성 등을 고려해야 함.

4. 비정규화 방법 예시

  1. 중복 칼럼 추가
    • 예: 주문 테이블에서, 원래는 user_id만 저장하고 이름이나 이메일은 users 테이블과 조인하여 얻어야 하지만, 사용자 이름 또는 이메일직접 주문 테이블에 중복 저장.
    • 주문 데이터를 조회할 때 조인 없이 바로 사용자 정보를 표시 가능.
  2. 중복 테이블 생성
    • 종합 통계를 위해 여러 테이블의 데이터가 필요한 경우, 일정 주기나 트리거로 **“집계 테이블(마치 캐시처럼)”**을 생성해 둠.
    • 조회 시 이 테이블만 참조하면 빠른 응답을 받을 수 있음.
  3. 테이블 병합
    • 정규화로 나뉘어 있던 1:1 관계나 자주 함께 조인되는 테이블을, 하나로 합쳐버리는 경우.
    • 예: products 테이블과 product_details 테이블이 1:1 관계라면, 이를 하나로 합침으로써 조인을 제거함.
  4. EAV(Entity-Attribute-Value) 모델 단순화
    • 확장성을 높이기 위해 만든 EAV 구조가 쿼리 시 복잡해지면, 필요한 속성(컬럼)을 직접 추가하는 방식으로 비정규화해 쿼리를 단순화하기도 함.

5. 실제 적용 시점

  • 트래픽 패턴 분석: 빈번한 조회(SELECT) vs. 드문 변경(INSERT/UPDATE)
    • 조회가 압도적으로 많다면, 비정규화 이점이 큰 편. 변경이 잦다면 무결성 유지 비용이 커짐.
  • 조인 횟수: 한 쿼리에 조인을 여러 번 수행해야 하거나, 대규모 분산 환경에서 조인 비용이 매우 클 때
  • 실시간 분석/레포팅: 집계 계산이 빈번하거나 큰 부하를 일으키는 경우, 사전 집계 테이블(비정규화된 형태)을 생성해두면 큰 이점이 있음.

결론

비정규화는 관계형 데이터베이스 설계의 정규화 원칙을 일부 희생하되, 쿼리 성능개발 편의성을 높이기 위해 의도적으로 중복 데이터를 허용하는 전략입니다.

  • 장점: 조회 속도 향상, SQL 복잡도 감소
  • 단점: 데이터 중복에 따른 무결성 문제, 저장 공간 증가

따라서 비정규화를 적용할 때는, 시스템 특성, 트래픽 패턴, 운영 부담 등을 고려하여 신중하게 결정해야 합니다.

'DB' 카테고리의 다른 글

MOLAP와 ROLAP  (0) 2025.03.10
Nested Data 란?  (0) 2025.03.02
DB Connection  (0) 2025.02.17
DB 관련 직업들과 역할  (0) 2025.02.13
OLTP DB vs OLAP DB ( 예시 쿼리 )  (0) 2025.02.11