Skip to content
난이도 면접 빈출문제은행 5

정규화와 반정규화 ​

정규화(normalization)는 테이블 하나에 한 가지 주제의 사실만 남도록 테이블을 나누는 과정이다. 같은 사실이 여러 행에 중복으로 적혀 있으면, 고칠 때 일부만 고쳐져 데이터가 서로 어긋난다. 정규화는 이 중복을 규칙에 따라 단계별로 걷어 낸다. 이 문서는 중복이 부르는 문제, 그리고 정규화의 판단 기준인 키와 함수 종속(functional dependency)을 본다. 정규화 단계마다 테이블이 갖춰야 할 조건인 정규형(normal form)은 2편, 일부러 중복을 되살리는 반정규화(denormalization)는 3편에서 본다.

중복이 부르는 세 가지 이상 ​

학생의 수강 신청을 테이블 하나에 담았다고 하자. 한 행은 "어떤 학생이 어떤 과목을 들어 어떤 성적을 받았다"는 사실이다.

학번이름학과학과 전화과목과목명성적
1001김민수컴공02-100C1DBA
1001김민수컴공02-100C2네트워크B
1002이지은경영02-200C1DBB

학생 이름·학과, 과목명이 수강할 때마다 되풀이된다. 이 중복 때문에 데이터를 바꿀 때 세 가지 문제가 생기며, 이것을 데이터 이상(anomaly)이라 한다.

  • 갱신 이상(update anomaly): 컴공 학과 전화가 바뀌면 컴공 학생이 들은 모든 행을 고쳐야 한다. 한 행이라도 빠뜨리면 같은 학과 전화가 둘이 되어 어느 쪽이 맞는지 알 수 없다.
  • 삽입 이상(insertion anomaly): 아직 아무도 신청하지 않은 새 과목 C3를 등록할 수 없다. 행을 구분하는 기준인 (학번, 과목) 중 학번을 비워 둘 수 없기 때문이다.
  • 삭제 이상(deletion anomaly): 네트워크(C2)를 듣는 유일한 행을 지우면 "C2의 이름은 네트워크"라는 과목 정보까지 함께 사라진다.

세 문제의 공통 원인은 서로 다른 주제(학생·학과·과목·수강)의 사실이 한 행에 섞여 있다는 것이다. 정규화는 주제별로 테이블을 나눠 이를 푼다. 이때 나눈 테이블을 조인(join)하면 원래 정보를 빠짐없이 다시 얻을 수 있어야 하며, 이런 분해를 무손실 분해(lossless decomposition)라 한다.

키의 종류 ​

정규화 규칙은 "키"를 기준으로 말하므로 키부터 정리한다. 정규화 이론에서는 테이블을 릴레이션(relation), 칼럼을 속성(attribute), 행을 튜플(tuple)이라고도 부른다.

키뜻위 테이블에서
슈퍼 키(super key)행을 하나로 구분할 수 있는 칼럼 묶음(유일성)(학번, 과목), (학번, 과목, 이름) 등
후보 키(candidate key)슈퍼 키 중 칼럼을 하나라도 빼면 구분이 깨지는 최소 묶음(유일성 + 최소성)(학번, 과목)
기본 키(primary key)후보 키 중 대표로 고른 하나. NULL 불가(학번, 과목)
대체 키(alternate key)기본 키로 고르지 않은 나머지 후보 키없음

기본 키는 줄여서 PK(Primary Key)라고 부른다. 예를 들어 학생 테이블에 학번과 주민 번호처럼 각각 유일한 칼럼이 둘 있으면 둘 다 후보 키다. 학번을 기본 키로 고르면 주민 번호는 대체 키가 되고, MySQL에서는 보통 UNIQUE + NOT NULL로 지킨다. 다른 테이블의 기본 키를 가리키는 칼럼은 외래 키(foreign key)다. 후보 키에 들어 있는 칼럼을 주 속성(prime attribute), 어느 후보 키에도 없는 칼럼을 비주 속성(non-prime attribute)이라 부르며, 이 구분이 제2·제3정규형 정의에 쓰인다.

함수 종속 ​

함수 종속(functional dependency)은 "X 값이 정해지면 Y 값이 하나로 정해진다"는 관계이고 X → Y로 쓴다. 이때 X를 결정자(determinant)라 한다. 위 테이블에서 학번 1001이면 이름은 늘 김민수이므로 학번 → 이름이다. 성적은 학번만으로도, 과목만으로도 정해지지 않고 둘이 다 있어야 정해지므로 (학번, 과목) → 성적이다.

함수 종속은 지금 들어 있는 데이터가 우연히 그렇다는 뜻이 아니라 업무 규칙이다. "한 학생은 학과 하나에만 속한다"는 규칙이 있어야 학번 → 학과가 성립한다. 그래서 정규화는 데이터를 보기 전에 업무 규칙을 먼저 확인하는 일이다.

키와 엮어 세 가지로 나눠 부른다.

  • 완전 함수 종속(full functional dependency): 칼럼이 키 전체에 종속된다. (학번, 과목) → 성적.
  • 부분 함수 종속(partial dependency): 여러 칼럼으로 된 키의 일부에만 종속된다. 학번 → 이름, 과목 → 과목명.
  • 이행 함수 종속(transitive dependency): X → Y이고 Y → Z라서 X → Z가 Y를 거쳐 생긴다. 이때 Y는 X를 거꾸로 정하지 못하는, 키가 아닌 칼럼이다. 학번 → 학과, 학과 → 학과 전화이므로 학과 전화는 학번에 이행 종속한다.

이제 기준이 갖춰졌다. 이 함수 종속을 하나씩 걷어 내며 테이블을 나누는 단계인 제1정규형부터 BCNF(Boyce-Codd Normal Form, 보이스-코드 정규형)까지는 정규화와 반정규화 2에서 같은 예제로 이어 본다.

면접 포인트 ​

  • 정규화 목적: 중복 제거 → 갱신·삽입·삭제 이상 방지. 분해는 조인으로 되돌릴 수 있어야 한다(무손실 분해).
  • 키: 슈퍼 키(유일성) ⊃ 후보 키(유일성 + 최소성) ⊃ 기본 키. 남은 후보 키가 대체 키.
  • 주 속성은 후보 키에 속한 칼럼, 비주 속성은 그 밖의 칼럼.
  • 함수 종속 X → Y는 데이터 우연이 아니라 업무 규칙. 완전·부분·이행 세 가지.

관련 문서