관계형 데이터베이스 관리 시스템(RDBMS)의 정규화는 데이터베이스 설계의 중요한 단계 중 하나로, 데이터 중복을 최소화하고 데이터의 일관성, 무결성, 유지보수 용이성을 향상시키기 위한 프로세스입니다. 정규화는 데이터베이스 내의 테이블을 나누고 조직화하여 복잡한 데이터 구조를 단순화하고, 데이터 이상 현상을 방지하며 효율적인 검색과 조작을 가능하게 합니다.
정규화는 주로 E.F. Codd에 의해 개발된 일련의 형식적인 규칙을 따라 데이터를 구조화합니다. 이 규칙은 정규형(Normal Form)이라는 수준으로 데이터의 구조를 나타내며, 높은 정규형 수준은 데이터의 중복을 제거하고 의미적으로 관련된 데이터를 더 작은 테이블로 분리함으로써 데이터의 일관성과 효율성을 증가시킵니다.
일반적으로 데이터베이스는 다음과 같은 정규형 수준을 따르도록 설계됩니다:
- 제1 정규형(1NF): 각 열(속성)은 원자값(더 이상 분해할 수 없는 값)만을 포함하며, 중복된 데이터를 허용하지 않습니다. 예를 들어 하나의 "주문" 테이블 내 에서 "상품 목록" 이라는 열에 여러 상품을 쉼표로 구분하여 저장하는 것은 1NF를 위반하는 것입니다.
- 제2 정규형(2NF): 모든 비주요키 속성이 부분 함수 종속성을 가지지 않도록 데이터를 구조화합니다. 예를 들어, "주문 상품" 테이블에서 주요 키가 "주문 번호(Order ID)"와 "상품 ID(Product ID)"로 구성되고, 해당 주문의 날짜와 상품의 설명이 포함된다고 가정해봅시다. 이 경우 주문 번호만으로 날짜를 결정할 수 있으므로 "날짜"는 주요 키의 전체에 함수적으로 종속되지 않습니다. 이것은 부분 함수 종속성이며, 이를 제거해야 제 2 정규형을 만족시킬 수 있습니다.
- 제3 정규형(3NF): 이행 함수 종속성을 제거하여 모든 속성이 후보키에 종속되도록 데이터를 조직화합니다. 예를 들어, "학생 성적" 테이블에서 주요 키가 "학생 ID"와 "과목 ID"로 구성되고, 해당 학생의 이름이 "과목 ID"에 종속되는 경우를 생각해봅시다. "과목 ID"에 직접 종속된 것은 아니지만, "학생 ID"를 통해 간접적으로 "과목 ID"에 종속되는 것이 이행 함수 종속성입니다. 이 경우 "학생 ID"와 "과목 ID"는 주요 키의 일부분이므로, 제 3 정규형을 만족시키지 못합니다.
- 보이스-코드 정규형(BCNF): 모든 결정자가 후보키여야 하며, 이로 인해 중복된 데이터를 피하고 일관성을 유지합니다.
높은 정규형 수준은 데이터 중복을 최소화하고 데이터 이상 현상을 줄이지만, 더 많은 테이블과 조인이 필요할 수 있어 데이터베이스의 성능에 영향을 줄 수 있습니다. 따라서 설계자는 데이터베이스의 크기, 사용 패턴 및 요구 사항을 고려하여 적절한 정규형 수준을 선택해야 합니다.