정규화와 이상 현상, 함수 종속의 이해
데이터베이스를 처음 설계할 때 한 테이블에 가능한 한 많은 정보를 담으려고 시도하는 것은 매우 흔한 실수이다. 학생 정보와 수강 과목, 학과 정보, 담당 교수까지 한 테이블에 우겨넣다 보면 처음에는 단순해 보이지만, 데이터를 추가하거나 수정·삭제할 때 예상치 못한 부작용이 끊임없이 발생하기 시작한다. 이러한 부작용을 이상 현상(Anomaly)이라고 부르며, 이를 체계적으로 제거하기 위해 데이터베이스를 단계적으로 재구성하는 작업이 바로 정규화(Normalization)이다. 정규화와 이상 현상은 데이터베이스 분야에서 가장 핵심적이면서도 정보처리기사 시험에서 매회 출제되는 단골 주제로, 이론을 정확히 이해하면 실무에서도 유연하게 응용할 수 있다.

이상 현상이란 무엇인가
이상 현상이란 데이터베이스 테이블이 잘못 설계되어 있을 때, 데이터를 조작하는 과정에서 의도하지 않은 결과가 발생하는 문제를 가리킨다. 잘못된 설계의 가장 큰 특징은 한 테이블 안에 서로 다른 주제의 정보가 뒤섞여 있다는 점이며, 이로 인해 발생하는 이상 현상은 크게 세 가지로 분류된다. 삽입 이상(Insertion Anomaly), 갱신 이상(Update Anomaly), 삭제 이상(Deletion Anomaly)이 그것이다. 이 세 가지 이상은 정규화의 필요성을 가장 직접적으로 설명해주는 개념이며, 모든 정규화 이론은 이 세 문제를 어떻게 제거할 것인가에 대한 답이라고 볼 수 있다.
삽입 이상은 새로운 데이터를 추가하려 할 때 불필요한 다른 데이터까지 함께 입력해야만 하는 문제이다. 예를 들어 학생 테이블에 학번, 이름, 학과, 학과장 정보를 함께 저장한다고 가정해보자. 신규 학과가 개설되었지만 아직 소속 학생이 한 명도 없다면, 학생 테이블에 학과 정보를 등록할 방법이 없다. 학번이라는 기본키 컬럼을 NULL로 둘 수 없기 때문이다. 결국 학과 정보를 등록하기 위해 가짜 학생 데이터를 만들어야 하는 어처구니없는 상황이 발생한다. 이는 명백히 한 테이블에 두 가지 주제(학생, 학과)가 섞여 있어서 생기는 문제이다.
갱신 이상은 같은 정보가 여러 행에 중복 저장되어 있어, 한 곳을 수정할 때 다른 모든 곳까지 일관되게 갱신하지 않으면 데이터 불일치가 발생하는 문제이다. 위의 학생 테이블에서 학과장이 바뀌었다고 가정해보자. 같은 학과 소속 학생이 200명이라면 그 200개 행을 모두 빠짐없이 수정해야만 데이터의 일관성이 유지된다. 단 한 줄이라도 누락되면 같은 학과의 학과장이 둘이 되는 모순이 발생한다. 삭제 이상은 한 데이터를 삭제할 때 의도하지 않은 다른 데이터까지 함께 사라지는 문제이다. 한 학과에 학생이 단 한 명만 남은 상태에서 그 학생이 자퇴하면, 그 학생의 행을 삭제하는 순간 학과 정보 자체도 함께 사라져버린다. 학과는 여전히 존재하지만 데이터베이스에는 그 사실이 보존되지 않는 모순이 발생한다.
정규화의 단계와 함수 종속성
정규화는 이상 현상을 제거하기 위해 테이블을 더 작은 단위로 분해하는 일련의 절차이다. 정규형(Normal Form)은 테이블이 만족해야 하는 조건들의 집합으로, 1NF부터 시작해 2NF, 3NF, BCNF, 4NF, 5NF로 점점 엄격해지는 순서로 정의된다. 일반적으로 실무에서는 BCNF까지 정규화를 진행하면 이상 현상의 대부분이 해소된 것으로 평가하며, 4NF와 5NF까지 진행하는 경우는 비교적 드물다. 각 정규형으로 진행하기 위해서는 함수 종속성(Functional Dependency)이라는 핵심 개념을 이해해야 한다.
함수 종속성이란 한 속성의 값이 다른 속성의 값을 유일하게 결정하는 관계를 의미하며, 일반적으로 X → Y로 표기한다. 학번이 주어지면 이름이 유일하게 결정되므로 학번 → 이름이라는 함수 종속이 성립한다. 함수 종속에는 몇 가지 변형이 존재한다. 부분 함수 종속(Partial Dependency)은 합성키의 일부 속성에만 종속되는 경우이며, 완전 함수 종속(Full Functional Dependency)은 합성키 전체에 종속되는 경우이다. 이행 함수 종속(Transitive Dependency)은 X → Y이고 Y → Z일 때 X → Z가 간접적으로 성립하는 경우를 가리킨다. 정규화의 각 단계는 바로 이러한 함수 종속의 특정 형태를 제거하는 작업이다.
제1정규형(1NF)은 모든 속성이 더 이상 분해할 수 없는 원자값(Atomic Value)을 가지는 상태를 의미한다. 한 셀에 여러 값을 콤마로 구분해 저장하거나, 반복 그룹을 가지는 컬럼이 있다면 1NF를 위반한 것이다. 제2정규형(2NF)은 1NF를 만족하면서 모든 비주요 속성이 기본키에 완전 함수 종속인 상태를 말한다. 즉 부분 함수 종속을 제거하는 단계이며, 합성키의 일부에만 종속되는 속성이 있다면 별도 테이블로 분리해야 한다. 제3정규형(3NF)은 2NF를 만족하면서 비주요 속성 사이의 이행 함수 종속을 제거한 상태이다. 학번 → 학과 → 학과장의 관계처럼 키가 아닌 속성이 다른 키 아닌 속성을 결정하는 구조를 분리한다. BCNF(Boyce-Codd Normal Form)는 3NF를 더 엄격하게 강화한 형태로, 모든 함수 종속의 결정자(Determinant)가 후보키여야 한다는 조건을 추가한다. 후보키가 여러 개 존재하는 상황에서 발생할 수 있는 미묘한 이상까지 제거하기 때문에 Strong 3NF라고도 불린다.
정규화의 실전 적용과 반정규화 트레이드오프
정규화 이론을 실무에 적용할 때는 단순히 단계를 기계적으로 따라가는 것이 아니라, 비즈니스 요구사항과 성능 사이의 균형을 고려해야 한다. 일반적으로 OLTP 환경, 즉 트랜잭션 처리가 중심인 시스템에서는 BCNF까지 정규화를 진행하는 것이 표준이다. 데이터의 정합성과 무결성이 무엇보다 중요하기 때문이며, 정규화된 구조는 갱신·삽입·삭제 시 부작용을 원천적으로 차단해준다. 반면 OLAP 환경, 즉 데이터 분석과 집계가 중심인 시스템에서는 의도적으로 정규화 수준을 낮춰서 설계하는 것이 일반적이다. 분석 쿼리는 주로 대량의 데이터를 읽기 때문에, 너무 많은 테이블을 조인해야 한다면 성능에 큰 부담이 된다.
이러한 맥락에서 등장하는 개념이 반정규화(Denormalization)이다. 반정규화는 정규화를 통해 분리된 테이블을 의도적으로 다시 통합하거나, 자주 조회되는 컬럼을 미리 계산해 별도 컬럼으로 저장하는 기법이다. 자주 함께 조회되는 두 테이블을 하나로 합쳐 조인 비용을 절감하거나, 집계 결과를 별도 테이블에 미리 저장해두는 방식이 대표적이다. 반정규화는 조회 성능을 극적으로 향상시키지만, 그 대가로 데이터 중복이 발생하고 갱신 시 일관성을 유지하기 위한 추가 작업이 필요해진다. 따라서 반정규화를 적용할 때는 트랜잭션 빈도, 조회 패턴, 데이터 갱신 주기를 종합적으로 검토해야 한다.
결국 좋은 데이터베이스 설계자는 정규화의 이상을 정확히 이해하고 있으면서도, 그것을 맹목적으로 따르지 않고 시스템의 특성에 맞게 조정할 줄 아는 사람이다. 신규 시스템을 설계할 때는 우선 BCNF까지 정규화를 진행한 뒤, 운영 단계에서 실제 부하를 측정하면서 병목 지점에 한해 선별적으로 반정규화를 적용하는 접근이 가장 안전하다. 처음부터 성능을 위해 반정규화된 구조로 설계하면, 나중에 데이터 무결성 문제가 발생했을 때 그것을 되돌리는 비용이 훨씬 더 크기 때문이다. 정규화는 정답이 아니라 출발점이며, 반정규화는 충분한 측정과 근거가 있을 때만 신중하게 도입해야 할 보완 도구라는 사실을 기억해야 한다.
메타 디스크립션: 데이터베이스의 삽입·갱신·삭제 이상 현상과 이를 제거하는 정규화 단계(1NF~BCNF)를 함수 종속성 개념과 함께 정리하고, 실무에서의 반정규화 트레이드오프까지 정보처리기사 출제 기준에 맞춰 설명합니다.