코딩 이래요래
데이터베이스 정규화 (1NF ~ 3NF + 역정규화) 본문
정규화란?
데이터베이스 설계 과정에서 데이터의 중복을 최소화하고, 데이터의 무결성과 일관성을 유지하기 위해 테이블을 체계적으로 나누는 과정이다.
정규화를 통해:
- 불필요한 중복을 줄일 수 있다.
- 삽입/수정/삭제 시 발생할 수 있는 이상현상을 방지할 수 있다.
- 데이터 구조를 명확하고 효율적으로 유지할 수 있다.
제1 정규형 (1NF)
테이블 내의 모든 Attributes(컬럼)는 원자값(atomic value)만을 가지도록 테이블을 설계하는 첫 번째 정규화 단계다.
즉, 각 컬럼은 더이상 분해할 수 없는 단위어야 한다.
말이 어려울 수 있는데 간단한 예로 들어보자.
- 다가 속성(Multivalued Attributes) 제1정규형 처리 방법
- 하나의 셀(Attribute value)에 여러개의 취미가 저장되는 형태 X
- 복합 속성(Composite Attributes) 제1정규형 처리 방법
- 하나의 셀(Attribute value)에 여러개의 취미가 저장되는 형태 X
- "서울시 강남구 테헤란로 123"가 저장되는 형태
- [도시, 구, 도로명, 상세주소] 등으로 분리할 수 있음.
- 하나의 셀(Attribute value)에 여러개의 취미가 저장되는 형태 X
따라서 각 컬럼과 셀은 명확하게 1:1로 매핑되고, 데이터 검색과 수정이 단순해 지는 장점이 있다.
제2 정규형(2NF)
제1 정규화를 진행한 테이블에서 부분적 함수 종속을 제거하는 과정이다.
역시 말이 어려운데 예시로 쉽게 이해해 보자.
즉, 복합키(기본키가 두 개 이상으로 구성된 경우)를 사용하는 테이블에서, 기본키의 일부에만 종속된 컬럼이 있으면 안된다는 뜻이다.
위 사진으로 보면 제1정규형은 만족하지만, 제2정규형은 만족하지 못한다.
테이블에서 복합키는 = 학생번호, 과목 이다.
이제 남은 컬럼의 부분적 함수 종속이 있는지 확인해보자.
- 성적
- 과목만 알면 성적을 알 수 있는가?
- X : 같은 과목이라도 학생마다 성적이 모두 다름.
- 학생번호만 알면 성적을 알 수 있는가?
- X : 같은 학생이라도 과목마다 성적이 모두 다름.
- 학생번호 + 과목 모두 알아야 학생별 성적을 알 수 있음. 따라서 성적은 복합키 전체에 종속됨
- 과목만 알면 성적을 알 수 있는가?
- 학생 이름
- 과목과는 상관 없이, 학생번호만 알면 항상 알 수 있는 데이터임
- 따라서 학생이름은 학생번호에만 종속되는 부분 종속임
제2정규화는 학생이름처럼 부분적 함수 종속을 제거하는 과정임.
복합키의 일부에만 종속되는 컬럼을 분리하여 새로운 테이블을 만들면 위처럼 모든 속성은 기본키에 종속되어 제2정규형을 만족한다.
제3 정규형(3NF)
제2정규형을 진행한 테이블에서 간접적인 종속(이행적 종속)을 제거하는 과정이다.
이행 함수 종속이란?
기본키가 아닌 컬럼이 또 다른 기본키가 아닌 컬럼에 간접적으로 의존하는 관계를 말한다.
쉽게 말해 기본키가 아닌 컬럼이 다른 기본키가 아닌 속성에 종속되지 않도록 테이블을 분리하는 것이다.
위 테이블은 제2정규형 까지는 만족하는 생태이다. 하지만 학과이름은 학생번호에 직접 종속되는 것이 아닌 학과 코드에 종속되어있다.
즉, 학생번호 -> 학과코드 -> 학과이름 = 이행적 종속을 이루고 있음.
제3정규형을 적용하여 테이블을 분리해야한다.
학과 정보를 별도 테이블로 분리하여, 학생 테이블에서 학과코드를 FK로 관리한다.
이로써
- 이행적 종속을 제거하여 데이터 중복을 방지한다.
- 한 곳에서만 데이터를 관리하므로, 이상 현상을 방지할 수 있음.
- 일관된 정보를 유지하므로 데이터 무결성이 향상된다.
역정규화
지나친 정규화로 인해 JOIN이 많아져 성능이 저하될 때, 일부 테이블을 다시 통합하거나 중복을 허용하여 응답 속도를 높이는 기법이다.
예시로 쉽게 이해해 보자.
주문 합계
- 정규화된 구조
- order_detail에서 SUM(price)로 합계 계산 필요
- 역정규화 구조
- orders 테이블에 total_price 컬럼을 추가해서 합계 저장 → 쿼리 성능 향상
게시글 조회수
- 별도의 board_count 테이블 없이
- board 테이블에 view_count를 직접 저장 → 실시간 조회성 향상
정리
정규형 | 핵심 개념 | 목적 |
1NF | 원자값만 저장 | 셀마다 하나의 값 |
2NF | 부분 종속 제거 | 복합키 일부에만 종속된 컬럼 제거 |
3NF | 이행 종속 제거 | 비기본키 간 종속 제거 |
역정규화 | 성능 최적화 | JOIN 최소화, 일부 중복 허용 |
일반적으로 제3정규화까지만 적욘한 후, 조회 성능 문제에 따라 역정규화를 고민하고, 지나친 정규화는 구조는 깨끗하지만, 유지보수와 응답 속도에서 성능 저하를 유발할 수 있음.
해당 게시글은 학습한 내용을 정리하고 복습하며 정리한 글이므로 틀린 부분이 있을 수 있음.