테마
정규화와 반정규화
정규화(normalization)는 테이블 하나에 한 가지 주제의 사실만 남도록 테이블을 나누는 과정이다. 같은 사실이 여러 행에 중복으로 적혀 있으면, 고칠 때 일부만 고쳐져 데이터가 서로 어긋난다. 정규화는 이 중복을 규칙에 따라 단계별로 걷어 낸다. 이 문서는 중복이 부르는 문제, 그리고 정규화의 판단 기준인 키와 함수 종속(functional dependency)을 본다. 정규화 단계마다 테이블이 갖춰야 할 조건인 정규형(normal form)은 2편, 일부러 중복을 되살리는 반정규화(denormalization)는 3편에서 본다.
중복이 부르는 세 가지 이상
학생의 수강 신청을 테이블 하나에 담았다고 하자. 한 행은 "어떤 학생이 어떤 과목을 들어 어떤 성적을 받았다"는 사실이다.
| 학번 | 이름 | 학과 | 학과 전화 | 과목 | 과목명 | 성적 |
|---|---|---|---|---|---|---|
| 1001 | 김민수 | 컴공 | 02-100 | C1 | DB | A |
| 1001 | 김민수 | 컴공 | 02-100 | C2 | 네트워크 | B |
| 1002 | 이지은 | 경영 | 02-200 | C1 | DB | B |
학생 이름·학과, 과목명이 수강할 때마다 되풀이된다. 이 중복 때문에 데이터를 바꿀 때 세 가지 문제가 생기며, 이것을 데이터 이상(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는 데이터 우연이 아니라 업무 규칙. 완전·부분·이행 세 가지.
