정규화
“데이터 중복과 이상현상을 제거해 무결성을 높이는 설계 기법.”
정규화란 무엇인가
정규화(Normalization)는 데이터의 중복과 갱신 이상현상을 제거해 무결성을 높이는 데이터베이스 설계 기법이다. 하나의 사실을 여러 곳에 나누어 저장하면 일부만 수정될 때 데이터가 서로 어긋나는데, 정규화는 이런 위험을 구조적으로 차단한다.
핵심 원리는 각 속성을 그 의미에 가장 잘 맞는 단 하나의 자리에 두는 것이다. 데이터를 의미 단위로 분리해 관계로 연결하면, 한 값을 한 곳에서만 관리하게 되어 일관성이 자연스럽게 유지된다.
이상현상이라는 출발점
정규화의 필요성은 비정규 구조에서 발생하는 이상현상에서 잘 드러난다. 한 테이블에 서로 다른 성격의 데이터가 섞여 있으면, 새 데이터를 넣을 때 불필요한 빈 값이 강요되거나, 한 행을 지울 때 함께 사라져선 안 될 정보가 같이 사라지는 문제가 생긴다.
같은 값을 수정할 때 여러 행을 모두 고쳐야 하고, 그중 하나라도 누락되면 데이터가 모순된다. 이러한 삽입·삭제·갱신상의 부작용을 줄이는 것이 정규화의 직접적인 목표다.
증상을 먼저 이해해야 어떤 분해가 필요한지 보인다.
단계로 나아가는 분해
정규화는 보통 여러 정규형의 단계로 설명된다. 반복되는 그룹을 제거해 각 칸이 하나의 값만 갖게 하는 단계에서 출발해, 식별자의 일부에만 종속된 속성을 떼어 내고, 다시 식별자가 아닌 속성에 딸린 속성을 분리하는 식으로 진행한다.
각 단계는 앞 단계의 조건을 만족한 위에서 더 엄격한 기준을 추가하는 누적적 구조를 가진다. 실무에서는 식별자가 아닌 속성에 대한 종속을 제거하는 수준까지를 기본 목표로 삼는 경우가 많다.
단계의 이름을 외우는 것보다, 각 분해가 어떤 종속 관계를 끊어 내는지 이해하는 편이 유용하다.
| 이상현상 | 증상 | 정규화 효과 |
|---|---|---|
| 삽입 | 불필요한 빈 값 강요 | 의미별 분리 |
| 삭제 | 연관 정보 동반 소실 | 독립 저장 |
| 갱신 | 여러 행 수정 누락 모순 | 한 곳 관리 |
모델링·개체관계도와의 관계
정규화는 데이터 모델링의 한 과정으로, 논리 모델을 다듬는 단계에서 집중적으로 적용된다. 개체관계도 위에서 보면, 정규화는 하나의 비대한 개체를 의미가 분명한 여러 개체로 쪼개고 그 사이에 관계를 설정하는 작업으로 나타난다.
잘 정규화된 구조는 개체관계도가 깔끔해지고, 각 개체의 책임이 또렷해진다. 반대로 정규화가 충분치 않은 모델은 한 개체가 너무 많은 역할을 떠안아 변경에 취약해진다.
정규화는 곧 데이터의 책임을 적절히 분산하는 설계 행위다.
반정규화라는 절충
정규화를 끝까지 밀어붙이는 것이 항상 최선은 아니다. 데이터를 잘게 분리할수록 무결성은 좋아지지만, 조회 시 여러 테이블을 연결해야 해 성능 부담이 커질 수 있다.
그래서 조회가 빈번하고 응답 속도가 중요한 영역에서는 의도적으로 일부 중복을 허용하는 반정규화를 적용한다. 중요한 것은 반정규화가 정규화를 모르고 한 타협이 아니라, 정규화된 구조를 이해한 위에서 내리는 의식적 선택이어야 한다는 점이다.
어디서 중복을 허용했는지 기록해 두어야 이후 갱신 로직에서 일관성을 책임질 수 있다.
무결성을 지키는 기반
정규화의 궁극적 가치는 데이터가 시간이 지나도 신뢰할 수 있는 상태로 유지되도록 만드는 데 있다. 한 사실이 한 자리에만 존재하면, 그 값을 고치는 일도 한 번으로 끝나고 모순이 끼어들 틈이 줄어든다.
이는 단순히 저장 공간을 아끼는 차원을 넘어, 데이터가 곧 의사결정의 근거라는 점에서 시스템의 품질과 직결된다. 설계 초기에 정규화로 골격을 바로잡아 두면, 운영 단계에서 데이터 정합성 문제를 해결하느라 드는 비용을 크게 낮출 수 있다.
정규화는 결국 데이터에 대한 신뢰를 설계 단계에서 미리 확보하는 작업이다.
관련 용어