정규화
정규화 (Normalization)
📝 개념 정의
데이터의 중복을 제거하고 데이터 무결성을 보장하기 위해 테이블을 분해하는 과정입니다.
핵심:
- 결정자에 의한 함수적 종속성 기반
- 입력/수정/삭제 이상 현상 제거
- 데이터 용량 최소화
🎯 정규화의 목적
이상 현상 (Anomaly) 제거
삽입 이상 (Insertion Anomaly):
- 불필요한 데이터를 함께 저장해야 함
갱신 이상 (Update Anomaly):
- 중복 데이터 중 일부만 수정하여 불일치 발생
삭제 이상 (Deletion Anomaly):
- 필요한 데이터까지 함께 삭제됨
정규화 효과
✅ 데이터 중복 최소화 ✅ 데이터 무결성 보장 ✅ 유연성 극대화 (High Cohesion & Loose Coupling) ✅ 저장 공간 절약
📚 핵심 용어
함수적 종속성 (Functional Dependency, FD)
정의:
- 컬럼 A의 값을 알면 컬럼 B의 값을 알 수 있을 때
- 컬럼 B는 컬럼 A에 함수적 종속성이 있음
표기: A → B
예시:
- 학번 → 학생 이름
- 주민등록번호 → 생년월일
결정자 (Determinant)
함수적 종속성에서 값을 결정하는 컬럼 (A → B에서 A)
다치 종속 (Multi-Valued Dependency, MVD)
결정자 A에 의해 컬럼 B의 값을 여러 개 알 수 있을 때
🔢 정규화 단계
제1정규형 (1NF)
규칙: 모든 속성은 원자 값을 가져야 함
위반 사례
| 학번 | 이름 | 취미 | |------|------|------| | 1001 | 주디 | 독서, 영화, 운동 |
문제: 취미 컬럼이 다중 값
해결
방법 1: Row 분리
| 학번 | 이름 | 취미 | |------|------|------| | 1001 | 주디 | 독서 | | 1001 | 주디 | 영화 | | 1001 | 주디 | 운동 |
방법 2: 테이블 분리
학생 테이블:
| 학번 | 이름 | |------|------| | 1001 | 주디 |
취미 테이블:
| 학번 | 취미 | |------|------| | 1001 | 독서 | | 1001 | 영화 | | 1001 | 운동 |
제2정규형 (2NF)
규칙: 1NF + 모든 Non-Key 컬럼은 기본 키 전체에 종속
부분 종속 제거 (Partial Dependency)
위반 사례
수강 테이블 (PK: 학번 + 과목코드):
| 학번 | 과목코드 | 학생이름 | 과목이름 | 성적 | |------|----------|----------|----------|------| | 1001 | CS101 | 주디 | 데이터베이스 | A |
문제:
- 학생이름은 학번에만 종속 (부분 종속)
- 과목이름은 과목코드에만 종속 (부분 종속)
해결
학생 테이블:
| 학번 | 학생이름 | |------|----------| | 1001 | 주디 |
과목 테이블:
| 과목코드 | 과목이름 | |----------|----------| | CS101 | 데이터베이스 |
수강 테이블:
| 학번 | 과목코드 | 성적 | |------|----------|------| | 1001 | CS101 | A |
제3정규형 (3NF)
규칙: 2NF + 이행적 종속 제거 (Transitive Dependency)
일반 속성 간 종속 관계 제거
위반 사례
학생 테이블 (PK: 학번):
| 학번 | 이름 | 학과코드 | 학과이름 | |------|------|----------|----------| | 1001 | 주디 | CS | 컴퓨터공학 |
문제:
- 학번 → 학과코드 → 학과이름 (이행적 종속)
- 학과이름은 학번이 아닌 학과코드에 종속
해결
학생 테이블:
| 학번 | 이름 | 학과코드 | |------|------|----------| | 1001 | 주디 | CS |
학과 테이블:
| 학과코드 | 학과이름 | |----------|----------| | CS | 컴퓨터공학 |
BCNF (Boyce-Codd Normal Form)
규칙: 3NF + 모든 결정자는 후보 키
결정자 중 후보 키가 아닌 것 제거
특징
- 3NF보다 엄격
- 실무에서 3NF까지만 적용하는 경우 많음
제4정규형 (4NF)
규칙: BCNF + 다치 종속 제거
제5정규형 (5NF)
규칙: 4NF + 조인 종속성 제거
📊 정규화 단계 요약
| 정규형 | 제거 대상 | 핵심 규칙 | |--------|-----------|-----------| | 1NF | 다중 값 | 원자 값만 허용 | | 2NF | 부분 종속 | 기본 키 전체에 종속 | | 3NF | 이행적 종속 | 일반 속성 간 종속 제거 | | BCNF | 결정자 | 모든 결정자는 후보 키 | | 4NF | 다치 종속 | MVD 제거 | | 5NF | 조인 종속 | Join Dependency 제거 |
⚖️ 정규화 vs 반정규화
정규화의 장단점
장점: ✅ 데이터 중복 최소화 ✅ 이상 현상 방지 ✅ 데이터 무결성 보장 ✅ 저장 공간 절약
단점: ❌ 조회 시 JOIN 증가 ❌ 복잡한 쿼리 ❌ 조회 성능 저하 가능
반정규화 (Denormalization)
목적:
- 조회 성능 향상
- JOIN 연산 감소
방법:
- 테이블 통합
- 중복 컬럼 추가
- 파생 컬럼 추가
고려사항:
- 데이터 일관성 관리 필요
- 저장 공간 증가
- INSERT/UPDATE 성능 저하
💡 실무 적용
일반적인 적용 수준
OLTP (Online Transaction Processing):
- 3NF까지 적용
- 데이터 무결성 중요
- 예: 은행 시스템, 주문 시스템
OLAP (Online Analytical Processing):
- 반정규화 적용
- 조회 성능 중요
- 예: 데이터 웨어하우스, BI 시스템
성능 고려사항
정규화 효과:
- INSERT/UPDATE/DELETE 성능 향상
- 조회 성능은 상황에 따라 다름
최적화 전략:
- 적절한 정규화 수준 선택
- 필요 시 부분적 반정규화
- 인덱스 활용
❓ 면접 질문 예시
Q1. 정규화란 무엇이고 왜 필요한가요?
답변: 정규화는 데이터의 중복을 제거하고 데이터 무결성을 보장하기 위해 테이블을 분해하는 과정입니다. 삽입/갱신/삭제 이상 현상을 방지하고, 데이터 일관성을 유지하며, 저장 공간을 절약할 수 있습니다.
Q2. 제1, 2, 3정규형을 설명해주세요.
답변:
- 1NF: 모든 속성이 원자 값을 가져야 합니다. 다중 값을 가진 컬럼을 분리합니다.
- 2NF: 1NF + 부분 종속 제거. 모든 Non-Key 컬럼이 기본 키 전체에 종속되어야 합니다.
- 3NF: 2NF + 이행적 종속 제거. 일반 속성 간 종속 관계를 제거합니다.
Q3. 함수적 종속성이란?
답변: 컬럼 A의 값을 알면 컬럼 B의 값을 알 수 있을 때, 컬럼 B는 컬럼 A에 함수적 종속성이 있다고 합니다. 예를 들어, 학번을 알면 학생 이름을 알 수 있으므로 학생 이름은 학번에 함수적 종속입니다.
Q4. 정규화의 단점과 반정규화를 하는 이유는?
답변: 정규화의 단점은 조회 시 여러 테이블을 JOIN해야 하므로 쿼리가 복잡해지고 조회 성능이 저하될 수 있습니다. 반정규화는 조회 성능을 향상시키기 위해 의도적으로 중복을 허용하는 것으로, OLAP 시스템이나 조회가 빈번한 경우에 사용합니다.
Q5. 실무에서 어느 정도까지 정규화를 적용하나요?
답변: 일반적으로 OLTP 시스템에서는 3NF까지 적용합니다. BCNF 이상은 너무 엄격하여 실무에서는 잘 사용하지 않습니다. OLAP 시스템이나 데이터 웨어하우스에서는 조회 성능을 위해 부분적으로 반정규화를 적용하기도 합니다.
📚 원본 참고 자료
출처: 2023-CS-Study
- 링크: db_erd_normalization.md
- 내용: ERD, 정규화 과정, 1NF~3NF