데이터베이스 정규화 vs 비정규화

송현진·2025년 6월 27일
0

CS공부

목록 보기
12/17

면접에서 "정규화와 비정규화가 뭔지 설명해보세요"라는 질문을 받았는데 순간 머릿속이 새하얘졌다. 머리 어딘가엔 들어본 기억이 있고 공부한 적도 분명 있는데 지금 당장 설명하려고 하니까 말이 안 나왔다.

그 짧은 순간이 지나고 나서야 “아, 이건 단순히 용어를 외우는 문제가 아니라 데이터베이스를 설계하는 사고방식 자체구나”라는 걸 깨달았다. 그래서 다시는 비슷한 질문 앞에서 막히지 않도록 정규화와 비정규화에 대해 개념, 목적, 사용 시점, 장단점까지 하나씩 확실히 정리해보기로 했다. 단순히 "정규형이 몇 가지 있다"는 식의 이론적인 접근이 아니라 왜 쓰는지, 언제 쓰는지, 실무에서는 어떻게 활용되는지를 중심으로 공부했다.

정규화란 무엇인가?

정규화란 한마디로 말해 데이터베이스 테이블을 구조적으로 “깔끔하게” 나누는 작업이다. 여기서 “깔끔하다”는 건 중복을 줄이고 한 개념이 하나의 테이블에만 존재하게 만들어 데이터 무결성(일관성)을 유지하는 것을 의미한다.

예를 들어 어떤 회사 직원 테이블이 있고 그 테이블에 '부서명'을 같이 적는다고 해보자. 그런데 부서명이 ‘개발부’에서 ‘개발팀’으로 바뀌면 이걸 모든 직원 행에서 다 바꿔야 한다. 하나라도 빼먹으면? 그때부터는 ‘어떤 부서가 진짜 맞는 건지’ 모르게 된다. 이런 걸 ‘갱신 이상(Anomaly)’이라고 하고 정규화는 이런 문제를 방지해준다.

즉, 정규화의 목적은 단순히 테이블을 분리하는 데 있는 게 아니라 변경에 강하고 중복이 없고 논리적으로 잘 설계된 데이터베이스 구조를 만드는 것이다.

그렇다면 왜 필요할까?

내가 느낀 정규화의 가장 큰 필요성은 데이터를 관리하기 쉽게 만들어준다는 점이다. 데이터를 반복해서 저장하지 않기 때문에 수정할 때도 하나만 고치면 되고 실수할 여지가 줄어든다. 특히 서비스가 커질수록 ‘데이터 정합성’이 점점 중요해진다. 테이블 설계가 정돈되어 있지 않으면 기능이 늘어날수록 문제가 커진다.

또한 정규화를 잘 해두면 확장성이 좋아진다. 예를 들어 상품 테이블에 카테고리 이름을 문자열로 계속 저장해두면 나중에 카테고리 필터 기능을 구현할 때 꽤나 골치 아프다. 반대로 카테고리를 따로 테이블로 관리하면 다이나믹하게 필터, 그룹, 정렬이 가능해진다. 정규화는 지금보다 ‘미래의 기능’을 위해 더 큰 의미가 있다.

어떨 때 사용하면 좋을까?

트랜잭션 처리가 많은 시스템에서 특히 유리하다. 예를 들어 사용자 정보, 주문, 결제 같은 테이블은 잦은 수정, 삽입, 삭제가 일어나기 때문에 데이터의 정합성과 무결성 유지가 최우선이다. 이런 경우 정규화를 적용해 중복을 최소화하고 이상 현상을 방지하는 것이 바람직하다. 또한 테이블 간의 관계가 명확해야 하는 도메인(예: 학교 시스템, 은행 시스템 등)에서는 정규화를 통해 데이터 모델을 직관적으로 표현할 수 있다. 이로 인해 유지보수와 기능 확장이 쉬워진다.

장점

  • 중복 제거: 동일한 정보를 여러 테이블에 저장하지 않음
  • 데이터 무결성 보장: 변경 시 한 곳만 수정하면 되므로 오류 가능성 감소
  • 확장성과 유지보수 용이: 스키마가 잘 정리돼 있어 기능 추가나 변경이 편리함
  • 논리적 구조: 데이터 간 관계를 명확하게 표현할 수 있음

단점

  • 조인 비용 증가: 여러 테이블로 나누다 보니 자주 조인해야 하고, 그만큼 쿼리 복잡도와 성능 부담이 생김
  • 조회 시 속도 저하 가능성: 특히 트래픽이 많거나 실시간 응답이 중요한 경우는 단순 조회에도 병목이 생길 수 있음
  • 비즈니스 요구와 충돌: 분석/통계처럼 결과 중심적인 데이터 활용에서는 정규화가 오히려 불편할 수 있음

비정규화란 무엇인가?

비정규화는 정규화의 반대 개념이 아니라 정규화를 기반으로 하되 성능이나 사용성, 특정 상황에 맞게 구조를 일부러 풀어주는 것이다. 즉, 일부러 중복을 허용하거나 테이블을 합치는 것이다.

보통은 성능을 위해 비정규화를 한다. 예를 들어 통계 페이지에서 사용자 정보와 주문 정보를 매번 JOIN해서 보여주기엔 비용이 크다면 사용자 이름, 이메일 등을 주문 테이블에 복사해서 같이 저장해버리는 것이다. 중복이 생기긴 하지만 조회는 빠르고 쿼리는 단순해진다.

비정규화는 잘못된 게 아니라 전략적 선택이다. 특히 읽기 성능이 중요한 분석 시스템이나 레포트 시스템에서는 비정규화가 오히려 더 적절할 때가 많다.

어떨 때 사용하면 좋을까?

비정규화는 조회가 빈번하고 실시간 응답 속도가 중요한 시스템에서 효과적이다. 특히 통계, 리포트, 대시보드 같은 분석(OLAP) 위주 시스템에서는 여러 테이블을 조인하는 것보다 중복을 감수하고 데이터를 하나의 테이블에 모아두는 게 훨씬 효율적일 수 있다. 또한 정형화된 리포트가 주기적으로 반복되는 경우에는 비정규화된 테이블 또는 뷰를 별도로 구성해서 성능을 보장하는 것이 실무에서 자주 쓰이는 방식이다. 캐싱이 필요한 경우에도 비정규화된 구조가 유리하다.

장점

  • 조회 성능 향상: JOIN 없이 단일 테이블에서 대부분의 데이터를 가져올 수 있음
  • 단순한 쿼리 구조: 쿼리가 직관적이고 관리하기 쉬움
  • 분석/통계에 유리: 반복적인 데이터 요약이 빨라짐

단점

  • 데이터 중복: 저장 공간 낭비 및 일관성 문제 유발 가능
  • 수정 시 오류 가능성 증가: 같은 데이터 여러 곳을 수정해야 하는 구조일 수 있음
  • 무결성 제약 약화: 정규화된 테이블에 비해 데이터 정합성 보장 어려움

📝 배운점

이번에 정규화와 비정규화 개념을 정리하면서 가장 크게 느낀 점은 이 두 개념은 절대적인 옳고 그름의 문제가 아니라는 것이다. 정규화는 데이터의 무결성과 관리의 편리함을 위한 설계 철학이고 비정규화는 성능과 현실적인 요구를 고려한 전략적 선택이다. 정규화는 기본적으로 모든 데이터베이스 설계의 출발점이 되어야 하며 데이터가 늘어나고 복잡해질수록 그 진가가 드러난다. 하지만 반대로 실시간 분석이나 대량 조회가 핵심인 시스템에서는 비정규화를 통해 성능을 확보하는 것이 실용적일 수 있다.

앞으로는 어떤 시스템을 설계할 때마다 "이 데이터를 얼마나 자주 읽는가?", "변경 빈도는 얼마나 되는가?", "정합성이 중요한가, 아니면 속도가 중요한가?" 같은 질문을 던지며 판단해야겠다고 느꼈다. 즉, 정규화는 ‘기본’, 비정규화는 ‘선택’이다. 둘의 개념을 정확히 이해한 상태에서 유연하게 적용할 수 있는 설계 역량이 진짜 실력이라는 걸 이번 면접을 통해 깨달았다.

정규화와 비정규화에 대해 간단하게 아래와 같이 정리할 수 있다.

Q. 정규화를 왜 하나요?
A. 데이터 중복을 줄이고 무결성을 유지하며 유지보수를 쉽게 하기 위해서입니다.

Q. 비정규화를 적용할 땐 어떤 상황인가요?
A. 실시간 조회 성능이 중요한 시스템이나 반복적인 통계 리포트를 빠르게 처리해야 할 때 고려합니다.


참고

profile
개발자가 되고 싶은 취준생

0개의 댓글