정규화

기술노트
Admin (토론 | 기여)님의 2025년 9월 11일 (목) 16:50 판 (Gemini 벌크 업로더로 자동 업로드)
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)

데이터베이스 정규화 (Database Normalization)

데이터베이스 정규화(Normalization)란, 관계형 데이터베이스에서 데이터의 중복을 최소화하고 데이터의 일관성을 확보하기 위해, 테이블을 특정 규칙에 따라 재구성하고 분해하는 과정입니다. 정규화를 통해 데이터 구조를 더 효율적으로 만들어 데이터 이상 현상(Anomaly)을 방지할 수 있습니다.


🔍 정규화가 필요한 이유: 데이터 이상 현상 (Anomaly)

정규화되지 않은 테이블에서는 데이터를 추가, 수정, 삭제할 때 다음과 같은 문제가 발생할 수 있습니다.

  • 삽입 이상 (Insertion Anomaly) : 불필요한 데이터 없이는 어떤 데이터를 삽입할 수 없는 현상입니다. (예: 아직 수강신청을 하지 않은 신입생의 정보를, 수강 정보와 학생 정보가 합쳐진 테이블에 삽입할 수 없음)
  • 갱신 이상 (Update Anomaly) : 중복된 데이터 중 일부만 수정되어 데이터의 일관성이 깨지는 현상입니다. (예: 한 학생의 주소가 여러 행에 걸쳐 저장되어 있을 때, 일부만 수정하여 주소가 여러 개가 됨)
  • 삭제 이상 (Deletion Anomaly) : 어떤 정보를 삭제하면, 의도치 않은 다른 정보까지 함께 삭제되는 현상입니다. (예: 한 학생이 마지막 수강 과목을 취소했더니, 그 학생의 정보 자체가 테이블에서 사라짐)

📈 정규화 과정 (Normal Forms)

  • 제1정규형 (1NF)

> * '조건': 테이블의 모든 컬럼 값이 원자적 값(Atomic Value)을 가져야 합니다. (하나의 컬럼에 여러 값이 들어갈 수 없음)

  • 제2정규형 (2NF)

> * '조건': 제1정규형을 만족하고, 부분 함수 종속(Partial Functional Dependency)을 제거해야 합니다. 즉, 기본 키의 일부에만 종속되는 컬럼이 없어야 합니다. > * '설명': 기본 키가 여러 컬럼으로 구성된 '복합 키'일 경우에만 해당되며, 기본 키의 일부에만 종속되는 컬럼을 별도의 테이블로 분리합니다.

  • 제3정규형 (3NF)

> * '조건': 제2정규형을 만족하고, 이행 함수 종속(Transitive Functional Dependency)을 제거해야 합니다. 즉, 기본 키가 아닌 컬럼이 다른 일반 컬럼을 결정해서는 안 됩니다. > * '설명': A→B 이고 B→C 일 때, A→C 가 성립하는 종속 관계(A: 기본키, B,C: 일반컬럼)를 제거합니다. (예: 학생ID→학과명, 학과명→학과전화번호 관계에서, 학과 정보를 별도 테이블로 분리)

  • BCNF (Boyce-Codd Normal Form)

> * '조건': 제3정규형을 만족하고, 모든 결정자(Determinant)가 후보 키(Candidate Key)여야 합니다. 3NF보다 더 엄격한 정규형입니다.


💡 개발자 핵심 Point

  • 정규화의 핵심 목표는 데이터의 중복 최소화데이터 일관성 확보입니다.
  • 실무에서는 보통 제3정규형(3NF)까지 만족시키는 것을 목표로 데이터베이스를 설계합니다.
  • 과도한 정규화는 테이블 간의 `JOIN` 연산을 너무 많이 필요로 하여 오히려 조회 성능 저하를 유발할 수 있습니다.
  • 따라서, 조회 성능이 매우 중요한 경우에는 중복을 감수하고 의도적으로 정규화를 위배하는 반정규화(Denormalization)를 수행하기도 합니다.
  • 정규화와 반정규화는 트레이드오프(Trade-off) 관계로, 데이터의 '일관성'과 '성능' 사이에서 서비스의 특징을 고려하여 적절한 균형을 맞추는 설계가 중요합니다.