데이터베이스 정규화(Normalization)란?

송현진·2025년 7월 9일
0

DataBase

목록 보기
7/10

정규화란?

정규화(Normalization)데이터의 중복을 줄이고 이상 현상(Anomaly)을 방지하기 위한 데이터베이스 설계 기법이다. 관계형 데이터베이스에서 데이터를 효율적이고 논리적으로 구조화하는 데 목적이 있다. 즉, 중복된 데이터를 없애고 테이블 간의 관계를 정리해서 데이터 무결성과 저장 효율성을 높이기 위한 과정이다.

이상 현상(Anomaly)이란?

정규화를 하지 않으면 다음과 같은 문제가 발생할 수 있다.

  • 삽입 이상 (Insert Anomaly): 어떤 데이터를 넣으려면 불필요한 다른 데이터도 같이 넣어야 하는 문제
  • 삭제 이상 (Delete Anomaly): 어떤 데이터를 지우면 의도치 않은 다른 데이터까지 같이 삭제되는 문제
  • 갱신 이상 (Update Anomaly): 중복된 데이터가 여러 군데 있을 경우 하나만 수정하면 데이터 불일치 발생 가능성

예시 테이블 (정규화 전)

학생ID이름과목교수명학과코드학과명
1홍길동C, C++김교수CS컴퓨터공학과
2이순신C++김교수CS컴퓨터공학과
3강감찬JAVA이교수EE전자공학과
  • C++ 과목 교수명이 변경되면 모든 C++ 행을 갱신해야 함 -> 갱신 이상 발생 가능
  • JAVA 수업이 폐강되어 행을 삭제하면 강감찬 학생 정보까지 사라질 수 있음 -> 삭제 이상

제 1정규화 (1NF)

제 1정규화란 테이블의 컬럼이 원자값(Atomic Value)을 갖도록 테이블을 분해하는 것이다. 아래와 같은 규칙들을 만족해야 한다.

  1. 각 컬럼이 하나의 속성만을 가져야 한다.
  2. 하나의 컬럼은 같은 종류나 타입(type)의 값을 가져야 한다.
  3. 각 컬럼이 유일한 이름을 가져야 한다.
  4. 컬럼의 순서가 상관없어야 한다.

예시 테이블을 제 1정규화를 진행한 테이블은 아래와 같다.

학생ID이름과목교수명학과코드학과명
1홍길동C김교수CS컴퓨터공학과
1홍길동C++김교수CS컴퓨터공학과
2이순신C++김교수CS컴퓨터공학과
3강감찬JAVA이교수EE전자공학과

제 2정규화 (2NF)

제 2정규화란 제 1정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해하는 것이다. 여기서 완전 함수 종속이라는 것은 기본키의 부분 집합이 결정자가 되어선 안된다는 것을 의미한다. 아래와 같은 규칙을 만족해야 한다.

  1. 제 1정규화를 만족해야 한다.
  2. 모든 컬럼이 부분적 종속(Partial Dependecy)이 없어야 한다. 모든 컬럼이 완전 함수 종속을 만족해야 한다.

제 1정규화 테이블을 예시로 들자면

학생ID이름과목교수명학과코드학과명
1홍길동C김교수CS컴퓨터공학과
1홍길동C++김교수CS컴퓨터공학과
2이순신C++김교수CS컴퓨터공학과
3강감찬JAVA이교수EE전자공학과

위 테이블에서는 학생 정보가 과목과는 상관없이 중복 저장되고 있다. 이는 기본키 (학생ID, 과목)학생ID에만 의존하는 컬럼들이 존재한다는 뜻이다. → 부분 함수 종속 발생
따라서 테이블을 아래처럼 학생 테이블수강 테이블로 나누어 정규화한다.

학생 테이블
학생 ID 이름 학과코드 학과명
1 홍길동 CS 컴퓨터공학과
2 이순신 CS 컴퓨터공학과
3 강감찬 EE 전자공학과
수강 테이블
학생 ID 과목 교수명
1 C 김교수
1 C++ 김교수
2 C++ 김교수
3 JAVA 이교수

제 3정규화 (3NF)

제 3정규화란 제 2정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 테이블을 분해하는 것이다. 여기서 이행적 종속이라는 것은 A -> B, B -> C가 성립 할 때 A -> C가 성립되는 것을 의미한다. 아래와 같은 규칙을 만족해야 한다.

  1. 제 2정규화를 만족해야 한다.
  2. 기본키를 제외한 속성들 간의 이행 종속성(Transitive Dependency)이 없어야 한다.
학생 테이블
학생 ID 이름 학과코드
1 홍길동 CS
2 이순신 CS
3 강감찬 EE
학과 테이블
학과코드 학과명
CS 컴퓨터공학과
EE 전자공학과

학생 테이블 안에는 학과코드 -> 학과명이라는 비주요 속성 간의 종속성이 존재한다.
하지만 학생ID -> 학과코드도 성립하므로 결과적으로 학생ID -> 학과명이라는 이행적 종속이 발생하게 된다. 이 종속성을 제거하기 위해 학과명을 별도의 테이블로 분리한다.

BCNF 정규화 (Boyce-codd Normal Form)

BCNF는 3NF보다 더 엄격한 정규형으로, 결정자가 반드시 후보키여야 한다는 제약 조건이 추가된다. BCNF는 다음과 같은 규칙을 만족해야 한다.

  1. 제 3정규화를 만족해야 한다.
  2. 모든 결정자가 후보키 집합에 속해야 한다.

3NF는 만족하지만 BCNF는 위반하는 경우

과목교수명강의실
C김교수101호
C++김교수101호
JAVA이교수202호

위 테이블에서 후보키는 과목이다. 하지만 교수명 -> 강의실이라는 함수 종속이 존재하고 교수명은 후보키가 아니기 때문에 BCNF 정규형을 위반하게 된다.

이 문제를 해결하기 위해 아래와 같이 과목 테이블교수 테이블로 나누어 정규화한다.

과목 테이블
과목 교수명
C 김교수
C++ 김교수
JAVA 이교수
교수 테이블
교수명 강의실
김교수 101호
이교수 202호

제 4정규화 (4NF)

제4정규화(4NF)다치 종속(Multivalued Dependency)을 제거하는 정규형이다. 여기서 다치 종속은 A ->-> B라고 표기하고
한 테이블에서 하나의 기본키에 대해 두 개 이상의 독립적인 다중값 속성이 존재할 경우 -> 4NF를 위반한 것이다.

  1. 제 3정규화를 만족해야 한다.
  2. 모든 다치 종속이 후보키에 종속되도록 만들어야 한다.

예시: 4NF 위반 테이블

강사ID가능한 요일가능한 지역
T1월요일서울
T1월요일부산
T1수요일서울
T1수요일부산

강사ID T1은 월요일, 수요일 각각 가능하며 서울, 부산 각각 가능하다. 즉, 강사ID ->-> 요일, 강사ID ->-> 지역 두 다치 종속이 독립적으로 존재 -> 다치 종속이 중복 조합을 발생시킴 → 4NF 위반

강사 가능 요일 테이블
강사ID 가능한 요일
T1월요일
T1수요일
강사 가능 지역 테이블
강사ID 가능한 지역
T1서울
T1부산

이처럼 독립적인 다중값 속성들을 별도 테이블로 분리함으로써 다치 종속을 제거하고 중복을 방지할 수 있다.

제 5정규화 (5NF)

제 5정규화는 모든 조인 종속(Join Dependency)이 후보키에 의해서만 결정되도록 하는 정규형이다. 쉽게 말해 정상적인 재조인이 불가능한 경우를 해결하여 정보 손실 없이 원래 테이블을 복원할 수 있도록 한다.

조인 종속(Join Dependency)이란?

어떤 테이블을 여러 개로 분해했다가 다시 조인했을 때 원래 테이블과 정확히 같아야 한다. 이게 보장되지 않으면 제5정규화를 위반하는 것이다.

예시: 5NF 위반 테이블

제품ID부품공급업체
P1B1S1
P1B2S1
P1B1S2
P1B2S2

이 테이블은 "P1 제품은 B1, B2 부품으로 구성되며 S1, S2 업체 모두 제공 가능"을 의미한다. 이 데이터를 세 테이블로 나눌 수 있다.

  • 제품-부품: P1 - B1 / B2
  • 제품-공급업체: P1 - S1 / S2
  • 부품-공급업체: B1/B2 - S1/S2

그러나 이들을 다시 조인하면 불필요한 조합까지 생길 수 있어서 5NF 위반 상황 발생한다.

제품-부품
제품ID부품
P1B1
P1B2
제품-공급업체
제품ID공급업체
P1S1
P1S2
부품-공급업체
부품공급업체
B1S1
B2S2

이 세 테이블을 조인했을 때 정확한 조합만 복원되어야 제5정규화를 만족한다. 만약 추가적인 잘못된 조합이 생긴다면 조인 종속이 깨졌다는 의미이며 이는 5NF 위반이다.

DB에서 정규화를 고려한 설계란?

실제 DB 설계에서는 다음을 고려하여 정규화를 진행해야 한다.

  • 중복 제거: 데이터 일관성과 무결성 확보
  • 업데이트/삽입/삭제 이상 방지
  • 확장성 고려: 새로운 속성이나 관계 추가가 쉬움
  • 성능과의 타협: 지나치게 분해되면 조인 성능 저하 -> 필요한 경우 역정규화(denormalization)

정규화는 “어디까지 나눌 것인가”에 대한 균형 잡힌 판단이 중요하다.

📝 배운점

정규화를 학습하면서 단순히 중복 제거가 아니라 데이터 간의 의미적 관계를 명확히 정의하고 관리하는 것이 핵심이라는 것을 느꼈다. 특히 4NF와 5NF는 단순 함수 종속을 넘어서 다치 종속과 조인 종속까지 고려해야 하기 때문에 실제 데이터가 어떤 상황에서 유효하고 어떤 경우에는 불필요한 정보가 조인으로 생성될 수 있는지까지 생각하게 되었다.

실무에서는 성능과 조인 비용 문제로 5NF까지 정규화를 진행하는 경우는 드물지만 복잡한 도메인일수록 정규화에 대한 이해도가 유지보수성과 확장성에 큰 차이를 만든다는 점을 확실히 깨달았다. 앞으로 DB 설계 시 단순히 정규화 여부를 따지기보다는 데이터 간 관계, 의미, 변경 가능성까지 고려하여 구조를 잡아나가야겠다.


참고

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

0개의 댓글