데이터 정규화(Normalization)란?
데이터 정규화(Normalization)란?
데이터 정규화(Normalization)는 관계형 데이터베이스에서 데이터를 구조화하여 중복을 줄이고, 무결성을 유지하며, 데이터 일관성을 높이는 과정입니다. 이를 통해 데이터 저장 효율성을 높이고, 업데이트 이상(Anomaly)을 방지할 수 있습니다.
데이터 정규화의 필요성
정규화를 하지 않으면 데이터베이스에 중복 데이터가 많아지고, 삽입·수정·삭제 시 데이터 불일치 문제가 발생할 수 있습니다. 예를 들어, 한 테이블에 고객 정보와 주문 내역이 함께 저장되어 있다면, 특정 고객 정보를 수정할 때 해당 고객의 주문이 여러 개 있다면 모든 행을 수정해야 합니다. 만약 일부만 수정된다면 데이터 일관성이 깨질 수 있습니다.
정규형(Normal Form)의 종류
정규화는 여러 단계로 진행되며, 각 단계는 "정규형(Normal Form)"이라고 불립니다. 일반적으로 1NF, 2NF, 3NF까지 수행하며, 경우에 따라 BCNF(Boyce-Codd Normal Form) 또는 4NF, 5NF까지 고려할 수도 있습니다.
1NF(제1정규형)
조건
- 모든 속성이 원자적(Atomic) 값을 가져야 합니다.
- 중복된 열이 없어야 합니다.
- 각 행이 유일해야 합니다.
예시 (1NF 적용 전)
주문 ID | 고객 이름 | 전화번호 | 상품 | 수량 |
101 | 김철수 | 010-1111 | 펜, 노트 | 1, 2 |
102 | 이영희 | 010-2222 | 지우개 | 3 |
위 테이블은 상품과 수량이 한 개의 필드에 여러 값을 포함하고 있어 1NF를 위반합니다.
예시 (1NF 적용 후)
주문 ID | 고객 이름 | 전화번호 | 상품 | 수량 |
101 | 김철수 | 010-1111 | 펜 | 1 |
101 | 김철수 | 010-1111 | 노트 | 2 |
102 | 이영희 | 010-2222 | 지우개 | 3 |
2NF(제2정규형)
조건
- 1NF를 만족해야 합니다.
- 부분 함수 종속(Partial Dependency)이 없어야 합니다.
예시 (2NF 적용 전)
주문 ID | 고객 이름 | 전화번호 | 상품 ID | 상품명 | 수량 |
101 | 김철수 | 010-1111 | A1 | 펜 | 1 |
101 | 김철수 | 010-1111 | A2 | 노트 | 2 |
102 | 이영희 | 010-2222 | A3 | 지우개 | 3 |
여기서 "고객 이름"과 "전화번호"는 "주문 ID"에 의해 결정되므로, 주문 테이블과 고객 테이블을 분리하여 부분 함수 종속성을 제거해야 합니다.
예시 (2NF 적용 후) 고객 테이블
고객 ID | 고객 이름 | 전화번호 |
C01 | 김철수 | 010-1111 |
C02 | 이영희 | 010-2222 |
주문 테이블
주문 ID | 고객 ID |
101 | C01 |
102 | C02 |
주문 상세 테이블
주문 ID | 상품 ID | 수량 |
101 | A1 | 1 |
101 | A2 | 2 |
102 | A3 | 3 |
부분 함수 종속성(Partial Dependency)이란, 어떤 비프라이머리 속성(Primary Key가 아닌 속성)이 기본 키(Primary Key)의 일부에만 종속되는 경우를 의미합니다. 이는 제2정규형(2NF)을 위반하는 주요 원인 중 하나입니다.
기본 키(Primary Key): (주문 ID, 상품 ID)
- 문제점:
- "고객 이름"과 "전화번호"는 "주문 ID"에 의해 결정됨 (상품 ID와는 무관함)
- 즉, 고객 이름과 전화번호가 기본 키의 일부(주문 ID)에만 종속됨 → 부분 함수 종속 발생
- 만약 같은 고객이 여러 주문을 하면, 고객 정보를 여러 번 반복 저장해야 함 → 데이터 중복 발생
2NF 적용 (부분 함수 종속 제거)
고객 테이블 (고객 정보를 따로 분리)
고객 ID | 고객 이름 | 전화번호 |
C01 | 김철수 | 010-1111 |
C02 | 이영희 | 010-2222 |
주문 테이블 (고객 ID를 참조)
주문 ID | 고객 ID |
101 | C01 |
102 | C02 |
주문 상세 테이블 (상품 정보는 여기에)
주문 ID | 상품 ID | 수량 |
101 | A1 | 1 |
101 | A2 | 2 |
102 | A3 | 3 |
이제 "고객 이름"과 "전화번호"는 "고객 ID"를 통해 참조할 수 있으므로 부분 함수 종속이 제거되었습니다!
정리
- 부분 함수 종속: 기본 키의 일부 속성에만 종속되는 것
- 2NF를 만족하려면: 부분 함수 종속을 제거해야 함
- 해결 방법: 관련 데이터를 별도 테이블로 분리하여 더 작은 테이블을 만든 후, 외래 키(FK)로 연결
3NF(제3정규형)
조건
- 2NF를 만족해야 합니다.
- 이행적 함수 종속(Transitive Dependency)이 없어야 합니다.
예를 들어, "상품 ID"가 "상품명"을 결정하고, "상품명"이 "카테고리"를 결정한다면, "상품 ID → 카테고리"라는 이행적 종속이 존재합니다. 이를 제거하기 위해 상품 테이블을 분리합니다.
예시 (3NF 적용 후) 상품 테이블
상품 ID | 상품명 | 카테고리 |
A1 | 펜 | 문구류 |
A2 | 노트 | 문구류 |
A3 | 지우개 | 문구류 |
이제 "상품 ID"만 참조하면 "카테고리" 정보를 얻을 수 있어, 데이터 일관성이 향상됩니다.
BCNF(Boyce-Codd 정규형)
BCNF는 3NF보다 더 엄격한 정규형으로, 모든 결정자가 후보 키(Primary Key)여야 한다는 조건이 추가됩니다. 일반적으로 3NF까지만 수행하면 대부분의 데이터베이스에서 충분하지만, 특정한 이상 현상이 발생할 경우 BCNF를 고려합니다.
정규화 vs. 비정규화(Denormalization)
정규화를 통해 데이터 무결성을 보장할 수 있지만, 너무 많은 정규화를 하면 조인(Join) 연산이 많아져 성능이 저하될 수 있습니다. 따라서 실무에서는 성능을 고려하여 일부 테이블을 비정규화하는 경우도 있습니다. 예를 들어, 자주 조회하는 데이터를 별도의 캐싱 테이블에 저장하거나, 일부 정보를 중복 저장하여 조회 속도를 높이기도 합니다.
결론
데이터 정규화는 데이터베이스 설계의 핵심 원칙 중 하나이며, 데이터의 중복을 줄이고 무결성을 유지하는 데 중요한 역할을 합니다. 하지만 무조건 정규화를 수행하는 것이 아니라, 성능과 유지보수성을 고려하여 적절한 수준에서 정규화를 적용하는 것이 중요합니다.