정규화 목적
- 중복을 배제하여 삽입, 삭제, 갱신 이상의 발생을 방지
- 각 릴레이션에 중복된 종속성을 여러개의 릴레이션에 분할
- 어떠한 릴레이션이라도 데이터베이스 내에서 표현 가능하게 함
- 데이터 삽입 시 릴레이션을 재구성할 필요성 감소
- 효과적인 검색 알고리즘을 생성 가능
이상(Anomaly) 현상
- 정규화를 거치지 않은 데이터베이스에서 발생할 수 있는 현상
- 데이터들이 불필요하게 중복되어 릴레이션 조작에 예기치 못한 문제 발생
- 애트리뷰트들의 종속관계를 하나의 릴레이션에 표현하기 때문에 발생
이상 종류
- 삽입 이상(Insertion Anomaly)
-
데이터 삽입 시 의도와 다른 값들도 삽입 됨
다음과 같은 경우 새로운 직원이 들어왔을 때, Dr. Newsome이 가르칠 수업이 아직 정해지지 않았다면 데이터를 추가하지 못한다. 수업을 NULL
값으로 지정하지 않는 이상, 담당 수업이 있어야만 테이블에 추가할 수 있는 이상 현상이 발생함
다음과 같은 경우 한 직원이 담당하는 수업을 삭제한다. 그러나 이 수업 데이터를 삭제하려면, 레코드 전체가 사라지고 결국에는 의도치 않게 직원의 다른 데이터도 함께 삭제되는 현상이 발생한다.
다음과 같은 테이블이 존재하고 두 개의 레코드가 동일한 사람일 때, 519번을 갱신하는 경우 어떤 행의 데이터를 갱신해야 하는지 알 수 없음
정규화 과정
1NF를 만족하려면 도메인이 원자값이어야한다.
<**1NF를 만족하지 않는 릴레이션>**
<**1NF를 만족시키는 릴레이션>**
- 발생할 수 있는 이상(Anomaly)의 예
- 갱신이상: 홍길동이 사회과목을 '역사'로 바꾸었다. 그럼 임꺽정이 듣고 있는 사회 과목도 바뀌어버린다.
- UPDATE 과목 SET 수강과목 = '역사' WHERE 수강과목 = '사회' AND 수강자 = '홍길동'
- 삭제 이상: 임꺽정이 '과학' 과목을 수강취소했다. 그럼 신사임당의 수강 정보도 삭제된다.
- DELETE FROM 과목 WHERE 수강과목 = '과학' AND 수강자 = '임꺽정'
- 해결책
- 컬럼 속에 값을 원자값(값이 1개)으로 변경한다.
2NF를 만족하려면 부분적 함수 종속을 제거해야한다.
<2NF를 만족하지 않는 릴레이션>
**<2NF를 만족시키는 릴레이션>**
- 발생할 수 있는 이상(Anomaly)의 예
- 삽입이상: 컴퓨터과, 전자과, 기계과 학생을 추가하고자 할 경우 더이상 불필요한 중복정보인 학과장 정보가 삽입되야 한다.
- 갱신이상: 컴퓨터과의 학과장이 변경되었다. 하나만 변경하면 모순이 발생하므로 다 찾아서 변경해야 한다.
- 삭제이상: 신사임당이 자퇴해서 삭제하고자 한다. 이 삭제로 인해 기계과 학과장의 정보가 사라져버린다.
- 해결책
- 부분적 함수 종속을 제거하고 릴레이션을 구분한다.
3NF를 만족하려면 이행적 함수 종속을 제거해야 한다.
(이행적 함수 종속: A→B이고, B→C일 때, A→C인 관계)
<3NF를 만족하지 않는 릴레이션>
<3NF를 만족시키는 릴레이션>
- 발생할 수 있는 이상(Anomaly)의 예
- 삽입이상: 컴퓨터과, 전자과 학생을 추가하고자 할 경우 더이상 불필요한 중복정보인 대학 정보가 삽입되어야 한다.
- 갱신이상: 컴퓨터과의 소속 대학이 'IT대학'으로 변경되었다. 하나만 변경하면 모순이 발생하므로 다 찾아서 변경해야 한다.
- 삭제이상: 홍길동이 자퇴해서 삭제하고자 한다. 이 삭제로 인해 컴퓨터과의 대학 정보가 사라져 버린다.
- 해결책
- 이행적 함수 종속을 제거하고 릴레이션을 구분한다.
Reference