테마
이상과 정규화
정규화(normalization)는 한 테이블에 섞인 정보를 종속 관계에 따라 나누어, 중복 때문에 생기는 이상(anomaly)을 없애는 과정이다. 실기 시험은 이상의 세 종류, 함수적 종속(functional dependency)의 종류, 각 정규형(normal form)에서 없애는 것을 단답형으로 묻고, 표를 주고 몇 정규형인지 판단하게 한다.
이상
이상(anomaly)은 중복 때문에 테이블을 조작할 때 예기치 않게 생기는 문제다. 아래 수강 테이블은 (학번, 강좌)가 기본키(primary key)이고, 학생 정보와 학과장까지 한곳에 담았다.
| 학번 | 강좌 | 이름 | 학과 | 학과장 | 성적 |
|---|---|---|---|---|---|
| S1 | C1 | 하늘 | 컴공 | 김교수 | A |
| S1 | C2 | 하늘 | 컴공 | 김교수 | B |
| S2 | C1 | 바다 | 전자 | 이교수 | B |
| S3 | C2 | 구름 | 컴공 | 김교수 | A |
| 이상 | 이 표에서 생기는 일 |
|---|---|
| 삽입 이상 | 수강 전인 신입생은 강좌가 없어 넣을 수 없다 |
| 삭제 이상 | 바다의 수강을 지우면 전자과 학과장 정보도 사라진다 |
| 갱신 이상 | 컴공 학과장이 바뀌면 세 행을 다 고쳐야 한다 |
함수적 종속
함수적 종속(functional dependency)은 X 값을 알면 Y 값이 하나로 정해지는 관계(X → Y)이고, X를 결정자(determinant), Y를 종속자(dependent)라 한다.
| 종류 | 뜻 | 위 표의 예 |
|---|---|---|
| 완전(full) 함수적 종속 | 키 전체에만 종속, 키 일부로는 결정 안 됨 | (학번, 강좌) → 성적 |
| 부분(partial) 함수적 종속 | 복합키의 일부만으로 결정됨 | 학번 → 이름 |
| 이행적(transitive) 함수적 종속 | X → Y이고 Y → Z라서 X → Z | 학번 → 학과 → 학과장 |
정규화 과정
정규형은 테이블이 지켜야 할 설계 기준의 단계이고, NF는 Normal Form의 약자라 1NF·2NF처럼 숫자로 어디까지 만족하는지 나타낸다. BCNF(Boyce-Codd Normal Form, 보이스-코드 정규형)는 3NF와 4NF 사이 단계다.
| 정규형 | 조건 |
|---|---|
| 1NF | 모든 속성의 도메인(domain)이 원자값만 가진다 |
| 2NF | 1NF이고 부분 함수적 종속을 제거했다 |
| 3NF | 2NF이고 이행적 함수적 종속을 제거했다 |
| BCNF | 모든 결정자가 후보키(candidate key)다 |
| 4NF | BCNF이고 다치 종속(multivalued dependency)을 제거했다 |
| 5NF | 모든 조인 종속(join dependency)이 후보키를 통해서만 성립한다 |
위 수강 테이블은 값이 모두 원자값이라 1NF지만, 이름·학과·학과장이 키의 일부인 학번에만 종속되어 2NF가 아니다. 학생(학번, 이름, 학과, 학과장)을 떼어 내면 수강(학번, 강좌, 성적)이 남아 2NF가 된다. 학생 테이블에는 아직 학번 → 학과 → 학과장이라는 이행 종속이 남아 있다. 학과(학과, 학과장)를 다시 떼어 내면 3NF가 된다. 세 테이블을 다시 자연 조인(natural join)하면 원래 네 행이 그대로 나오므로 무손실 분해(lossless decomposition)다. 이제 컴공 학과장은 한 행만 고치면 된다.
BCNF는 3NF보다 엄격하다. 기본키가 (고객, 분야)인 상담(고객, 분야, 상담원)에서 상담원 → 분야가 성립하면, 상담원은 후보키가 아니므로 BCNF가 아니다. 상담원(상담원, 분야)을 떼어 내 해결한다.
4NF의 다치 종속은 A 값 하나에 B 값 집합이 C와 무관하게 대응하는 관계(A →→ B)이고, 5NF의 조인 종속은 여러 프로젝션으로 나눴다가 조인하면 원래대로 돌아오는 성질이다.
위 정의는 국내 시험식 표현이고, 표준 정의는 조금 더 엄밀하다.1
시험 포인트
- 이상 세 가지: 삽입·삭제·갱신 이상. "일부 행만 고쳐 불일치" → 갱신 이상.
- 단계 암기: 도메인 원자값 → 부분 함수 종속 제거 → 이행 함수 종속 제거 → 결정자이면서 후보키가 아닌 것 제거 → 다치 종속 제거 → 조인 종속 이용.
- 복합키 일부에 종속 → 부분 함수적 종속(2NF에서 제거). X → Y → Z → 이행적 함수적 종속(3NF에서 제거).
- "모든 결정자가 후보키" → BCNF.
참고
