이번 문서의 목표: 이 파일을 다 읽으면 1NF부터 BCNF까지 각 정규형의 판별 조건을 함수적 종속(FD)으로 정확히 서술하고, 15편에서 다룬 수강정보 릴레이션을 실제로 1NF→2NF→3NF→BCNF 순서로 분해하며, 무손실 조인·의존성 보존이라는 두 분해 품질 기준을 스스로 검증할 수 있게 된다.
왜 정규화가 필요한가
15편에서 수강정보(학번, 이름, 학과, 과목코드, 과목명, 담당교수) 릴레이션이 삽입·삭제·갱신 이상을 모두 일으킨다는 것을 확인했다. 원인은 “학생 정보”와 “과목 정보”라는 서로 독립적인 두 개념이 하나의 릴레이션에 억지로 뒤섞여 있기 때문이었다. 정규화(normalization)는 이 문제를 임의로 감이 아니라, 함수적 종속을 근거로 기계적으로 판별하고 분해하는 절차다. “왜 이 두 정보를 나눠야 하는가”라는 질문에 “결정자가 후보키가 아니기 때문”이라고 정확히 답할 수 있게 하는 것이 이 편의 목표다.
쉽게 말하면: 정규화는 “이 표에 서로 다른 두 가지 이야기가 섞여 있는지”를 함수적 종속으로 검사하고, 섞여 있으면 이야기별로 표를 나누는 작업이다.
이 편에서 계속 쓸 예제 릴레이션
15편의 수강정보 릴레이션을 그대로 이어 쓴다.
수강정보(학번, 이름, 학과, 과목코드, 과목명, 담당교수)
| 학번 | 이름 | 학과 | 과목코드 | 과목명 | 담당교수 |
|---|---|---|---|---|---|
| S1 | 김민준 | 컴퓨터공학 | C001 | 데이터베이스 | 이교수 |
| S1 | 김민준 | 컴퓨터공학 | C002 | 운영체제 | 박교수 |
| S2 | 이서연 | 컴퓨터공학 | C001 | 데이터베이스 | 이교수 |
| S3 | 박도윤 | 전자공학 | C001 | 데이터베이스 | 이교수 |
| S3 | 박도윤 | 전자공학 | C003 | 네트워크 | 최교수 |
| S4 | 최지우 | 컴퓨터공학 | C002 | 운영체제 | 박교수 |
15편에서 이미 확인한 함수적 종속 집합과 후보키는 다음과 같다.
후보키는 이다(15편의 폐포 계산으로 확인함).
1. 제1정규형(1NF) — 원자값 조건
정의
제1정규형(1st Normal Form, 1NF)은 릴레이션의 모든 속성 값이 원자값(atomic value, 더 이상 쪼갤 수 없는 하나의 값)이어야 한다는 조건이다. 관계 데이터 모델은 정의상 이미 1NF를 전제로 하므로(06편에서 릴레이션을 정의할 때부터 각 속성은 하나의 도메인에서 하나의 값만 가진다고 규정했다), 1NF는 사실 “릴레이션이라 부를 수 있기 위한 최소 조건”이다.
계산·적용: 비정규 릴레이션 판별
다음처럼 한 학생이 수강하는 과목을 쉼표로 묶어 한 칸에 넣은 표는 1NF를 위반한다.
| 학번 | 이름 | 수강과목 |
|---|---|---|
| S1 | 김민준 | C001, C002 |
“수강과목” 칸에 값이 두 개(C001과 C002) 들어 있으므로 원자값 조건을 위반한다. 이를 1NF로 만드는 방법은 두 가지다.
- 행을 나눈다:
(S1, 김민준, C001),(S1, 김민준, C002)처럼 과목 하나당 한 행으로 풀어 쓴다. 이것이 앞서 제시한수강정보릴레이션의 형태다. - 반복 그룹을 별도 릴레이션으로 분리한다: 학생 정보와 수강 정보를 처음부터 별개의 릴레이션으로 설계한다.
결과 해석
수강정보 릴레이션은 이미 각 칸에 원자값만 들어 있으므로 1NF는 만족한다. 그런데도 15편에서 확인했듯 이상 현상이 발생하는 것은, 1NF가 “원자값인가”만 검사할 뿐 “결정자가 키인가”는 전혀 검사하지 않기 때문이다. 이 검사는 2NF부터 시작된다.
자주 틀리는 함정: “1NF를 만족하면 이상 현상이 없다”고 오해하는 것이다. 수강정보가 정확한 반례다. 1NF는 정규화의 출발점일 뿐이며, 삽입·삭제·갱신 이상을 실제로 제거하려면 2NF·3NF·BCNF까지 계속 나아가야 한다.
2. 제2정규형(2NF) — 부분 함수적 종속 제거
정의
제2정규형(2nd Normal Form, 2NF)은 1NF를 만족하면서, 모든 비키 속성(non-key attribute, 어떤 후보키에도 속하지 않는 속성)이 후보키에 완전 함수적으로 종속해야 한다는 조건이다. 15편에서 정의했듯, 완전 함수적 종속은 “키 전체가 있어야만 결정되고, 키의 진부분집합만으로는 결정되지 않는” 종속이다. 즉 2NF는 부분 함수적 종속을 제거하는 단계다.
자주 틀리는 함정: 2NF는 후보키가 복합키(속성 두 개 이상)일 때만 실질적인 의미가 있다. 후보키가 단일 속성이면 그 자체로 “진부분집합”이 공집합뿐이라 부분 함수적 종속이 애초에 성립할 수 없으므로, 후보키가 단일 속성인 릴레이션은 1NF를 만족하는 순간 자동으로 2NF도 만족한다.
계산·적용: 부분 함수적 종속 찾기
수강정보의 후보키는 (복합키)다. 비키 속성(이름, 학과, 과목명, 담당교수) 각각이 이 키 전체에 완전히 종속하는지, 아니면 진부분집합만으로 결정되는지 하나씩 검사한다.
| 비키 속성 | 결정하는 진부분집합 | 완전/부분 종속 |
|---|---|---|
| 이름 | 학번만으로 결정됨(학번 → 이름) | 부분 함수적 종속 |
| 학과 | 학번만으로 결정됨(학번 → 학과) | 부분 함수적 종속 |
| 과목명 | 과목코드만으로 결정됨(과목코드 → 과목명) | 부분 함수적 종속 |
| 담당교수 | 과목코드만으로 결정됨(과목코드 → 담당교수) | 부분 함수적 종속 |
네 속성 모두 키 전체가 아니라 키의 일부만으로 결정되므로, 수강정보는 부분 함수적 종속을 네 개나 갖고 있어 2NF를 위반한다.
2NF 분해 절차
- 위반하는 부분 함수적 종속을 그룹으로 묶는다: 학번에만 종속하는 {이름, 학과}, 과목코드에만 종속하는 {과목명, 담당교수}로 나눈다.
- 각 결정자(진부분집합)를 기본키로 하는 새 릴레이션을 만든다: 학번을 기본키로 하는 릴레이션, 과목코드를 기본키로 하는 릴레이션을 각각 분리한다.
- 원래 키 전체에 완전 함수적으로 종속하는 속성은 원래 릴레이션에 남긴다: 이 예제에는 학번·과목코드 전체에 완전히 종속하는 비키 속성이 없으므로(성적 같은 속성이 있었다면 여기 남았을 것이다), 원래 릴레이션은 키 속성만 남는다.
분해 결과는 다음 세 릴레이션이다.
학생(학번, 이름, 학과) — 기본키: 학번
| 학번 | 이름 | 학과 |
|---|---|---|
| S1 | 김민준 | 컴퓨터공학 |
| S2 | 이서연 | 컴퓨터공학 |
| S3 | 박도윤 | 전자공학 |
| S4 | 최지우 | 컴퓨터공학 |
과목(과목코드, 과목명, 담당교수) — 기본키: 과목코드
| 과목코드 | 과목명 | 담당교수 |
|---|---|---|
| C001 | 데이터베이스 | 이교수 |
| C002 | 운영체제 | 박교수 |
| C003 | 네트워크 | 최교수 |
수강(학번, 과목코드) — 기본키: (학번, 과목코드), 외래키: 학번 → 학생, 과목코드 → 과목
| 학번 | 과목코드 |
|---|---|
| S1 | C001 |
| S1 | C002 |
| S2 | C001 |
| S3 | C001 |
| S3 | C003 |
| S4 | C002 |
결과 해석
15편에서 지적한 세 이상 현상이 이 분해로 모두 해소된다.
- 삽입 이상 해소: 아직 아무도 신청하지 않은 새 과목(C004, 인공지능, 정교수)도
과목릴레이션에 독립적으로 삽입할 수 있다.수강릴레이션에 학번이 없어도 무방하다. - 삭제 이상 해소: 박도윤이 C003 수강을 취소해
수강릴레이션에서 (S3, C003) 행을 지워도,과목릴레이션의 “C003, 네트워크, 최교수” 정보는 별도로 남아 사라지지 않는다. - 갱신 이상 해소: C001의 담당교수가 바뀌면
과목릴레이션의 단 한 행(과목코드 C001)만 수정하면 되고, 모순이 생길 여지가 없다.
자주 틀리는 함정: 2NF 분해에서 “학생”과 “과목” 릴레이션을 분리한 후에도 두 릴레이션을 다시 연결할 방법(외래키)이 남아 있어야 한다는 점을 놓치기 쉽다. 수강(학번, 과목코드) 릴레이션이 바로 그 연결 고리이며, 이 릴레이션이 없으면 “누가 어떤 과목을 듣는지”라는 원래 정보 자체가 사라져 무손실 조인이 깨진다. 분해 후 반드시 세 릴레이션을 조인해 원래 데이터를 정확히 복원할 수 있는지 확인해야 한다.
3. 제3정규형(3NF) — 이행적 함수적 종속 제거
정의
제3정규형(3rd Normal Form, 3NF)은 2NF를 만족하면서, 비키 속성이 후보키에 이행적으로 종속하지 않아야 한다는 조건이다. 이행적 함수적 종속(transitive functional dependency)이란, 후보키 에 대해 이고 이면서 가 후보키가 아닐 때 성립하는 관계를 말한다. 즉 “키가 비키 속성을 거쳐서 다른 비키 속성을 간접적으로 결정하는” 관계를 제거하는 단계다.
계산·적용: 이행적 종속이 있는 릴레이션
2NF 분해로 얻은 세 릴레이션에 이행적 종속이 남아 있는지 검사해 본다. 학생(학번, 이름, 학과)과 수강(학번, 과목코드)은 비키 속성이 하나 이하이거나 이미 완전 종속만 있어 이행적 종속이 있을 수 없다. 과목(과목코드, 과목명, 담당교수)도 현재 형태로는 이행적 종속이 없어 보이지만, 만약 “담당교수의 연구실 호수”라는 속성이 추가로 있었다면 어떤 문제가 생기는지 확인해 보자.
과목_확장(과목코드, 과목명, 담당교수, 연구실호수)
| 과목코드 | 과목명 | 담당교수 | 연구실호수 |
|---|---|---|---|
| C001 | 데이터베이스 | 이교수 | 501호 |
| C002 | 운영체제 | 박교수 | 502호 |
| C003 | 네트워크 | 최교수 | 503호 |
이 릴레이션에는 다음 두 함수적 종속이 성립한다고 가정한다.
이행률(15편의 Armstrong 공리)에 따라 도 성립한다. 이때 결정자 “담당교수”는 이 릴레이션의 후보키가 아니므로(과목코드만 후보키), 는 이행적 함수적 종속이며 3NF를 위반한다.
3NF 분해 절차
- 이행적 종속의 중간 결정자를 새 릴레이션의 기본키로 분리한다: “담당교수”를 기본키로 하는 릴레이션을 새로 만든다.
- 중간 결정자가 결정하는 속성을 새 릴레이션으로 옮긴다: “연구실호수”를 새 릴레이션으로 옮긴다.
- 원래 릴레이션에는 중간 결정자만 외래키로 남긴다:
과목릴레이션에는 담당교수 컬럼을 그대로 두되, 이제 이 컬럼이 새 릴레이션을 참조하는 외래키가 된다.
분해 결과는 다음과 같다.
과목(과목코드, 과목명, 담당교수) — 기본키: 과목코드, 외래키: 담당교수 → 교수
| 과목코드 | 과목명 | 담당교수 |
|---|---|---|
| C001 | 데이터베이스 | 이교수 |
| C002 | 운영체제 | 박교수 |
| C003 | 네트워크 | 최교수 |
교수(담당교수, 연구실호수) — 기본키: 담당교수
| 담당교수 | 연구실호수 |
|---|---|
| 이교수 | 501호 |
| 박교수 | 502호 |
| 최교수 | 503호 |
결과 해석
이 분해로 “한 교수가 여러 과목을 맡는데 연구실호수가 각 과목 행마다 중복 저장되는” 문제와, “그 교수가 아직 어떤 과목도 배정받지 않았다면 연구실호수를 저장할 곳이 없는” 삽입 이상이 함께 해소된다. 이는 2NF 분해와 원리가 완전히 같다 — 결정자를 키로 하는 릴레이션을 분리하고, 그 결정자가 결정하는 속성을 함께 옮긴다.
자주 틀리는 함정: “부분 함수적 종속(2NF 위반)과 이행적 함수적 종속(3NF 위반)은 완전히 다른 현상이다”라고 오해하기 쉽지만, 두 위반 모두 “키가 아닌 것이 다른 속성을 결정하고 있다”는 같은 뿌리를 가진다. 차이는 그 위반이 복합키의 일부(부분 종속, 2NF)에서 생기는지, 비키 속성을 거쳐 간접적으로(이행 종속, 3NF) 생기는지일 뿐이다. 이 공통점을 이해하면 다음에 배울 BCNF가 왜 이 둘을 하나의 통일된 조건으로 묶어 표현하는지 자연스럽게 이해된다.
4. Boyce-Codd 정규형(BCNF) — 결정자는 항상 후보키
정의
BCNF(Boyce-Codd Normal Form)는 릴레이션에 성립하는 모든 함수적 종속 (단, 가 의 부분집합인 자명한 종속은 제외)에 대해 가 반드시 슈퍼키여야 한다는 조건이다. 2NF·3NF가 “비키 속성이 어떻게 종속하는가”에 초점을 맞춘 반면, BCNF는 “결정자가 누구인가” 하나로 통일해서 검사한다는 점이 다르다.
3NF와 BCNF는 대부분의 경우 같은 결과를 주지만, 후보키가 여러 개이고 서로 겹치는(복합 후보키를 가지면서 속성이 겹치는) 특수한 경우에는 3NF는 만족하지만 BCNF는 위반하는 릴레이션이 존재한다.
계산·적용: 3NF는 만족하지만 BCNF는 위반하는 사례
학생이 여러 과목을 신청하고, 각 과목마다 여러 교수가 개설하지만 한 학생은 한 과목에 대해 교수를 한 명만 선택하는 다음 릴레이션을 생각해 보자.
수강_지도교수(학번, 과목코드, 지도교수)
| 학번 | 과목코드 | 지도교수 |
|---|---|---|
| S1 | C001 | 이교수 |
| S1 | C002 | 박교수 |
| S2 | C001 | 김교수 |
| S3 | C001 | 이교수 |
이 릴레이션에 다음 두 업무 규칙이 함수적 종속으로 성립한다고 가정한다.
첫 번째 종속은 “학번과 과목코드를 알면 그 조합의 지도교수가 하나로 정해진다”는 뜻이고, 두 번째 종속은 “한 지도교수는 오직 한 과목만 담당한다”는 업무 규칙(위 데이터에서 이교수는 항상 C001만, 박교수는 항상 C002만 등장하는 것으로 확인된다)을 반영한다.
이 릴레이션의 후보키를 15편의 폐포 계산 절차로 확인해 보면, 의 폐포는 전체 속성이 되어 후보키이고, 의 폐포도(지도교수 → 과목코드이므로) 전체 속성이 되어 역시 후보키다. 즉 이 릴레이션은 후보키가 두 개다.
이제 3NF와 BCNF를 각각 검사한다.
- 3NF 검사: “지도교수 → 과목코드”에서 결정자 “지도교수”는 후보키가 아니지만, 종속자 “과목코드”는 후보키 를 구성하는 속성 중 하나다. 3NF의 정의(엄밀하게는 “종속자가 후보키의 일부이면 예외를 허용한다”는 조항)에 따라 이 경우는 3NF 위반이 아니다.
- BCNF 검사: BCNF는 이런 예외 조항이 없다. “지도교수 → 과목코드”에서 결정자 “지도교수”가 후보키가 아니므로, 이 종속 하나만으로 BCNF를 위반한다.
BCNF 분해 절차
- BCNF를 위반하는 종속을 찾는다: 지도교수 → 과목코드(결정자 지도교수가 후보키 아님).
- 결정자를 기본키로, 종속자를 함께 옮기는 새 릴레이션을 만든다: (지도교수, 과목코드) 릴레이션을 분리한다.
- 원래 릴레이션에는 결정자만 남기고 종속자는 제거한다: (학번, 지도교수) 릴레이션으로 남긴다.
분해 결과는 다음과 같다.
수강_지도(학번, 지도교수)
| 학번 | 지도교수 |
|---|---|
| S1 | 이교수 |
| S1 | 박교수 |
| S2 | 김교수 |
| S3 | 이교수 |
지도_담당과목(지도교수, 과목코드)
| 지도교수 | 과목코드 |
|---|---|
| 이교수 | C001 |
| 박교수 | C002 |
| 김교수 | C001 |
두 릴레이션을 지도교수 기준으로 자연 조인하면 원래 테이블이 정확히 복원되므로 무손실 조인이 성립하며, 각 릴레이션에서 결정자(학번, 지도교수 각각)가 모두 후보키이므로 두 릴레이션 모두 BCNF를 만족한다.
자주 틀리는 함정: BCNF 분해는 의존성 보존(dependency preservation, 원래의 모든 함수적 종속을 분해된 릴레이션들만으로 다시 검사할 수 있어야 한다는 성질)을 항상 보장하지는 못한다는 점이 3NF 분해와의 결정적 차이다. 위 예제에서 원래의 종속 는 분해된 두 릴레이션(수강_지도, 지도_담당과목)만 따로 보면 직접 검사할 수 없고, 두 릴레이션을 다시 조인해야만 확인할 수 있다. 반면 3NF 분해 알고리즘(합성 분해, synthesis)은 항상 무손실 조인과 의존성 보존을 동시에 보장하도록 설계되어 있다. 따라서 “BCNF로 분해하면 항상 의존성도 보존된다”는 진술은 틀렸다.
정규형 판별 기준 한눈에 비교
| 정규형 | 검사 대상 | 위반 조건 | 핵심 키워드 |
|---|---|---|---|
| 1NF | 모든 속성 값 | 원자값이 아닌 값(다중값·복합값) 존재 | 원자값 |
| 2NF | 비키 속성 | 후보키의 진부분집합에만 종속(부분 함수적 종속) | 완전 함수적 종속 |
| 3NF | 비키 속성 | 비키 속성을 거쳐 간접적으로 종속(이행적 함수적 종속), 단 종속자가 후보키의 일부면 예외 | 이행적 함수적 종속 |
| BCNF | 모든 결정자 | 결정자가 후보키가 아닌 함수적 종속이 하나라도 존재(예외 없음) | 결정자가 곧 후보키 |
핵심 정리
- 1NF는 모든 속성 값이 원자값이어야 한다는 조건으로 관계 모델의 최소 전제이며, 1NF만으로는 이상 현상을 막지 못한다.
- 2NF는 비키 속성이 후보키에 완전 함수적으로 종속해야 한다는 조건(부분 함수적 종속 제거)이며, 후보키가 단일 속성이면 자동으로 만족된다.
- 3NF는 비키 속성이 이행적으로 종속하지 않아야 한다는 조건(이행적 함수적 종속 제거)이지만, 종속자가 후보키의 일부인 경우는 예외로 허용한다.
- BCNF는 3NF의 예외 조항 없이 “모든 결정자는 후보키다”라는 단일 기준으로 검사하며, 후보키가 여러 개이고 서로 겹치는 특수한 경우 3NF는 만족해도 BCNF는 위반할 수 있다.
- 3NF 분해(합성 분해)는 무손실 조인과 의존성 보존을 항상 동시에 보장하지만, BCNF 분해는 무손실 조인은 항상 보장해도 의존성 보존은 보장하지 못할 수 있다.
마무리 복습
참고 자료
- 국가평생교육진흥원 학습정보 - 과목별 평가영역: https://bdes.nile.or.kr
- GeeksforGeeks - Database Normalization