Skip to Content
독학사독학사 4단계데이터베이스14. 정규화 I: 1NF~3NF·BCNF와 분해 절차

이번 문서의 목표: 이 파일을 다 읽으면 1NF부터 BCNF까지 각 정규형의 판별 조건을 함수적 종속(FD)으로 정확히 서술하고, 15편에서 다룬 수강정보 릴레이션을 실제로 1NF→2NF→3NF→BCNF 순서로 분해하며, 무손실 조인·의존성 보존이라는 두 분해 품질 기준을 스스로 검증할 수 있게 된다.

왜 정규화가 필요한가

15편에서 수강정보(학번, 이름, 학과, 과목코드, 과목명, 담당교수) 릴레이션이 삽입·삭제·갱신 이상을 모두 일으킨다는 것을 확인했다. 원인은 “학생 정보”와 “과목 정보”라는 서로 독립적인 두 개념이 하나의 릴레이션에 억지로 뒤섞여 있기 때문이었다. 정규화(normalization)는 이 문제를 임의로 감이 아니라, 함수적 종속을 근거로 기계적으로 판별하고 분해하는 절차다. “왜 이 두 정보를 나눠야 하는가”라는 질문에 “결정자가 후보키가 아니기 때문”이라고 정확히 답할 수 있게 하는 것이 이 편의 목표다.

쉽게 말하면: 정규화는 “이 표에 서로 다른 두 가지 이야기가 섞여 있는지”를 함수적 종속으로 검사하고, 섞여 있으면 이야기별로 표를 나누는 작업이다.

이 편에서 계속 쓸 예제 릴레이션

15편의 수강정보 릴레이션을 그대로 이어 쓴다.

수강정보(학번, 이름, 학과, 과목코드, 과목명, 담당교수)

학번이름학과과목코드과목명담당교수
S1김민준컴퓨터공학C001데이터베이스이교수
S1김민준컴퓨터공학C002운영체제박교수
S2이서연컴퓨터공학C001데이터베이스이교수
S3박도윤전자공학C001데이터베이스이교수
S3박도윤전자공학C003네트워크최교수
S4최지우컴퓨터공학C002운영체제박교수

15편에서 이미 확인한 함수적 종속 집합과 후보키는 다음과 같다.

F={ 학번이름,  학번학과,  과목코드과목명,  과목코드담당교수 }F = \{\ \text{학번} \rightarrow \text{이름},\ \ \text{학번} \rightarrow \text{학과},\ \ \text{과목코드} \rightarrow \text{과목명},\ \ \text{과목코드} \rightarrow \text{담당교수}\ \}

후보키는 {학번,과목코드}\{\text{학번}, \text{과목코드}\}이다(15편의 폐포 계산으로 확인함).

1. 제1정규형(1NF) — 원자값 조건

정의

제1정규형(1st Normal Form, 1NF)은 릴레이션의 모든 속성 값이 원자값(atomic value, 더 이상 쪼갤 수 없는 하나의 값)이어야 한다는 조건이다. 관계 데이터 모델은 정의상 이미 1NF를 전제로 하므로(06편에서 릴레이션을 정의할 때부터 각 속성은 하나의 도메인에서 하나의 값만 가진다고 규정했다), 1NF는 사실 “릴레이션이라 부를 수 있기 위한 최소 조건”이다.

계산·적용: 비정규 릴레이션 판별

다음처럼 한 학생이 수강하는 과목을 쉼표로 묶어 한 칸에 넣은 표는 1NF를 위반한다.

학번이름수강과목
S1김민준C001, C002

“수강과목” 칸에 값이 두 개(C001과 C002) 들어 있으므로 원자값 조건을 위반한다. 이를 1NF로 만드는 방법은 두 가지다.

  1. 행을 나눈다: (S1, 김민준, C001), (S1, 김민준, C002)처럼 과목 하나당 한 행으로 풀어 쓴다. 이것이 앞서 제시한 수강정보 릴레이션의 형태다.
  2. 반복 그룹을 별도 릴레이션으로 분리한다: 학생 정보와 수강 정보를 처음부터 별개의 릴레이션으로 설계한다.

결과 해석

수강정보 릴레이션은 이미 각 칸에 원자값만 들어 있으므로 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도 만족한다.

계산·적용: 부분 함수적 종속 찾기

수강정보의 후보키는 {학번,과목코드}\{\text{학번}, \text{과목코드}\}(복합키)다. 비키 속성(이름, 학과, 과목명, 담당교수) 각각이 이 키 전체에 완전히 종속하는지, 아니면 진부분집합만으로 결정되는지 하나씩 검사한다.

비키 속성결정하는 진부분집합완전/부분 종속
이름학번만으로 결정됨(학번 → 이름)부분 함수적 종속
학과학번만으로 결정됨(학번 → 학과)부분 함수적 종속
과목명과목코드만으로 결정됨(과목코드 → 과목명)부분 함수적 종속
담당교수과목코드만으로 결정됨(과목코드 → 담당교수)부분 함수적 종속

네 속성 모두 키 전체가 아니라 키의 일부만으로 결정되므로, 수강정보부분 함수적 종속을 네 개나 갖고 있어 2NF를 위반한다.

2NF 분해 절차

  1. 위반하는 부분 함수적 종속을 그룹으로 묶는다: 학번에만 종속하는 {이름, 학과}, 과목코드에만 종속하는 {과목명, 담당교수}로 나눈다.
  2. 각 결정자(진부분집합)를 기본키로 하는 새 릴레이션을 만든다: 학번을 기본키로 하는 릴레이션, 과목코드를 기본키로 하는 릴레이션을 각각 분리한다.
  3. 원래 키 전체에 완전 함수적으로 종속하는 속성은 원래 릴레이션에 남긴다: 이 예제에는 학번·과목코드 전체에 완전히 종속하는 비키 속성이 없으므로(성적 같은 속성이 있었다면 여기 남았을 것이다), 원래 릴레이션은 키 속성만 남는다.

분해 결과는 다음 세 릴레이션이다.

학생(학번, 이름, 학과) — 기본키: 학번

학번이름학과
S1김민준컴퓨터공학
S2이서연컴퓨터공학
S3박도윤전자공학
S4최지우컴퓨터공학

과목(과목코드, 과목명, 담당교수) — 기본키: 과목코드

과목코드과목명담당교수
C001데이터베이스이교수
C002운영체제박교수
C003네트워크최교수

수강(학번, 과목코드) — 기본키: (학번, 과목코드), 외래키: 학번 → 학생, 과목코드 → 과목

학번과목코드
S1C001
S1C002
S2C001
S3C001
S3C003
S4C002

결과 해석

15편에서 지적한 세 이상 현상이 이 분해로 모두 해소된다.

  • 삽입 이상 해소: 아직 아무도 신청하지 않은 새 과목(C004, 인공지능, 정교수)도 과목 릴레이션에 독립적으로 삽입할 수 있다. 수강 릴레이션에 학번이 없어도 무방하다.
  • 삭제 이상 해소: 박도윤이 C003 수강을 취소해 수강 릴레이션에서 (S3, C003) 행을 지워도, 과목 릴레이션의 “C003, 네트워크, 최교수” 정보는 별도로 남아 사라지지 않는다.
  • 갱신 이상 해소: C001의 담당교수가 바뀌면 과목 릴레이션의 단 한 행(과목코드 C001)만 수정하면 되고, 모순이 생길 여지가 없다.

자주 틀리는 함정: 2NF 분해에서 “학생”과 “과목” 릴레이션을 분리한 후에도 두 릴레이션을 다시 연결할 방법(외래키)이 남아 있어야 한다는 점을 놓치기 쉽다. 수강(학번, 과목코드) 릴레이션이 바로 그 연결 고리이며, 이 릴레이션이 없으면 “누가 어떤 과목을 듣는지”라는 원래 정보 자체가 사라져 무손실 조인이 깨진다. 분해 후 반드시 세 릴레이션을 조인해 원래 데이터를 정확히 복원할 수 있는지 확인해야 한다.

3. 제3정규형(3NF) — 이행적 함수적 종속 제거

정의

제3정규형(3rd Normal Form, 3NF)은 2NF를 만족하면서, 비키 속성이 후보키에 이행적으로 종속하지 않아야 한다는 조건이다. 이행적 함수적 종속(transitive functional dependency)이란, 후보키 XX에 대해 XYX \rightarrow Y이고 YZY \rightarrow Z이면서 YY가 후보키가 아닐 때 성립하는 XZX \rightarrow Z 관계를 말한다. 즉 “키가 비키 속성을 거쳐서 다른 비키 속성을 간접적으로 결정하는” 관계를 제거하는 단계다.

계산·적용: 이행적 종속이 있는 릴레이션

2NF 분해로 얻은 세 릴레이션에 이행적 종속이 남아 있는지 검사해 본다. 학생(학번, 이름, 학과)수강(학번, 과목코드)은 비키 속성이 하나 이하이거나 이미 완전 종속만 있어 이행적 종속이 있을 수 없다. 과목(과목코드, 과목명, 담당교수)도 현재 형태로는 이행적 종속이 없어 보이지만, 만약 “담당교수의 연구실 호수”라는 속성이 추가로 있었다면 어떤 문제가 생기는지 확인해 보자.

과목_확장(과목코드, 과목명, 담당교수, 연구실호수)

과목코드과목명담당교수연구실호수
C001데이터베이스이교수501호
C002운영체제박교수502호
C003네트워크최교수503호

이 릴레이션에는 다음 두 함수적 종속이 성립한다고 가정한다.

과목코드담당교수\text{과목코드} \rightarrow \text{담당교수} 담당교수연구실호수\text{담당교수} \rightarrow \text{연구실호수}

이행률(15편의 Armstrong 공리)에 따라 과목코드연구실호수\text{과목코드} \rightarrow \text{연구실호수}도 성립한다. 이때 결정자 “담당교수”는 이 릴레이션의 후보키가 아니므로(과목코드만 후보키), 과목코드담당교수연구실호수\text{과목코드} \rightarrow \text{담당교수} \rightarrow \text{연구실호수}이행적 함수적 종속이며 3NF를 위반한다.

3NF 분해 절차

  1. 이행적 종속의 중간 결정자를 새 릴레이션의 기본키로 분리한다: “담당교수”를 기본키로 하는 릴레이션을 새로 만든다.
  2. 중간 결정자가 결정하는 속성을 새 릴레이션으로 옮긴다: “연구실호수”를 새 릴레이션으로 옮긴다.
  3. 원래 릴레이션에는 중간 결정자만 외래키로 남긴다: 과목 릴레이션에는 담당교수 컬럼을 그대로 두되, 이제 이 컬럼이 새 릴레이션을 참조하는 외래키가 된다.

분해 결과는 다음과 같다.

과목(과목코드, 과목명, 담당교수) — 기본키: 과목코드, 외래키: 담당교수 → 교수

과목코드과목명담당교수
C001데이터베이스이교수
C002운영체제박교수
C003네트워크최교수

교수(담당교수, 연구실호수) — 기본키: 담당교수

담당교수연구실호수
이교수501호
박교수502호
최교수503호

결과 해석

이 분해로 “한 교수가 여러 과목을 맡는데 연구실호수가 각 과목 행마다 중복 저장되는” 문제와, “그 교수가 아직 어떤 과목도 배정받지 않았다면 연구실호수를 저장할 곳이 없는” 삽입 이상이 함께 해소된다. 이는 2NF 분해와 원리가 완전히 같다 — 결정자를 키로 하는 릴레이션을 분리하고, 그 결정자가 결정하는 속성을 함께 옮긴다.

자주 틀리는 함정: “부분 함수적 종속(2NF 위반)과 이행적 함수적 종속(3NF 위반)은 완전히 다른 현상이다”라고 오해하기 쉽지만, 두 위반 모두 “키가 아닌 것이 다른 속성을 결정하고 있다”는 같은 뿌리를 가진다. 차이는 그 위반이 복합키의 일부(부분 종속, 2NF)에서 생기는지, 비키 속성을 거쳐 간접적으로(이행 종속, 3NF) 생기는지일 뿐이다. 이 공통점을 이해하면 다음에 배울 BCNF가 왜 이 둘을 하나의 통일된 조건으로 묶어 표현하는지 자연스럽게 이해된다.

4. Boyce-Codd 정규형(BCNF) — 결정자는 항상 후보키

정의

BCNF(Boyce-Codd Normal Form)는 릴레이션에 성립하는 모든 함수적 종속 XYX \rightarrow Y(단, YYXX의 부분집합인 자명한 종속은 제외)에 대해 XX가 반드시 슈퍼키여야 한다는 조건이다. 2NF·3NF가 “비키 속성이 어떻게 종속하는가”에 초점을 맞춘 반면, BCNF는 “결정자가 누구인가” 하나로 통일해서 검사한다는 점이 다르다.

모든 자명하지 않은 XY에 대해 X는 슈퍼키다\text{모든 자명하지 않은 } X \rightarrow Y \text{에 대해 } X \text{는 슈퍼키다}

3NF와 BCNF는 대부분의 경우 같은 결과를 주지만, 후보키가 여러 개이고 서로 겹치는(복합 후보키를 가지면서 속성이 겹치는) 특수한 경우에는 3NF는 만족하지만 BCNF는 위반하는 릴레이션이 존재한다.

계산·적용: 3NF는 만족하지만 BCNF는 위반하는 사례

학생이 여러 과목을 신청하고, 각 과목마다 여러 교수가 개설하지만 한 학생은 한 과목에 대해 교수를 한 명만 선택하는 다음 릴레이션을 생각해 보자.

수강_지도교수(학번, 과목코드, 지도교수)

학번과목코드지도교수
S1C001이교수
S1C002박교수
S2C001김교수
S3C001이교수

이 릴레이션에 다음 두 업무 규칙이 함수적 종속으로 성립한다고 가정한다.

{학번,과목코드}지도교수\{\text{학번}, \text{과목코드}\} \rightarrow \text{지도교수} 지도교수과목코드\text{지도교수} \rightarrow \text{과목코드}

첫 번째 종속은 “학번과 과목코드를 알면 그 조합의 지도교수가 하나로 정해진다”는 뜻이고, 두 번째 종속은 “한 지도교수는 오직 한 과목만 담당한다”는 업무 규칙(위 데이터에서 이교수는 항상 C001만, 박교수는 항상 C002만 등장하는 것으로 확인된다)을 반영한다.

이 릴레이션의 후보키를 15편의 폐포 계산 절차로 확인해 보면, {학번,과목코드}\{\text{학번}, \text{과목코드}\}의 폐포는 전체 속성이 되어 후보키이고, {학번,지도교수}\{\text{학번}, \text{지도교수}\}의 폐포도(지도교수 → 과목코드이므로) 전체 속성이 되어 역시 후보키다. 즉 이 릴레이션은 후보키가 두 개다.

이제 3NF와 BCNF를 각각 검사한다.

  1. 3NF 검사: “지도교수 → 과목코드”에서 결정자 “지도교수”는 후보키가 아니지만, 종속자 “과목코드”는 후보키 {학번,지도교수}\{\text{학번}, \text{지도교수}\}를 구성하는 속성 중 하나다. 3NF의 정의(엄밀하게는 “종속자가 후보키의 일부이면 예외를 허용한다”는 조항)에 따라 이 경우는 3NF 위반이 아니다.
  2. BCNF 검사: BCNF는 이런 예외 조항이 없다. “지도교수 → 과목코드”에서 결정자 “지도교수”가 후보키가 아니므로, 이 종속 하나만으로 BCNF를 위반한다.

BCNF 분해 절차

  1. BCNF를 위반하는 종속을 찾는다: 지도교수 → 과목코드(결정자 지도교수가 후보키 아님).
  2. 결정자를 기본키로, 종속자를 함께 옮기는 새 릴레이션을 만든다: (지도교수, 과목코드) 릴레이션을 분리한다.
  3. 원래 릴레이션에는 결정자만 남기고 종속자는 제거한다: (학번, 지도교수) 릴레이션으로 남긴다.

분해 결과는 다음과 같다.

수강_지도(학번, 지도교수)

학번지도교수
S1이교수
S1박교수
S2김교수
S3이교수

지도_담당과목(지도교수, 과목코드)

지도교수과목코드
이교수C001
박교수C002
김교수C001

두 릴레이션을 지도교수 기준으로 자연 조인하면 원래 테이블이 정확히 복원되므로 무손실 조인이 성립하며, 각 릴레이션에서 결정자(학번, 지도교수 각각)가 모두 후보키이므로 두 릴레이션 모두 BCNF를 만족한다.

자주 틀리는 함정: BCNF 분해는 의존성 보존(dependency preservation, 원래의 모든 함수적 종속을 분해된 릴레이션들만으로 다시 검사할 수 있어야 한다는 성질)을 항상 보장하지는 못한다는 점이 3NF 분해와의 결정적 차이다. 위 예제에서 원래의 종속 {학번,과목코드}지도교수\{\text{학번}, \text{과목코드}\} \rightarrow \text{지도교수}는 분해된 두 릴레이션(수강_지도, 지도_담당과목)만 따로 보면 직접 검사할 수 없고, 두 릴레이션을 다시 조인해야만 확인할 수 있다. 반면 3NF 분해 알고리즘(합성 분해, synthesis)은 항상 무손실 조인과 의존성 보존을 동시에 보장하도록 설계되어 있다. 따라서 “BCNF로 분해하면 항상 의존성도 보존된다”는 진술은 틀렸다.

정규형 판별 기준 한눈에 비교

정규형검사 대상위반 조건핵심 키워드
1NF모든 속성 값원자값이 아닌 값(다중값·복합값) 존재원자값
2NF비키 속성후보키의 진부분집합에만 종속(부분 함수적 종속)완전 함수적 종속
3NF비키 속성비키 속성을 거쳐 간접적으로 종속(이행적 함수적 종속), 단 종속자가 후보키의 일부면 예외이행적 함수적 종속
BCNF모든 결정자결정자가 후보키가 아닌 함수적 종속이 하나라도 존재(예외 없음)결정자가 곧 후보키

핵심 정리

  • 1NF는 모든 속성 값이 원자값이어야 한다는 조건으로 관계 모델의 최소 전제이며, 1NF만으로는 이상 현상을 막지 못한다.
  • 2NF는 비키 속성이 후보키에 완전 함수적으로 종속해야 한다는 조건(부분 함수적 종속 제거)이며, 후보키가 단일 속성이면 자동으로 만족된다.
  • 3NF는 비키 속성이 이행적으로 종속하지 않아야 한다는 조건(이행적 함수적 종속 제거)이지만, 종속자가 후보키의 일부인 경우는 예외로 허용한다.
  • BCNF는 3NF의 예외 조항 없이 “모든 결정자는 후보키다”라는 단일 기준으로 검사하며, 후보키가 여러 개이고 서로 겹치는 특수한 경우 3NF는 만족해도 BCNF는 위반할 수 있다.
  • 3NF 분해(합성 분해)는 무손실 조인과 의존성 보존을 항상 동시에 보장하지만, BCNF 분해는 무손실 조인은 항상 보장해도 의존성 보존은 보장하지 못할 수 있다.

마무리 복습

문제 14지선다
제1정규형(1NF)에 대한 설명으로 가장 정확한 것은?
문제 24지선다
수강정보(학번, 이름, 학과, 과목코드, 과목명, 담당교수)에서 학번 → 이름이 성립할 때, 이 종속이 부분 함수적 종속인 이유로 옳은 것은?
문제 34지선다
과목_확장(과목코드, 과목명, 담당교수, 연구실호수)에서 과목코드 → 담당교수, 담당교수 → 연구실호수가 성립하고 과목코드만 후보키일 때, 이 릴레이션이 위반하는 정규형과 그 이유로 옳은 것은?
문제 44지선다
수강_지도교수(학번, 과목코드, 지도교수)에서 {학번,과목코드}→지도교수, 지도교수→과목코드가 성립하고 후보키가 {학번,과목코드}와 {학번,지도교수} 두 개일 때, 이 릴레이션에 대한 설명으로 옳은 것은?
문제 54지선다
BCNF 분해와 3NF 분해(합성 분해)의 차이에 대한 설명으로 옳은 것은?
문제 64지선다
정규화 단계 중 '결정자가 후보키의 일부인지'는 예외로 허용하고 검사하지 않는 정규형은 무엇인가?

참고 자료

Last updated on