icon

안동민 개발노트

8장 : 정규화

정규화가 필요한 이유

테이블을 왜 이렇게 많이 쪼개놓았나요? — 정규화를 모르면 이 질문에 답할 수 없고, 데이터 이상 현상에 시달리게 됩니다. 정규화는 관계형 데이터베이스 설계의 근간이며, 좋은 테이블 구조와 나쁜 테이블 구조를 구분하는 기준입니다.

테이블 설계를 잘못하면 데이터의 중복이 발생하고, 중복은 이상 현상을 유발합니다. 정규화는 이 문제를 체계적으로 해결하는 방법론입니다. 1970년대 에드거 커드(Edgar F. Codd)가 제안한 이래, 오늘날까지 데이터베이스 설계의 표준으로 자리잡고 있습니다.


왜 하나의 테이블에 모든 것을 넣으면 안 되는가

초보 개발자는 종종 테이블 하나에 다 넣으면 편하지 않나?라고 생각합니다. 조인도 필요 없고, 쿼리도 간단해 보입니다. 하지만 이 접근은 데이터가 쌓이면서 심각한 문제를 일으킵니다.


이상 현상

하나의 테이블에 너무 많은 정보를 넣으면 이상 현상(Anomaly)이 발생합니다. 다음은 학생·과목·교수 정보를 하나의 테이블에 넣은 사례입니다.

삽입 이상 (Insertion Anomaly)

불필요한 데이터 없이는 새로운 데이터를 삽입할 수 없는 문제입니다.

삽입 이상 예시
상황: 새 과목 "네트워크"를 개설하고 교수를 배정하고 싶다.

문제: 이 테이블의 기본키는 {학번, 과목명}이다.
      아직 수강 신청한 학생이 없으면 학번이 NULL이 된다.
      → 기본키에 NULL을 넣을 수 없으므로 삽입 불가!

해결: 수강 신청 학생이 생길 때까지 과목 정보를 등록할 수 없다.
      또는 가짜 학번을 넣어야 하는데, 이는 데이터 오염이다.

삭제 이상 (Deletion Anomaly)

원하지 않는 데이터까지 함께 삭제되는 문제입니다.

갱신 이상 (Update Anomaly)

일부 행만 수정하면 데이터 불일치가 발생하는 문제입니다.

이상 현상 요약

이상 현상원인결과
삽입 이상불필요한 정보 없이 삽입 불가데이터 등록 제한
삭제 이상관련 없는 정보까지 삭제정보 소실
갱신 이상중복 데이터 일부만 수정데이터 불일치

이상 현상의 근본 원인은 하나의 테이블에 여러 주제의 데이터가 섞여 있기 때문입니다. 위 테이블에서 학생 정보, 과목 정보, 수강 관계라는 세 가지 주제가 한 테이블에 뒤섞여 있습니다.


이상 현상의 근본 원인: 데이터 중복

이상 현상은 결국 데이터 중복에서 비롯됩니다. 같은 사실이 여러 행에 반복 저장되면, 한 곳을 수정할 때 다른 곳과 불일치가 생기고, 삭제할 때 의도치 않은 정보가 사라지며, 삽입할 때 불필요한 정보를 함께 넣어야 합니다.


함수 종속

함수 종속(Functional Dependency, FD)은 정규화의 이론적 기반입니다. 어떤 속성이 어떤 속성을 결정하는지를 나타내는 관계입니다.

속성 X의 값이 결정되면 속성 Y의 값이 유일하게 결정될 때, Y는 X에 함수적으로 종속된다고 하며 X → Y로 표기합니다. X를 결정자(Determinant), Y를 종속자(Dependent)라 합니다. 여기서 X와 Y는 단일 속성일 수도, 복합 속성일 수도 있습니다.

함수 종속과 수학 함수의 관계

함수 종속을 찾는 방법

함수 종속은 현재 데이터의 상태가 아니라, 비즈니스 규칙을 기반으로 판단해야 합니다. 현재 인스턴스에서 우연히 1:1 매핑이 되더라도, 논리적으로 항상 성립하지 않으면 함수 종속이 아닙니다.


함수 종속의 유형

유형정의예시정규화 연관
완전 함수 종속기본키 전체에 종속{학번, 과목명} → 성적정상
부분 함수 종속기본키의 일부에만 종속{학번, 과목명} 중 학번 → 이름2NF 위반
이행 함수 종속A→B, B→C이면 A→C학번→학과, 학과→학과장3NF 위반

완전 함수 종속 (Full FD)

완전 함수 종속
기본키: {학번, 과목명}
성적은 학번만으로는 결정되지 않고, 과목명만으로도 결정되지 않는다.
반드시 {학번, 과목명} 전체가 있어야 성적이 결정된다.

→ 성적은 {학번, 과목명}에 완전 함수 종속
→ 이 관계는 정상이며, 분해할 필요 없음

부분 함수 종속 (Partial FD)

이행 함수 종속 (Transitive FD)

종속 관계 다이어그램

부분 함수 종속과 이행 함수 종속을 제거하는 것이 정규화의 핵심입니다. 정규화의 각 단계는 바로 이 종속 유형들을 하나씩 제거하는 과정에 해당합니다.


함수 종속의 추론 규칙 (Armstrong's Axioms)

주어진 함수 종속 집합으로부터 새로운 함수 종속을 논리적으로 유도할 수 있습니다. 암스트롱의 공리는 이 추론의 기반이 되며, 건전(sound)하고 완전(complete)함이 증명되어 있습니다.


정규화란

정규화(Normalization)는 릴레이션을 분해하여 이상 현상을 제거하는 과정입니다. 각 단계를 정규형(Normal Form)이라 하며, 상위 정규형은 하위 정규형의 조건을 모두 만족합니다. 즉, 3NF인 릴레이션은 반드시 2NF이고, 2NF인 릴레이션은 반드시 1NF입니다.

정규화의 원칙

정규화와 반정규화

정규화 vs 반정규화
정규화
  목적: 이상 현상 제거, 데이터 무결성 확보
  방법: 테이블 분해
  결과: 테이블 수 증가, 조인 증가
  장점: 데이터 정합성 보장, 수정/삭제 안전
  단점: 조회 시 조인으로 인한 성능 저하 가능

반정규화 (Denormalization)
  목적: 조회 성능 개선
  방법: 정규화된 테이블을 다시 합치거나 중복 허용
  결과: 테이블 수 감소, 조인 감소
  장점: 조회 속도 향상
  단점: 데이터 중복으로 이상 현상 재발 가능

원칙: 먼저 정규화를 충분히 수행한 후,
      성능이 문제될 때 필요한 부분만 반정규화
      "정규화가 기본, 반정규화는 예외"

정규화가 실무에서 왜 중요한가


정규화 사고 과정: 실전 예제

비정규화된 테이블을 보고 이상 현상과 함수 종속을 식별하는 연습을 해봅시다. 정규화 문제를 풀 때는 항상 함수 종속을 먼저 찾고, 이상 현상을 확인한 뒤, 분해 방향을 결정하는 순서를 따릅니다.

분해 후 검증

정규화를 통한 테이블 분해가 올바르게 이루어졌는지 검증하는 것은 매우 중요합니다. 분해된 테이블을 다시 자연 조인(Natural Join)했을 때 원래 테이블과 동일한 결과가 나와야 하며, 원래 없던 행이 생겨서도 안 됩니다.

분해 후 이상 현상 확인

정규화의 목적이 이상 현상 제거이므로, 분해 후 세 가지 이상 현상이 모두 사라졌는지 하나씩 확인해야 합니다.


클로저와 후보키 찾기

함수 종속 집합이 주어지면 속성 클로저(Attribute Closure)를 계산하여 후보키를 찾을 수 있습니다. 클로저란 주어진 속성 집합으로부터 함수 종속을 반복 적용하여 결정할 수 있는 모든 속성의 집합입니다.

속성 클로저(Attribute Closure) 계산
주어진 FD 집합: {A→B, B→C, A→D, D→E}

A의 클로저 A⁺ 계산
  시작: A⁺ = {A}
  A→B 적용: A⁺ = {A, B}
  B→C 적용: A⁺ = {A, B, C}
  A→D 적용: A⁺ = {A, B, C, D}
  D→E 적용: A⁺ = {A, B, C, D, E}

A⁺ = 전체 속성 → A는 슈퍼키
A의 부분집합에서 같은 결과 없음 → A는 후보키

핵심 정리

정규화 판단 체크리스트
□ 테이블이 하나의 주제(엔티티)만 다루고 있는가?
□ 모든 비키 속성이 기본키 전체에 완전 함수 종속인가?
□ 비키 속성 간 종속 관계(이행 FD)가 없는가?
□ 모든 결정자가 후보키인가?
□ 분해 후 정보 무손실 조인이 가능한가?
□ 분해 후 원래의 함수 종속이 보존되는가?

실무에서는 보통 3NF 또는 BCNF까지 적용합니다. 4NF와 5NF는 이론적으로 중요하지만, 실무에서 마주치는 경우는 드뭅니다. 다음 절에서 각 정규형을 예제와 함께 실습합니다.