모던지 / 정보처리기사 / 데이터베이스 구축 2강. 정규화와 이상 현상

데이터베이스 구축 2강. 정규화와 이상 현상

테이블을 잘못 만들면 데이터를 지웠을 뿐인데 다른 정보까지 사라집니다. 정규화는 이 황당한 일을 막는 절차입니다.

풀고 시작

문제 1. 릴레이션에서 한 튜플을 삭제했을 때 유지되어야 할 다른 정보까지 함께 사라지는 현상은?
지우지 말아야 할 정보까지 연쇄적으로 지워지는 것이 삭제 이상입니다. 삽입 이상은 원하지 않는 값까지 넣어야만 저장이 되는 현상, 갱신 이상은 중복된 값 중 일부만 고쳐져 불일치가 생기는 현상이며, 종속 이상이라는 용어는 표준 분류에 없습니다.

한 테이블에 다 넣으면 벌어지는 일

수강 정보를 표 하나에 다 담았다고 해 봅시다. 학번, 이름, 과목코드, 과목명, 담당교수, 학점이 한 줄에 들어 있습니다. 편해 보이지만 세 가지 사고가 기다립니다.

삽입 이상입니다. 새로 개설한 과목이 있는데 아직 수강생이 없다면, 이 표에는 넣을 수가 없습니다. 학번이 기본키의 일부라 비워 둘 수 없으니까요. 억지로 넣으려면 가짜 학생을 만들어야 합니다.

삭제 이상입니다. 어떤 과목의 유일한 수강생이 수강을 취소하면 그 줄이 사라지고, 그와 함께 과목명과 담당교수 정보까지 증발합니다. 지우려던 것은 수강 기록 하나뿐이었는데 말이죠.

갱신 이상입니다. 담당교수가 바뀌면 그 과목이 등장하는 모든 줄을 고쳐야 합니다. 하나라도 빠뜨리면 같은 과목의 교수가 두 명이 되어 버립니다.

원인은 하나입니다. 서로 다른 주제의 사실이 한 테이블에 섞여 있는 것이죠. 이 섞임을 풀어내는 절차가 정규화(normalization)입니다.

함수적 종속을 알면 정규형이 보입니다

정규화의 언어는 함수적 종속입니다. 속성 A의 값이 정해지면 속성 B의 값이 하나로 정해질 때, B는 A에 함수적으로 종속한다고 말하고 A에서 B로 화살표를 그립니다. 학번이 정해지면 이름이 정해지니 학번에서 이름으로 종속이 있는 것이죠.

여기서 두 가지 나쁜 종속이 문제가 됩니다. 부분 함수 종속은 기본키가 여러 속성으로 이루어져 있을 때 그중 일부에만 종속되는 경우입니다. 기본키가 학번과 과목코드인데 이름은 학번만으로 정해지는 상황이죠. 이행적 종속은 A에서 B로, B에서 C로 종속이 이어져 결국 A에서 C가 따라오는 경우입니다.

정규형은 이 나쁜 종속을 하나씩 제거하며 올라갑니다.

정규형 제거하는 것
제1정규형 (1NF) 반복되는 그룹을 없애 모든 속성을 원자값으로
제2정규형 (2NF) 부분 함수 종속 제거
제3정규형 (3NF) 이행적 함수 종속 제거
보이스-코드 정규형 (BCNF) 결정자이면서 후보키가 아닌 것 제거
제4정규형 (4NF) 다치 종속 제거
제5정규형 (5NF) 조인 종속 제거

외우는 요령이 있습니다. "원자값, 부분, 이행, 결정자, 다치, 조인"을 순서대로 읊는 것이죠. 앞 네 글자만 기억해도 대부분의 문제가 풀립니다. 특히 2정규형과 3정규형이 각각 무엇을 없애는지 뒤바꿔 놓은 보기가 단골입니다.

BCNF는 3정규형을 조금 더 조인 것입니다. 어떤 속성 집합이 다른 속성을 결정하고 있는데(결정자인데) 그 자신이 후보키가 아니라면, 그것을 분리합니다. 3정규형을 만족해도 BCNF를 만족하지 않는 릴레이션이 존재하기 때문에 따로 이름이 붙었습니다.

쪼갠다고 늘 좋은 것은 아닙니다

정규화를 하면 테이블이 늘어납니다. 그러면 원하는 정보를 얻기 위해 여러 테이블을 조인해야 하고, 조인은 비용이 듭니다. 그래서 조회 성능이 중요한 시스템에서는 일부러 정규화를 되돌리기도 하는데 이를 반정규화(denormalization)라고 합니다.

반정규화 기법으로는 테이블을 합치는 병합, 자주 쓰는 컬럼을 복제해 두는 중복 컬럼 추가, 계산 결과를 미리 저장하는 파생 컬럼 추가, 테이블을 쪼개는 분할 등이 있습니다. 다만 반정규화는 데이터 무결성을 성능과 맞바꾸는 결정입니다. 중복이 생기면 갱신 이상의 위험이 되살아나므로, 그 관리 책임을 응용 프로그램이 떠안게 됩니다.

정규화와 반정규화 중 무엇이 옳으냐는 질문에는 정답이 없습니다. 다만 순서는 있습니다. 먼저 정규화하고, 측정한 뒤에, 근거를 갖고 되돌리는 것입니다. 처음부터 성능을 핑계로 뭉쳐 두는 것은 반정규화가 아니라 그냥 설계 실패입니다.

다음 강에서는 논리 설계를 실제 저장 구조로 옮기는 물리 설계와, 동시에 여러 사람이 접근할 때의 문제인 트랜잭션을 봅니다.

인출 문제

문제 1. 제2정규형에서 제3정규형으로 가기 위해 제거해야 하는 것은?
3정규형은 이행적 종속을 없앤 상태입니다. 부분 함수 종속 제거는 2정규형으로 가는 조건이고, 다치 종속 제거는 4정규형, 반복 그룹 제거는 1정규형의 조건이라 각 단계가 서로 다른 문제를 다룹니다.
문제 2. 어떤 릴레이션에서 결정자이면서 후보키가 아닌 속성 집합을 제거한 정규형은?
결정자가 반드시 후보키여야 한다는 조건을 추가한 것이 BCNF이며 3정규형보다 강한 조건입니다. 3정규형을 만족하면서도 BCNF를 만족하지 않는 릴레이션이 존재하기 때문에 별도의 정규형으로 정의됐습니다.
문제 3. 반정규화에 대한 설명으로 옳지 않은 것은?
반정규화는 무결성을 성능과 맞바꾸는 결정이라 갱신 이상의 위험은 오히려 커집니다. 그래서 중복된 값이 어긋나지 않도록 응용 프로그램이나 트리거로 관리해야 합니다.
문제 4. 학생 정보와 과목 정보가 한 테이블에 있어, 수강생이 없는 새 과목을 등록할 수 없는 상황은 어떤 이상 현상인가요?
저장하고 싶은 것만 저장할 수 없고 불필요한 값까지 있어야 넣을 수 있는 상황이 삽입 이상입니다. 삭제 이상은 지울 때 다른 정보까지 사라지는 경우, 갱신 이상은 중복 값의 일부만 수정되어 불일치가 생기는 경우입니다.

생각해볼 질문 (정답 없음)

정규화는 데이터의 진실을 한 곳에만 두려는 원칙입니다. 그런데 현실의 사실은 관점에 따라 다르게 기록되기도 하죠. 한 곳에만 둘 수 없는 사실은 어떻게 설계해야 할까요.


이전: 1강 데이터베이스 개념과 논리 설계 · 다음: 3강 물리 설계와 인덱스·트랜잭션

모던지 · 궁금하면 모던지 GitHub · 2026-09-10