데이터베이스를 설계할 때 가장 중요한 작업 중 하나는 `정규화(Normalization)`입니다. 정규화는 데이터의 중복을 제거하고, 데이터 무결성을 높이며, 유지보수를 용이하게 만드는 구조를 만들 수 있습니다.

이번 포스팅에서는 제1정규화부터 제3정규화까지의 과정을 단계별로 알아보도록 하겠습니다.

 

정규화(Normalization)란?

`정규화(Normalization)`는 관계형 데이터베이스에서 데이터의 중복을 줄이고, 데이터 일관성과 무결성을 보장하기 위해 테이블을 논리적으로 분해하는 작업입니다.

정규화를 적용하지 않으면 데이터 삽입, 수정, 삭제 시 다음과 같은 다양한 `이상현상(Anomalies)`이 발생할 수 있습니다.

  • 동일한 정보가 여러 곳에 저장되어 불일치 발생
  • 일부 데이터를 입력하려면 불필요한 다른 데이터도 입력해야함
  • 데이터 삭제 시 원치 않는 정보까지 함께 삭제되는 현상

 

이를 방지하기 위해 다음과 같은 정규화 단계를 거칩니다.

  • `제1정규화 (1NF)` 반복되는 그룹 제거, 원자값 사용
  • `제2정규화 (2NF)` 부분 함수 종속 제거
  • `제3정규화 (3NF)` 이행적 함수 종속 제거

 

비정규화 테이블 : 시작점

비정규화 예시 이미지

초기 상태의 상품 주문 테이블은 하나의 행에 여러 개의 상품 정보가 들어 있는 비정규화된 구조입니다.

이는 반복되는 속성 그룹, 다중 값 필드, 데이터 중복으로 인해 다음과 같은 문제가 발생합니다.

  • `비원자값(Non-atomic Value)` 하나의 셀에 여러 값이 들어 있어 SQL 쿼리 복잡도 증가
  • `데이터 무결성 저하` 중복된 정보가 다수 존재해 일관성 유지가 어려움
  • `삽입, 수정, 삭제 이상 발생` 상품이 없는 주문을 추가하거나 삭제할 수 없음

 

이처럼 비정규화 테이블은 데이터 중복, 무결성 저하, 비효율적인 쿼리 처리 등의 문제를 일으켜 데이터베이스 운영에 큰 걸림돌이 될 수 있습니다. 이를 해결하기 위해서는 제1정규화(1NF)를 필요로 하게 됩니다.

 

제1정규화(1NF) : 원자값으로 분해

제1정규화(1NF)는 `테이블 내의 모든 속성(컬럼)이 원자값(Atomic Value)을 갖도록 만드는 것이 핵심`입니다.

즉, `하나의 셀에는 오직 하나의 값만 존재해야 하며, 반복되는 그룹을 테이블에서 제거하는 작업`을 의미합니다.

 

비정규화 -> 제1정규화 예시 이미지

제1정규화의 개선점 및 한계점

 

개선점

  • `원자값 유지` 모든 컬럼이 더 이상 분해할 수 없는 원자값(Atomic Value)으로 구성되어, 다중값과 반복 그룹 문제 해결
  • `반복 그룹 제거` 상품 정보를 행 단위로 분리하여 SQL 쿼리 작성 효율 증가
  • `이상현상 감소` 삽입, 삭제, 수정 시 발생할 수 있는 이상 현상이 줄어 데이터 일관성 증가

 

한계점

  • `부분 함수 종속` 복합 기본키(주문번호 + 상품명)를 사용하는 경우, 특정 속성(고객명, 주문일자)이 기본키의 일부인 주문번호에만 종속되어 데이터 중복 발생
    • ex: 고객명과 주문일자는 `주문번호`에만 종속되지만 상품명과 수량, 가격과는 무관
  • `데이터 중복 및 무결성 문제` 고객명, 주문일자 등 동일 정보가 상품별로 여러 번 저장되면서 저장 공간 낭비 및 데이터 불일치 위험 존재
  • `삽입, 삭제 이상` 삽입 이상과 삭제 이상에 대한 완전한 해결 불가능
    • ex: 상품이 아직 선택되지 않은 주문은 입력할 수 없고, 특정 상품 삭제 시 주문 정보까지 삭제될 위험 존재

 

제1정규화를 적용해 원자값과 반복 그룹 문제를 해결하였지만, 여전히 `데이터 중복, 부분 함수 종속`에 의한 문제는 남아있습니다.

위 문제를 해결하기 위해 제2정규화(2NF)를 필요로 하게 됩니다.

 

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

제2정규화(2NF)는 제1정규화 조건을 만족하면서, 테이블의 모든 비주요 속성이 기본키의 전부에 완전 함수 종속되도록 만드는 것을 의미합니다.

즉, 복합 기본키를 사용하는 테이블에서 기본키의 일부에만 종속된 속성(부분 함수 종속)을 제거하는 과정입니다.

`복합 기본키의 일부만으로 다른 값을 알 수 있을 때 = 부분 함수 종속`

 

제1정규화 -> 제2정규화 예시 이미지

제1정규화를 마친 테이블을 다시 살펴보면 기본키는 `회원코드 + 상품코드` 복합키로 구성되어 있습니다. 그런데 `회원명, 회원주소는 회원코드`만으로, `상품명, 상품가격, 카테고리정보도 상품코드`만으로 결정됩니다.

이처럼 `기본키의 일부`에만 종속된 속성들은 따로 테이블로 나눠주어 제2정규화 조건을 만족시켜주게 됩니다.

 

제2정규화의 개선점 및 한계점

 

개선점

  • `부분 함수 종속 제거` 회원 정보, 상품 정보를 별도 테이블로 분리하여 논리적 명확성과 데이터 재사용성 증가
  • `중복 제거` 동일 고객 정보, 상품 정보를 반복 저장하지 않아 저장 공간 절약 및 무결성 보장
  • `수정 효율 향상` 고객 주소나 상품 가격 변경 시 하나의 테이블만 수정

 

한계점

  • `이행적 함수 종속 발생 가능` 상품 테이블에서 상품코드 → 카테고리명 → 카테고리설명 구조는 이행적 종속에 해당됩니다.

 

제3정규화(3NF) : 이행적 함수 종속 제거

제2정규화를 통해 부분 함수 종속을 제거했지만, 여전히 `이행적 함수 종속`으로 인해 데이터 중복과 무결성 문제를 일으킬 수 있는 또 다른 형태의 종속 관계가 존재할 수 있습니다.

이행적 함수 종속이란, 어떤 비주요 속성이 또 다른 비주요 속성을 통해 간접적으로 기본키에 종속되는 경우를 의미합니다.

이러한 이행적 종속이 존재하면 다음과 같은 문제가 발생할 수 있습니다.

  • `데이터 중복` 같은 카테고리명이 반복되며 같은 설명 여러번 저장
  • `무결성 저하` 한 카테고리 설명만 변경해도 모든 행 수정 필요
  • `삽입, 삭제 이상` 설명만 등록하거나, 설명 삭제 시 다른 정보까지 영향받을 수 있음

 

제2정규화 → 제3정규화 예시 이미지

 

예를 들어, 제2정규화를 마친 테이블에 `기본키 = 상품코드, 속성 = 카테고리명, 카테고리 설명` 이렇게 존재하는데 `상품코드 → 카테고리명 → 카테고리 설명` 처럼 `비주요 속성인 카테고리명이 또 다른 속성 카테고리설명`을 결정하고 있으므로, 이는 이행적 종속에 해당하므로 제3정규화를 통해 카테고리 테이블로 분리하여 상품테이블에서는 카테고리 코드를 참조하여 사용하게 됩니다.

위 예시 이미지를 통해 `상품코드 → 카테고리명 → 카테고리 설명` 즉, `A → B, B → C, 따라서 A → C` 조건을 만족시켜 이행 함수 종속을 제거하고 제3정규화 조건을 만족시키게 됩니다.

 

제3정규화의 개선점 및 한계점

 

개선점

  • `이행적 종속 제거` 비주요 속성 간의 종속 관계 제거로 논리적 구조 명확화
  • `데이터 중복 최소화` 동일한 카테고리 설명 반복 저장 방지
  • `무결성 향상` 하나의 테이블만 수정하여 일관성 유지
  • `삽입, 삭제 이상 제거` 특정 속성만 단독 관리 가능

 

한계점

  • `JOIN 증가` 테이블이 여러 개로 분리되면서 쿼리 작성 시 JOIN이 많이 이루어짐
  • `복잡도 상승` 너무 많은 정규화는 성능 저하나 관리 복잡도를 유발할 수 있음

 

마무리

이번포스팅에서는 정규화의 필요성과 제1정규화부터 제3정규화까지의 개념과 적용 방법에 대해 알아보았습니다. 정규화는 데이터베이스의 구조를 보다 논리적이고 효율적으로 만들기 위한 필수 과정이며, 데이터 중복과 이상현상을 줄이고 유지보수성을 높이기 위해서는 정규화 원칙에 대한 이해를 필요로 하게 됩니다.

그러나 정규화가 항상 정답은 아니며, 지나치게 정규화된 구조는 JOIN 연산의 증가와 성능 저하로 이어질 수 있으며, 실제 운영 환경에서는 비정규화가 필요한 경우도 존재합니다. 데이터의 사용 패턴, 조회 빈도, 성능 요구사항 등을 고려하여 적절한 수준의 정규화와 비정규화를 조합하는 것이 중요합니다.

 

단계 핵심 목적 제거 대상 주요 특징
1NF 원자값 유지 반복 그룹, 다중 값 셀마다 하나의 값만 존재
2NF 부분 함수 종속 제거 기본키 일부에만 종속된 속성 복합키의 전부에 완전 종속하도록 분리
3NF 이행적 함수 종속 제거 비주요 속성 간 종속 관계 비주요 속성은 기본키에만 직접 종속