Search
🧱

데이터베이스 정규화(Normalization)에 대하여

AI custom autofill
The blog explains database normalization and its advantages and disadvantages.
Published
2024/12/29
Category
Programming
Tags
Database
첫 회사에서 처음으로 요구사항을 만족시키는 DB 설계를 했던 기억이 있다.
당시 하나의 테이블에 수 많은 컬럼들을 추가해가며 개발했던 기억이 있다. 친구네 회사에서는 한 테이블에 70개의 컬럼을 만들었다고 한다..
개발자적 사고를 한다는 건 굉장히 생소했고, 이제서야 조금은 익숙해진 느낌이다.
그런 의미에서 한번 정리해보려고 한다.

정규화(Normalization)란?

데이터베이스에서 정규화란, 테이블간의 중복된 데이터를 허용하지 않는다는 것이다.
무결성을 유지할 수 있으며, DB의 저장 용량 또한 줄일 수 있게 된다.
이렇게 테이블간의 중복된 데이터를 줄이면서, 정규화 단계를 정의하게 된다.

제 1 정규화

테이블의 컬럼이 원자값(Atomic Value, 하나의 값)을 갖도록 테이블을 분해하는 것이다.
이름
취미들
김연아
피겨스케이팅
박태환
수영,음악
박지성
축구,친구
장미란
역도
이름
취미
김연아
피겨스케이팅
박태환
수영
박태환
음악
박지성
축구
박지성
친구
장미란
역도
왼쪽 테이블에서, 박태환과 박지성은 여러개의 취미를 가지고 있기 때문에 원자값이 여러개이다. 그리하여 오른쪽테이블처럼 분해한다.

제 2 정규화

제 1 정규화를 진행한 테이블에 대해, 완전 함수 종속을 만족하도록 테이블을 분해하는 것이다.
주민번호
이름
성별
주소
취미
890101-*******
김연아
서울
피겨스케이팅
900101-*******
박태환
서울
수영
910101-*******
박지성
부산
친구
920101-*******
장미란
창원
역도
930101-*******
박지성
멘체스터
축구
완전 함수 종속이란 모든 속성이 포함된 기본키의 부분집합에 종속된 경우를 말하는데
쉽게 말해, 주민번호를 알면 이름, 성별, 주소를 모두 식별할 수 있지만
이름으로는 정확히 어떤 사람인지 알 수가 없다.
주민번호를 제외한 다른 속성들이 다른 속성에 종속되지 않는다.
주민번호
이름
성별
주소
890101-*******
김연아
서울
900101-*******
박태환
서울
910101-*******
박지성
부산
920101-*******
장미란
창원
930101-*******
박지성
멘체스터
주민번호
취미
890101-*******
피겨스케이팅
900101-*******
수영
910101-*******
친구
920101-*******
역도
930101-*******
축구
2개의 테이블로 나눔으로서 제 2 정규형을 만족시킬 수 있다.

제 3 정규화

제 2 정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 테이블을 분해하는 것이다.
이행적 종속이란, A→B, B→C가 성립될 때, A→C가 성립되는 것을 말한다.
주민번호
이름
성별
주소
취미
참여 이벤트
참여비
890101-*******
김연아
서울
피겨스케이팅
불꽃축제
40,000
900101-*******
박태환
서울
수영
불꽃축제
40,000
910101-*******
박지성
부산
친구
장미축제
20,000
920101-*******
장미란
창원
역도
장미축제
20,000
930101-*******
박지성
멘체스터
축구
폴킴 콘서트
100,000
위 테이블에서,
특정 사람은 참여 이벤트를 결정하고, 특정 이벤트는 참여비를 결정한다.
주민번호
이름
성별
주소
취미
참여 이벤트
890101-*******
김연아
서울
피겨스케이팅
불꽃축제
900101-*******
박태환
서울
수영
불꽃축제
910101-*******
박지성
부산
친구
장미축제
920101-*******
장미란
창원
역도
장미축제
930101-*******
박지성
멘체스터
축구
폴킴 콘서트
참여 이벤트
참여비
불꽃축제
40,000
장미축제
20,000
폴킴 콘서트
100,000
이행적 종속을 제거하는 이유는, 예를들어 89년생 김연아가 참여하는 불꽃축제의 참여비가 변경이 된다면, 불꽃축제에 참여하는 모든 인원이 가진 참여비를 다 변경해주어야 하는 데이터의 무결성을 지킬 수도 없고 번거로움이 생기게 된다. 그리하여 위와 같이 테이블을 분리하여 관리한다.

정규화의 장점과 단점

장점

데이터 중복 최소화
데이터 무결성 유지
확장성 확보

단점

설계에 많은 시간이 걸림
오버엔지니어링 발생
쿼리 성능 저하 (too many joins)
Ref:
사실, 몇 정규화 과정인지는 크게 중요해보이지 않는다. (영어 문법처럼, 우리가 소통하기 위한 하나의 언어라고 생각한다.)
데이터를 효율적으로 관리하기 위한 접근 개념 자체가 익숙치 않아 어렵게 느껴졌던 것 같다.
무엇보다도 중요한 건, 서비스의 특성에 따라 비정규화를 진행해야 할 때도 있으니 상황에 맞게 유저를 위한 제품을 개발할 수 있는 유연한 개발자가 되는 게 중요한 것 같다
BCNF, 제 4정규화, 제 5정규화도 있다고 하던데….