사업개발캠프

[DB] 데이터베이스 정규화(Normalization) 실습: 비정규형에서 제3정규형(3NF)까지 과정 정리

dougie1004 2025. 12. 23. 18:26
 

수업 시간에 배운 데이터베이스 정규화(Normalization) 과정을 복습하기 위해, 가상의 '온라인 서점 주문 내역' 데이터를 만들어서 직접 정규화를 진행해 보았습니다.

정규화는 데이터의 중복을 줄이고 무결성을 유지하기 위해 반드시 거쳐야 하는 과정입니다. 이번 실습은 **비정규화 데이터(Raw Data)부터 제3 정규화(3NF)**까지 단계별로 진행했습니다.

0. 비정규화 데이터 (Unnormalized Form)

처음 수집된 데이터(Raw Data)입니다. 엑셀로 대충 정리한 것처럼, 하나의 셀에 여러 개의 상품 정보가 섞여 있어 데이터베이스로 쓰기에는 부적합한 상태입니다.

주문번호 주문일자 고객명 고객전화번호 구매상품 상품단가 수량
1001 2024-05-01 김철수 010-1234-5678 파이썬기초, 데이터분석 20000, 30000 1, 2
1002 2024-05-02 이영희 010-9876-5432 인공지능개론 45000 1
1003 2024-05-03 김철수 010-1234-5678 파이썬기초 20000 3

1. 제1 정규화 (1NF)

목표: 모든 속성의 값은 원자값(Atomic Value)을 가져야 한다.

하나의 칸(속성)에는 하나의 값만 들어가야 합니다. 여러 상품이 쉼표로 묶여있던 행을 분리했습니다. 이제 각 행은 유일한 데이터를 가집니다.

  • 기본키(PK): (주문번호, 상품명) - 복합키 사용
주문번호 주문일자 고객명 고객전화번호 상품명 상품단가 수량
1001 2024-05-01 김철수 010-1234-5678 파이썬기초 20,000 1
1001 2024-05-01 김철수 010-1234-5678 데이터분석 30,000 2
1002 2024-05-02 이영희 010-9876-5432 인공지능개론 45,000 1
1003 2024-05-03 김철수 010-1234-5678 파이썬기초 20,000 3

2. 제2 정규화 (2NF)

목표: 부분 함수 종속을 제거한다. (기본키 전체가 아닌, 기본키의 '일부분'에만 의존하는 컬럼을 분리)

  • 주문일자, 고객명, 전화번호는 주문번호(PK의 일부)에만 종속됩니다.
  • 상품단가는 상품명(PK의 일부)에만 종속됩니다.
  • 따라서 주문 정보 상품 정보, 그리고 주문 상세 내역으로 테이블을 쪼갭니다.

2-1. 주문정보 테이블 | 주문번호 | 주문일자 | 고객명 | 고객전화번호 | | :--- | :--- | :--- | :--- | | 1001 | 2024-05-01 | 김철수 | 010-1234-5678 | | 1002 | 2024-05-02 | 이영희 | 010-9876-5432 | | 1003 | 2024-05-03 | 김철수 | 010-1234-5678 |

2-2. 상품 테이블 | 상품명 | 상품단가 | | :--- | :--- | | 파이썬기초 | 20,000 | | 데이터분석 | 30,000 | | 인공지능개론 | 45,000 |

2-3. 주문 상세 테이블 | 주문번호 | 상품명 | 수량 | | :--- | :--- | :--- | | 1001 | 파이썬기초 | 1 | | 1001 | 데이터분석 | 2 | | 1002 | 인공지능개론 | 1 | | 1003 | 파이썬기초 | 3 |

3. 제3 정규화 (3NF) - 최종 완료

목표: 이행적 함수 종속을 제거한다. (기본키가 아닌 일반 컬럼끼리 의존하는 관계를 제거)

주문정보 테이블을 보면 고객전화번호는 고객명에 의존하고 있습니다. (주문번호 -> 고객명 -> 전화번호). 이를 분리하여 고객 관리를 따로 수행합니다.

3-1. 고객 테이블 (신규 생성) | 고객ID | 고객명 | 고객전화번호 | | :--- | :--- | :--- | | C001 | 김철수 | 010-1234-5678 | | C002 | 이영희 | 010-9876-5432 |

3-2. 주문 테이블 (수정됨) | 주문번호 | 주문일자 | 고객ID (FK) | | :--- | :--- | :--- | | 1001 | 2024-05-01 | C001 | | 1002 | 2024-05-02 | C002 | | 1003 | 2024-05-03 | C001 |

3-3. 상품 테이블 (변동 없음) | 상품ID | 상품명 | 상품단가 | | :--- | :--- | :--- | | P001 | 파이썬기초 | 20,000 | | P002 | 데이터분석 | 30,000 | | P003 | 인공지능개론 | 45,000 |

3-4. 주문 상세 테이블 (변동 없음) | 주문번호 | 상품ID (FK) | 수량 | | :--- | :--- | :--- | | 1001 | P001 | 1 | | 1001 | P002 | 2 | | 1002 | P003 | 1 | | 1003 | P001 | 3 |


📝 결론

이렇게 정규화를 거치면 데이터의 중복이 사라지고, 고객의 연락처가 바뀌더라도 '고객 테이블'만 수정하면 되므로 데이터 관리가 훨씬 효율적으로 변합니다.