데이터베이스 설계에서 정규화(Normalization) 는 가장 핵심적인 개념 중 하나이다. 정규화는 다음과 같은 목표를 가진다.
한마디로, 잘 설계된 데이터베이스를 만들기 위한 체계적인 절차가 바로 정규화이다.
우리는 앞에서 이미 member, product, orders, order_item 같은 테이블을 잘 분리해서 설계했다. 그런데 이런 의문이 생긴다.
굳이 테이블을 이렇게 여러 개로 나눌 필요가 있을까? 그냥 한 테이블에 다 집어넣으면 더 편하지 않을까?
이 질문에 답하기 위해, 일부러 재앙적인 설계에서 시작해서 점차 정규화를 적용해 나가는 과정을 밟아본다. 이 과정을 통해 정규화의 필요성을 몸으로 체감하게 된다.
정규화는 관계형 데이터베이스의 창시자인 에드거 F. 커드(Edgar F. Codd) 가 처음 제안한 개념이다. 수학과 논리학에서 사용하는 정규형(Normal Form) 개념에서 영감을 받았다.
2/4와 1/2은 같은 값이지만, 더 단순하고 명확한 표현은 1/2이다. 그래서 1/2을 대표로 삼는다. 이것이 정규형이다.데이터베이스 정규화도 마찬가지이다.
정규화(Normalization) 는 데이터를 정규형(Normal Form) 이라는 규칙에 맞추어 변환해 나가는 과정이다.
이렇게 하면 데이터가 중복되지 않고, 일관성과 무결성을 유지하며, 각종 이상 현상(Anomaly) 을 방지할 수 있다. 여기서 "정규"는 정규형 조건을 만족한 이상적인 상태를 의미한다.
쇼핑몰의 모든 주문 관련 데이터를 하나의 테이블에 몰아 넣는다고 가정해 보자. 예를 들어 이름부터 재앙적인 느낌이 나는 테이블을 하나 만든다.