첫 회사에서 처음으로 요구사항을 만족시키는 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정규화도 있다고 하던데….