데이터베이스를 다뤄본 경험이 있다면 '정규화(normalization)'라는 용어를 한 번쯤 들어보셨을 것입니다. "그 데이터베이스 정규화돼 있나요?" 또는 "BCNF 형태인가요?" 같은 질문을 받아본 적도 있을지 모릅니다. 정규화는 학자들만 신경 쓰는 사치로 여겨지기도 하지만, 사실 정규화 원칙을 이해하고 일상적인 데이터베이스 설계 작업에 적용하는 일은 그리 어렵지 않습니다. 오히려 DBMS의 성능을 크게 향상시킬 수 있는 강력한 도구입니다.
이 글에서는 정규화의 기본 개념을 소개하고, 실무에서 가장 널리 사용되는 정규형들을 차근차근 살펴보겠습니다.
정규화란 무엇인가?
정규화는 데이터베이스 안의 데이터를 효율적으로 구성하는 과정입니다. 정규화에는 두 가지 핵심 목표가 있습니다.
- 중복 데이터 제거: 동일한 데이터를 여러 테이블에 반복해서 저장하지 않습니다.
- 논리적인 데이터 종속성 확보: 서로 관련 있는 데이터만 하나의 테이블에 함께 저장합니다.
이 두 가지 목표는 데이터베이스가 차지하는 저장 공간을 줄여주고, 데이터가 논리적으로 일관성 있게 저장되도록 보장한다는 점에서 매우 가치가 있습니다.
정규형(Normal Forms)이란?
데이터베이스 분야에서는 데이터베이스가 올바르게 정규화되었는지 판단하기 위한 일련의 지침을 발전시켜 왔습니다. 이를 정규형(normal forms)이라 부르며, 가장 낮은 수준인 제1정규형(1NF)부터 제5정규형(5NF)까지 번호로 등급이 매겨집니다.
실무 환경에서는 주로 1NF, 2NF, 3NF가 활용되며, 때에 따라 4NF도 등장합니다. 제5정규형은 매우 드물게 사용되므로 이 글에서는 다루지 않습니다.
본격적으로 정규형을 살펴보기 전에 한 가지 중요한 점을 짚고 넘어가겠습니다. 정규형은 어디까지나 지침일 뿐이라는 사실입니다. 실제 비즈니스 요구사항을 충족하기 위해 이 규칙에서 벗어나야 하는 경우도 종종 발생합니다. 다만 예외를 적용할 때는 해당 변경이 시스템에 미칠 수 있는 영향을 반드시 평가하고, 잠재적인 데이터 불일치 가능성까지 고려해야 합니다.
제1정규형(1NF)
제1정규형(First Normal Form)은 잘 조직된 데이터베이스를 위한 가장 기본적인 규칙을 정립합니다.
- 동일한 테이블 안에서 중복되는 열(column)을 제거합니다.
- 관련된 데이터 그룹별로 별도의 테이블을 생성하고, 각 행을 고유한 열 또는 열의 집합(기본키, primary key)으로 식별합니다.
제2정규형(2NF)
제2정규형(Second Normal Form)은 중복 데이터 제거 개념을 한 단계 더 발전시킵니다.
- 제1정규형의 모든 요구사항을 충족해야 합니다.
- 테이블의 여러 행에 걸쳐 반복 적용되는 데이터 부분집합을 찾아 별도의 테이블로 분리합니다.
- 외래키(foreign key)를 사용해 새로 만든 테이블과 기존 테이블 간의 관계를 설정합니다.
제3정규형(3NF)
제3정규형(Third Normal Form)은 여기서 한 단계 더 나아갑니다.
- 제2정규형의 모든 요구사항을 충족해야 합니다.
- 기본키에 종속되지 않는 열을 제거합니다.
보이스-코드 정규형(BCNF 또는 3.5NF)
보이스-코드 정규형(Boyce-Codd Normal Form)은 흔히 "3.5정규형"이라고도 불리며, 한 가지 요구사항을 추가합니다.
- 제3정규형의 모든 요구사항을 충족해야 합니다.
- 모든 결정자(determinant)는 반드시 후보키(candidate key)여야 합니다.
제4정규형(4NF)
마지막으로 제4정규형(Fourth Normal Form)은 아래의 추가 요구사항을 포함합니다.
- 제3정규형의 모든 요구사항을 충족해야 합니다.
- 릴레이션에 다치 종속(multi-valued dependency)이 존재하지 않아야 4NF를 만족합니다.
주목할 점은 이러한 정규화 지침들이 누적적으로 적용된다는 것입니다. 즉, 데이터베이스가 2NF를 만족하려면 먼저 1NF의 모든 기준을 충족해야 하며, 상위 정규형으로 갈수록 하위 단계의 요건이 모두 전제됩니다.
정규화, 무조건 해야 할까?
데이터베이스 정규화는 대체로 좋은 선택이지만, 절대적인 필수 사항은 아닙니다. 상황에 따라서는 의도적으로 정규화 규칙을 깨는 것이 오히려 바람직한 실천이 되기도 합니다. 예를 들어 조회 성능을 우선시해야 하는 분석용 시스템에서는 일부러 중복을 허용하는 역정규화(denormalization)를 적용하기도 합니다.
데이터베이스가 제대로 정규화되었는지 확인하고 싶다면, 가장 먼저 제1정규형(1NF)에 맞춰 데이터베이스를 구성하는 방법부터 익혀보시기 바랍니다. 기본기를 탄탄히 다진다면 상위 정규형으로의 확장도 자연스럽게 따라올 것입니다.