이상 현상

한 테이블에 세 가지 사실을 섞으면 행 작업이 데이터 손상으로 번진다

학생, 과목, 수강 관계를 한 행에 묶으면 단순한 삽입, 삭제, 갱신도 원래 의도하지 않은 정보까지 함께 건드린다.

학생 + 과목 + 수강 한 행이 서로 다른 세 사실을 동시에 책임진다.
기준 키가 다름 학번, 과목코드, 복합 키가 각자 다른 사실을 결정한다.
학생 학번 -> 이름
과목 코드 -> 교수
수강 학번+코드 -> 성적
학생학번이 학생명을 결정한다
과목과목코드가 과목명, 교수, 학점을 결정한다
수강학번과 과목코드가 성적을 결정한다
학번 -> 학생명 학생 사실
수강 행 학생 사실 + 과목 사실 + 수강 사실
과목코드 -> 과목명, 교수, 학점 반복되는 과목 사실
이상 현상 삽입·삭제·갱신이 다른 사실까지 건드림
{학번, 과목코드} -> 성적 수강 관계 사실
정규화 기준 결정자가 다른 사실은 테이블을 나눔

혼합 수강 테이블

중복 사실
학번 학생명 과목코드 과목명 교수 학점 성적
S01 김민수 C10 DB 이교수 3 A
S02 이서연 C10 DB 이교수 3 A-
S03 최지훈 C10 DB 김교수? 3 B
S04 박하준 C20 자료구조 박교수 3 B+

C10의 과목명, 교수, 학점은 과목 사실인데 수강 행마다 반복된다. 반복된 사실 하나가 어긋나면 테이블은 곧바로 모순을 품는다.

행 작업이 깨지는 세 지점

무결성 위험
삽입
새 과목 C30은 학생 없이 넣을 자리가 없다

키가 학번과 과목코드라면 수강생이 생기기 전 과목만 등록하기 어렵다.

삭제
S04 수강 행을 지우면 C20 과목 정보도 함께 사라진다

삭제 의도는 수강 취소인데, 마지막 행이면 과목 사실까지 잃는다.

갱신
C10 담당 교수를 바꿀 때 모든 반복 행을 맞춰야 한다

한 행만 놓치면 같은 과목이 두 명의 교수를 가진 것처럼 보인다.

학번 -> 학생명 학생 사실은 학생 테이블의 책임이다.
과목코드 -> 과목명, 교수, 학점 과목 사실이 수강 행에 반복되어 세 이상 현상의 출발점이 된다.
{학번, 과목코드} -> 성적 수강 관계에 남아야 할 사실은 학생이 어떤 과목을 들었는가다.
작업 원래 의도 혼합 테이블 결과 정규화 관점
삽입 과목 개설 학생 행 없이는 과목을 표현하기 어렵다 과목 테이블을 따로 둔다
삭제 수강 취소 마지막 행이면 과목 정보까지 삭제된다 수강 관계만 삭제한다
갱신 교수 변경 반복 행 일부만 바뀌면 불일치가 생긴다 과목 사실을 한 곳에서 갱신한다