데이터베이스 정규화 : 개념, 장점, 단점 (SQLD대비)
데이터베이스 설계 과정에서 정규화는 중요한 개념입니다.
올바르게 사용하면 데이터 무결성을 보장하고 성능을 최적화할 수 있습니다.
이번 글에서는 정규화의 정의, 각각의 장단점, 그리고 실제 적용 방안을 살펴보겠습니다.
1. 정규화란 무엇인가?
정규화는 데이터베이스의 테이블을 작은 단위로 분리하고 관계를 정의하여
데이터 중복을 최소화하고 무결성을 확보하는 과정입니다.
이 과정은 데이터 관리의 효율성을 높이고, 예기치 못한 데이터 불일치 문제를 방지합니다.
정규화의 특징과 이유
정규화는 데이터의 무결성, 일관성, 독립성을 확보하기 위해 필요합니다.
엔티티를 분리하여 데이터 중복을 줄이고, 필요한 데이터에 유연하게 접근할 수 있습니다.
이를 통해 입력, 수정, 삭제 성능이 향상되는 효과를 기대할 수 있습니다.
정규화의 주요 특징
- 데이터 무결성 확보 : 데이터의 일관성을 유지하고 오류를 방지합니다.
- 중복 최소화 : 데이터 중복을 줄여 저장 공간을 절약하고, 수정 시 여러 곳을 동시에 변경해야 하는 문제를 해결합니다.
- 유연한 데이터 관리 : 복잡한 관계를 효율적으로 처리하고, 데이터 검색과 조작 성능을 향상합니다.
정규화는 데이터베이스의 엔티티를 작은 단위로 분리하고 관계를 맺는 과정입니다.
이는 데이터를 효율적으로 관리하고 중복을 최소화하기 위해 수행됩니다.
정규화의 종류
- 제1 정규형 : 테이블의 칼럼을 원자값(더 이상 나눌 수 없는 값)으로 분해.
- 제2 정규형 : 모든 속성이 주 식별자에 완전 종속되도록 구조화.
- 제3 정규형 : 이행적 종속 관계를 제거해 주 식별자에만 종속되도록 개선.
- BCNF(보이스-코드 정규형) : 모든 결정자가 후보키가 되도록 테이블을 분해.
- 제4, 제5 정규형 : 다중값 종속성과 조인으로 인한 종속성을 제거.
제1 정규형 (1NF)
정의 : 테이블의 모든 속성이 원자값을 가져야 합니다.
즉, 하나의 칼럼에 여러 값이 포함되지 않도록 분해합니다.
주문번호 | 상품명 | 수량 |
001 | 사과, 바나나 | 5, 3 |
- 위 테이블은 1NF를 만족하지 않습니다.
- 상품명과 수량 칼럼이 각각 여러 값을 포함하고 있기 때문입니다.
제1 정규화 실행
주문번호 | 상품명 | 수량 |
001 | 사과 | 5 |
001 | 바나나 | 3 |
각 칼럼이 원자값을 가지도록 분해하면 1NF를 만족합니다.
제2 정규형 (2NF)
정의 : 모든 속성이 기본키에 대해 완전 종속되어야 합니다.
즉, 기본키의 일부에만 종속되는 속성이 있으면 안 됩니다.
- 조건 : 기본키가 단일 속성이라면 2NF는 자동으로 만족합니다.(부분 종속이 발생할 수 없기 때문입니다.)
수업ID | 학생ID | 학생명 | 수업명 |
101 | S001 | 홍길동 | 수학 |
101 | S002 | 김철수 | 수학 |
- 기본키 : (수업 ID, 학생 ID)
- 학생명은 학생 ID에만 종속됩니다. (부분 종속 발생)
- 수업명은 수업 ID에만 종속됩니다. (부분 종속 발생)
제2 정규화 실행
테이블을 분리하여 부분 종속성을 제거합니다.
학생 정보 테이블 : 학생 ID, 학생명
학생ID | 학생명 |
S001 | 홍길동 |
S002 | 김철수 |
수업 정보 테이블 : 수업 ID, 수업명
수업ID | 수업명 |
101 | 수학 |
수업-학생 관계 테이블 : 수업 ID, 학생 ID
수업ID | 학생ID |
101 | S001 |
101 | S002 |
제3 정규형 (3NF)
정의 : 모든 속성이 기본키에만 종속되어야 합니다.
즉, 이행적 종속(A → B → C)이 존재하면 안 됩니다.
주문ID | 고객ID | 고객명 |
001 | C001 | 홍길동 |
002 | C002 | 김영희 |
- 기본키 : 주문 ID
- 고객명은 주문 ID → 고객 ID → 고객명의 경로를 통해 간접적으로 종속됩니다. (이행적 종속)
제3 정규화 실행
테이블을 분리하여 이행적 종속성을 제거합니다.
주문 테이블 : 주문 ID, 고객 ID
주문ID | 고객ID |
001 | C001 |
002 | C002 |
고객 테이블 : 고객 ID, 고객명
고객ID | 고객명 |
C001 | 홍길동 |
C002 | 김영희 |
BCNF (보이스-코드 정규형)
정의 : 모든 결정자가 반드시 후보키여야 합니다.
즉, 후보키가 아닌 속성이 결정자가 되는 경우를 제거합니다.
수업ID | 교수명 | 강의실 |
101 | 박교수 | 301호 |
102 | 이교수 | 302호 |
- 후보키 : 수업 ID
- 그러나 교수명이 강의실을 결정합니다. (결정자가 후보키가 아님)
BCNF 실행
테이블을 분리하여 모든 결정자가 후보키가 되도록 만듭니다.
수업 정보 테이블 : 수업 ID, 교수명
수업ID | 교수명 |
101 | 박교수 |
102 | 이교수 |
교수-강의실 테이블 : 교수명, 강의실
교수명 | 강의실 |
박교수 | 301호 |
이교수 | 302호 |
제4 정규형
제4 정규형: 다중값 종속성을 제거합니다.
제4 정규형
학생ID | 취미 | 동아리 |
S001 | 축구 | 음악동아리 |
S001 | 축구 | 미술동아리 |
S001 | 영화감상 | 음악동아리 |
S001 | 영화감상 | 미술동아리 |
취미와 동아리가 서로 독립적인 다중값 종속성을 가집니다.
제4 정규형 실행
테이블을 분리하여 독립적인 다중값 종속성을 제거합니다.
학생-취미 테이블 : 학생 ID, 취미
학생ID | 취미 |
S001 | 축구 |
S001 | 영화감상 |
학생-동아리 테이블 : 학생 ID, 동아리
학생ID | 동아리 |
S001 | 음악동아리 |
S001 | 미술동아리 |
제5 정규형
정의 : 조인 종속성으로 인해 발생하는 불필요한 데이터 중복을 제거합니다.
조인 종속성은 테이블을 분리했다가 다시 조인했을 때 원래의 정보를 잃지 않는 경우를 말합니다.
5NF는 모든 조인 종속성이 후보키에 의해 결정되는 경우를 목표로 합니다.
초기 테이블
프로젝트ID | 부서 | 직원 |
P101 | HR | 김철수 |
P101 | IT | 김철수 |
P101 | HR | 이영희 |
P101 | IT | 이영희 |
P102 | HR | 김철수 |
위 테이블에서 프로젝트 ID, 부서, 그리고 직원 사이에는 다대다 관계가 존재합니다.
- 조인 종속성
- 프로젝트 ID와 부서는 독립적으로 연결됨.
- 프로젝트 ID와 직원은 독립적으로 연결됨.
- 부서와 직원은 독립적으로 연결됨.
- 프로젝트 ID와 부서는 독립적으로 연결됨.
이로 인해 데이터가 중복되고 관리가 어려워질 수 있습니다.
제5 정규화 실행
테이블을 최소한의 관계로 나누어 불필요한 중복을 제거합니다.
프로젝트-부서 테이블 : 프로젝트 ID, 부서
프로젝트ID | 부서 |
P101 | HR |
P101 | IT |
P102 | HR |
프로젝트-직원 테이블 : 프로젝트 ID, 직원
프로젝트ID | 직원 |
P101 | 김철수 |
P101 | 이영희 |
P102 | 김철수 |
부서-직원 테이블 : 부서, 직원
부서 | 직원 |
HR | 김철수 |
HR | 이영희 |
IT | 김철수 |
IT | 이영희 |
결론 : 데이터를 효율적으로 관리하고, 비즈니스 요구사항에 맞는 최적의 설계를 위해 정규화를 실시
정규화는 데이터베이스 설계의 기본이지만, 모든 상황에서 최적의 선택은 아닙니다.
성능이 중요한 경우 반정규화를 검토해 데이터 관리와 성능의 균형을 맞추는 것이 중요합니다.
데이터를 효율적으로 관리하고, 비즈니스 요구사항에 맞는 최적의 설계를 위해 정규화와 반정규화를 적절히 활용해야 합니다.
이번 글에선 정규화에 대해 정리해 보았으며,
다음 시간에 반정규화에 대해 알아보겠습니다.
정규화의 장점
- 데이터 무결성과 일관성 보장
- 데이터 중복 최소화로 저장 공간 절약
- 데이터 관리 및 수정이 용이
정규화의 단점
- 복잡한 조인 연산으로 인한 쿼리 성능 저하 가능
- 설계와 관리가 까다로워질 수 있음