데이터베이스 정규화 2NF·3NF·BCNF: 함수 종속과 후보키로 구분하기
부분 종속·이행 종속·슈퍼키 조건을 구분하고, 수강 테이블을 분해하는 예시로 2NF·3NF·BCNF의 차이를 확인해요.
2NF는 비주요 속성의 부분 함수 종속을 없애고, 3NF는 비주요 속성의 이행 종속 문제까지 다뤄요. BCNF는 모든 비자명 함수 종속의 결정자가 슈퍼키여야 해요. 정규형 이름부터 외우기보다 후보키와 함수 종속을 먼저 적으면 구분할 수 있어요.
먼저 네 가지 용어를 확인해요
| 용어 | 뜻 | 주의할 점 |
|---|---|---|
| 함수 종속 X → A | X 값이 같으면 A 값도 같아야 한다는 제약 | 현재 표에서 우연히 같은 것과 업무상 제약을 구분해요 |
| 슈퍼키 | 릴레이션의 모든 속성을 결정하는 속성 집합 | 필요 없는 속성을 더 포함할 수도 있어요 |
| 후보키 | 더 줄이면 슈퍼키가 되지 않는 최소 슈퍼키 | 여러 개 있을 수 있고, 기본키는 그중 선택한 하나예요 |
| 주요 속성·비주요 속성 | 후보키 하나 이상에 속하는 속성·어느 후보키에도 속하지 않는 속성 | 기본키에 없다는 이유만으로 비주요 속성은 아니에요 |
X → A에서 A가 이미 X에 포함되면 자명한 종속이에요. BCNF·3NF의 판정에서는 이런 자명한 종속을 위반으로 세지 않아요.
정규형을 비교해요
| 단계 | 판정 기준 | 흔히 찾는 위반 단서 |
|---|---|---|
| 1NF | 각 속성값이 해당 도메인에서 원자값 | 한 칸에 반복 목록을 넣음 |
| 2NF | 1NF이며 모든 비주요 속성이 모든 후보키에 완전 함수 종속 | 복합 후보키의 일부만으로 비주요 속성이 결정됨 |
| 3NF | 모든 비자명 X → A에서 X가 슈퍼키이거나 A가 주요 속성 | 일반적인 단일 후보키 예시에서는 비키 속성을 거치는 이행 종속 |
| BCNF | 모든 비자명 X → A에서 X가 슈퍼키 | 슈퍼키가 아닌 속성 집합이 다른 속성을 결정함 |
3NF의 ‘이행 종속 제거’는 기본 예제를 푸는 데 유용한 요약이에요. 여러 후보키가 겹치는 경우에는 표의 정확한 정의로 판정해야 해요. BCNF이면 3NF이지만, 3NF이라고 반드시 BCNF인 것은 아니에요.
수강 테이블을 2NF와 3NF로 나눠 봐요
다음 표는 설명을 위해 새로 만든 예시이며 기출 자료가 아니에요. 한 학생은 한 학과에 속하고, 학과마다 사무실이 하나이며, 한 학생의 같은 과목 수강은 한 행만 기록한다고 가정해요.
| 학번 | 과목코드 | 학생명 | 학과 | 학과사무실 | 점수 |
|---|---|---|---|---|---|
| S1 | C1 | 민서 | 전산 | 301 | 80 |
| S1 | C2 | 민서 | 전산 | 301 | 90 |
| S2 | C1 | 준호 | 전산 | 301 | 85 |
업무 규칙으로 주어진 함수 종속은 다음과 같아요. 예시 행만 보고 추가 종속을 추측하지 않아요.
- (학번, 과목코드) → 점수
- 학번 → 학생명, 학과
- 학과 → 학과사무실
후보키는 (학번, 과목코드)예요. 학생명·학과·학과사무실은 학번만으로 결정되므로 키의 일부에 종속되어 2NF를 위반해요. 먼저 수강과 학생으로 분리해요.
| 단계 | 테이블과 후보키 | 해소한 문제 |
|---|---|---|
| 2NF 분해 | 수강(학번, 과목코드, 점수), 후보키 (학번, 과목코드) | 점수만 복합키 전체에 종속되어 남아요 |
| 2NF 분해 | 학생(학번, 학생명, 학과, 학과사무실), 후보키 학번 | 학생 정보의 부분 종속을 수강에서 분리해요 |
| 3NF 분해 | 학생(학번, 학생명, 학과), 후보키 학번 | 학번 → 학과 → 학과사무실의 이행 종속을 분리해요 |
| 3NF 분해 | 학과(학과, 학과사무실), 후보키 학과 | 학과사무실을 해당 학과에서 한 번 관리해요 |
이 가정에서는 최종 수강·학생·학과 테이블 모두 BCNF도 만족해요. 분해 전에는 학과 사무실을 옮길 때 여러 수강 행을 함께 고쳐야 했지만, 분해 후에는 학과 테이블의 해당 행에서 관리할 수 있어요. 이것이 중복 때문에 생기는 수정 이상을 줄이는 예예요.
3NF이지만 BCNF는 아닌 경우
새 예시로 지도(학생, 과목, 강사)를 생각해요. 다음 두 종속만을 업무 제약으로 가정해요.
- (학생, 과목) → 강사: 학생은 같은 과목에서 강사 한 명에게 배워요.
- 강사 → 과목: 한 강사는 한 과목만 맡아요.
후보키는 (학생, 과목)과 (학생, 강사)예요. 모든 속성이 적어도 하나의 후보키에 속하므로 주요 속성이에요. 강사 → 과목에서 강사는 학생을 결정하지 못하므로 슈퍼키가 아니에요. 하지만 우변인 과목은 주요 속성이므로 3NF는 허용하고 BCNF는 허용하지 않아요.
강사·과목 테이블과 학생·강사 테이블로 분해하면 이 예시의 BCNF 위반을 해소할 수 있어요. 다만 원래의 (학생, 과목) → 강사 제약을 각 테이블의 제약만으로 검사할 수 있는지는 별도 문제예요. 무손실 분해와 종속성 보존을 함께 확인해야 하며, 정규화는 무조건 열을 잘게 나누는 작업이 아니에요.
기출의 ‘모든 결정자가 후보키’는 어떻게 읽나요?
시험에서는 BCNF를 ‘모든 결정자가 후보키인 정규형’이라고 줄여 표현하기도 해요. 엄밀한 정의는 모든 비자명 함수 종속의 결정자가 슈퍼키라는 조건이에요. 후보키에 불필요한 속성을 더한 집합도 슈퍼키가 될 수 있으므로, 후보키와 슈퍼키를 같은 말로 외우면 안 돼요.
정보처리기사 2021년 2회 59번은 3NF에서 BCNF로 가는 조건을 묻고 저장된 정답은 ①이에요. 2022년 2회 40번도 결정자의 키 조건이 결정적 단서이며 저장된 정답은 ① BCNF예요. 다른 보기의 부분 종속·이행 종속·원자값 조건이 어느 단계에 해당하는지 비교해 보세요.
확인일은 2026년 10월 29일이에요. Microsoft 문서는 기본 정규화 예시를, Berkeley CS186과 Database System Concepts 자료는 키·3NF·BCNF의 엄밀한 정의를 확인하는 데 사용했어요. BCNF와 4NF는 서로 다른 정규형이에요.
개념 확인 자료
기출에서 확인해 보세요
수록된 실제 문항으로 이동해 직접 답을 골라보세요.