본문으로 건너뛰기

데이터베이스에서 정규화(Normalization)는 테이블을 정리하여 중복 데이터를 최소화하고, 데이터 무결성을 보장하는 과정을 의미합니다. 이를 통해 데이터 저장 용량을 줄이고, 삽입·갱신·삭제 이상(Anomaly) 현상을 해결할 수 있습니다. 정규화는 여러 단계가 존재하며, 대표적으로 1 정규화(1NF), 2 정규화(2NF), 3 정규화(3NF), BCNF가 있습니다.

정규화 (Normalization)

✔️ 1NF (First Normal Form)

테이블 컬럼의 값이 원자값(Atomic Value)을 가지도록 정리하는 것을 의미합니다.

핵심 요건

요건설명
원자성(Atomicity)각 컬럼은 하나의 값만 가져야 함 (리스트, 배열, 콤마 구분값 불가)
반복 컬럼 금지phone1, phone2 같은 중복되는 컬럼 그룹은 허용되지 않음
테이블 구조 평탄화테이블 내 셀은 스칼라(단일) 값으로 구성되어야 함
행으로 분리하나의 컬럼이 여러 값을 가지면 여러 행으로 나누어 표현해야 함

❌ 1NF 위반

학생ID이름전화번호
1홍길동010-1234-5678, 010-9876-5432
2김영희010-2222-3333

전화번호 컬럼에 복수 개의 값이 들어 있음 → 비원자적 (1NF 위반)

✅ 1NF 적용

학생ID이름전화번호
1홍길동010-1234-5678
1홍길동010-9876-5432
2김영희010-2222-3333
각 셀은 하나의 원자값만 포함하고, 여러 전화번호는 행을 나눠서 표현

✔️ 2NF (Second Normal Form)

1 정규화를 진행한 테이블에서 완전 함수 종속을 만족할 수 있도록 테이블을 분해하는 것인데요. 쉽게 표현하자면, 기본 키의 일부에만 종속된 속성이 없도록 분해하는 것을 의미합니다. A 속성을 통해서 B 속성의 값이 유일하게 정해지는 관계에서 A를 결정자라고 합니다.

1 정규형(1NF)을 만족한 상태에서, 부분 함수 종속(Partial Dependency)을 제거하는 정규화 단계입니다. 1NF를 만족하고, 모든 비프라이머리 속성이 기본키의 전체에 완전 종속해야 합니다. 즉, 기본키의 일부만으로 결정되는 컬럼이 없어야 합니다.

❌ 2NF 위반 (1NF는 만족)

학생 테이블

학생ID이름전화번호
1홍길동010-1234-5678
1홍길동010-9876-5432
2김영희010-2222-3333
  • 기본키: (학생ID, 전화번호)
  • 이름학생ID에만 종속됨 (부분 함수 종속 발생 → 2NF 위반)

✅ 2NF 적용: 테이블 분해

1) 학생 테이블 (학생ID이름)

이름학생ID에만 의존 (완전 함수 종속) → 학생 테이블로 분리

학생ID이름
1홍길동
2김영희

2) 학생-전화번호 테이블 (학생ID전화번호)

전화번호는 여러 개일 수 있으므로 별도 테이블에서 관리

학생ID전화번호
1010-1234-5678
1010-9876-5432
2010-2222-3333

✔️ 3NF (Third Normal Form)

2 정규화를 진행한 테이블에서 이행적 종속을 제거하기 위해 테이블을 분해하는 것을 의미합니다. A가 B를 결정하고, B가 C를 결정하는 경우에는 A가 C의 결정자가 되는데요. 이를 이행적 종속이라고 합니다. 3NF을 만족하기 위해서는 이행적 종속이 제거되도록 테이블을 분리해야 합니다.

릴레이션 R이 3NF를 만족하려면, 다음 두 조건 중 하나라도 만족해야 합니다.
모든 함수 종속 X → Y에 대해,

  1. X가 후보키(Candidate Key)이어야 합니다.
  2. Y가 기본 속성(Prime Attribute: 후보키에 포함된 속성)이어야 합니다.

❌ 3NF 위반 (2NF는 만족)

학생 테이블

학생ID학과ID학과명
1C01컴퓨터공학
2C02전자공학
  • 기본키: 학생ID
  • 학과명학생ID학과ID학과명으로 이행적 종속
  • 학과명학과ID로 직접 결정되는 값이므로 3NF 위반

학생이 “컴퓨터공학과”라고 해서 학생 테이블에 학과명을 같이 넣으면
나중에 학과명이 “컴퓨터공학 → 인공지능공학”으로 바뀔 경우, 여러 학생 테이블 행을 모두 수정해야 합니다.

✅ 3NF 적용: 테이블 분해

1) 학생 테이블

학생ID학과ID
1C01
2C02

2) 학과 테이블

학과ID학과이름
C01컴퓨터공학
C02전자공학

✔️ BCNF (Boyce-Codd Normal Form)

3 정규화를 진행한 테이블의 모든 결정자가 반드시 후보키가 될 수 있도록 테이블을 분해하는 것을 의미합니다. BCNF를 만족하기 위해서는 후보키가 아닌 결정자가 존재하지 않도록 테이블을 분리해야 합니다.

릴레이션이 BCNF에 속하려면, 모든 함수적 종속 X → Y에 대해 X가 반드시 후보키여야 합니다.
즉, X가 후보키가 아닌데도 Y를 결정하는 경우가 있다면 BCNF를 만족하지 못합니다.

3NF와의 차이

  • 3NF는 이행적 종속 제거가 핵심이며, X가 후보키가 아니어도 Y가 기본 속성(Prime Attribute: 후보키에 포함된 속성)이면 OK.
  • 반면 BCNF는 X가 반드시 후보키여야 하므로 더 강한 제약을 가짐.

❌ BCNF 위반 (3NF는 만족)

학생 테이블

과목교수교재
CS101김교수C언어 기초
CS102이교수Java 완전 정복
CS101김교수C언어 기초
  • 후보키: (과목, 교수)
  • (과목, 교수) → 교재 : 교재는 후보키(과목, 교수)에 따라 결정됨 (3NF, BCNF 만족)
  • 교수과목 : 교수마다 가르치는 과목이 하나로 고정되어 있음 (과목은 기본 속성이므로 3NF 만족, 교수는 후보키가 아니므로 BCNF 위반)

✅ BCNF 적용: 테이블 분해

1) 교수 테이블

교수과목
김교수CS101
이교수CS102
  • 후보키: 교수
  • 교수과목 (함수 종속)

2) 교재 테이블

과목교재
CS101C언어 기초
CS102Java 완전 정복
  • 후보키: 과목
  • 과목교재 (함수 종속)

📌 데이터베이스 키의 종류

이름설명
기본 키 (Primary Key)각 레코드를 유일하게 식별하는 키 (null을 허용하지 않음)
후보 키 (Candidate Key)기본 키로 사용될 수 있는 속성들의 집합. 기본 키는 후보 키 중 하나 (유일성 조건을 만족하는 모든 키: 단일키/복합키)
대체 키 (Alternate Key)후보 키 중 기본 키로 선택되지 않은 나머지 키
복합 키 (Composite Key)두 개 이상의 컬럼으로 구성된 키
외래 키 (Foreign Key)다른 테이블의 기본 키를 참조하는 키
슈퍼 키 (Super Key)유일성을 만족하는 속성들의 집합 (후보 키보다 더 많은 속성을 포함할 수 있음)
자연 키 (Natural Key)실제 데이터에 기반한 키 (예: 주민번호, 이메일 등)
인공 키 (Surrogate Key)시스템이 생성한 의미 없는 유일 식별자 (예: 자동 증가 숫자)

역정규화 (Denormalization)

역정규화(Denormalization) 는 정규화된 데이터베이스에서 쓰기 성능을 희생하고 읽기 성능을 향상하기 위해 사용되는 전략입니다. 예를 들어, 전체 게시글의 수나 좋아요의 수를 계산해 특정 컬럼에 저장해서 읽기 성능을 항상 시킬 수 있습니다. 역정규화된 데이터베이스에서는 데이터의 중복을 허용하기 때문에 데이터의 일관성을 맞추기 위한 추가적인 작업이 필요합니다.

정규화를 통해 분해했던 테이블들을 다시 통합하거나 중복 데이터를 의도적으로 추가하는 작업입니다.
복잡한 조인 없이 빠르게 데이터를 조회하기 위해 사용합니다.

⚠️ 주의할 점
쓰기 작업이 많고 중복 데이터가 많아지면 동기화가 복잡해지므로, 보통 읽기 위주 시스템(예: 검색, 리포트 시스템)에서 활용됩니다.

구분정규화 (Normalization)역정규화 (Denormalization)
목적데이터 중복 제거, 무결성 유지조회 성능 향상, 조인 최소화
테이블 수많아짐줄어듦 또는 컬럼/데이터 중복 발생
유지보수쉬움 (수정 시 한 곳만 수정하면 됨)어려움 (중복된 데이터의 일관성 유지 필요)
조회 성능느릴 수 있음 (조인이 많아짐)빠름 (조인 없이도 필요한 정보 바로 조회 가능)
저장 공간적음많아짐 (중복 데이터로 인해)
데이터 무결성높음낮아질 수 있음 (중복으로 인해 불일치 가능성)
Loading comments...