정규화 출발점

한 행에 세 주제가 섞이면 이상 현상이 시작된다

학생, 과목, 수강 결과를 한 행에 넣으면 조회는 쉬워 보이지만 같은 사실이 반복된다. 반복된 사실은 삽입·수정·삭제 순간에 서로 다른 문제로 드러난다.

학생 사실: 학번이 학생 정보를 결정
과목 사실: 과목코드가 과목 정보를 결정
수강 사실: 학번과 과목코드가 성적을 결정

섞인 수강 테이블

한 행이 편리한 기록처럼 보이지만 세 주제를 동시에 책임진다.

수강_통합 학생 과목 수강 관계 반복 사실 독립 사실 분리 복합키가 성적 결정
수강_통합 한 테이블에 여러 주제
학생 사실
과목 사실
수강 사실
학번S01 이름김민수
코드C10 과목데이터베이스 교수이교수 학점3
성적A
학번S01 이름김민수
코드C20 과목운영체제 교수박교수 학점3
성적B+
학번S02 이름이서연
코드C10 과목데이터베이스 교수이교수 학점3
성적A-

분해해야 할 책임 경계

한 주제의 변경이 다른 주제까지 흔들지 않게 테이블을 나눈다.

학생 변경 이름, 학과는 학번이 결정하므로 학생 테이블만 수정한다.
과목 변경 교수, 학점은 과목코드가 결정하므로 과목에 둔다.
수강 결과 성적은 학번과 과목코드 조합이 결정하므로 수강에 남긴다.
학생 주체
학번 학생명
S01 김민수
S02 이서연
과목 독립 사실
과목코드 교수 학점
C10 이교수 3
C20 박교수 3
수강 관계
학번 과목코드 성적
S01 C10 A
S01 C20 B+
삽입이 막힌다

아직 수강생이 없는 새 과목을 넣으려면 학생 정보까지 필요해진다.

수정이 새어 나간다

교수명이 바뀌면 같은 과목이 있는 모든 행을 빠짐없이 고쳐야 한다.

삭제가 과해진다

마지막 수강 행을 지우는 순간 과목 자체의 정보도 같이 사라진다.