데이터 정규화

August 15, 2020

정규화란?

정규화는 관계형 데이터베이스에서 데이터의 중복을 최소화하고 이상현상을 제거하기 위한 목적이 있다.

이상 현상(Anomaly)

  • 삽입 이상 : 불필요한 정보를 포함하지 않으면 데이터를 삽입하는 것이 불가능하다.
  • 삭제 이상 : 삭제하고자 하는 데이터 외에 필요한 데이터가 함께 삭제된다.
  • 갱신 이상 : 데이터 일부를 갱신하면 데이터 불일치가 발생한다.

1NF

제 1정규화는 모든 도메인 값이 원자 값(Atomic value)를 가져야함을 의미한다.

학생 테이블

학번 * 이름 학과 전화번호
2020105055 SONG 컴퓨터공학과 01012345678
2020037001 PARK 물리학과 01022223333, 023005123

하나의 전화번호 컬럼에 복수개의 데이터가 들어가 있다. 이러한 형태는 1정규형을 위반한 것이므로 나눠줘야 한다.

학생 테이블

학번 * 이름 학과 전화번호
2020105055 SONG 컴퓨터공학과 01012345678
2020037001 PARK 물리학과 01022223333
2020037001 PARK 물리학과 023005123

2NF

제 2정규화는 모든 속성이 PK에 완전 함수 종속(fully functional dependent)한 상태, 즉 모든 부분 함수 종속(partial functional dependent)를 제거한 상태를 의미한다.

수강 테이블

학번 * 수강과목 * 이름 성적
2020105055 COMP321 SONG D+
2020037001 COMP321 PARK A+
2020037001 STAT452 PARK A0

여기서 주식별자는 {학번, 수강과목}인데 학생의 이름 같은 경우는 주식별자의 부분인 학번만으로도 결정할 수 있다. 이러한 것을 부분 함수 종속이라고 하며, 테이블 분리를 하여 해결한다.

부분 함수 종속은 데이터에 여러 Anomaly 현상을 일으킬 수 있다. 예를 들어, ‘2020037001’의 이름을 바꾸고자 할 때, 하나의 튜플이라도 누락이 발생하게 된다면 해당 학번에는 이름이 여러 개가 되어버리는 갱신 이상이 발생할 수 있다.

학생 테이블

학번 * 이름
2020105055 SONG
2020037001 PARK

수강 테이블

학번 * 수강과목 * 성적
2020105055 COMP321 D+
2020037001 COMP321 A+
2020037001 STAT452 A0

다음과 같이 수정하면 주 식별자 전체로만 다른 내용이 결정되는, 완전 함수 종속 상태를 만족시키는 2정규화 형태이다.

3NF

제 3정규화는 제 2정규형을 만족하면서 이행적 함수 종속을 제거한 상태를 의미한다.

학생 테이블

학번 * 이름 학과 학과건물 전화번호
2020105055 SONG 컴퓨터공학과 공대9호관 01012345678
2020037001 PARK 물리학과 제1과학관 01022223333
2020037001 PARK 물리학과 제1과학관 023005123

주식별자인 {학번}으로 모든 속성들을 결정할 수 있다.

하지만 학과건물 같은 경우는 학과에서 파생된 내용으로 ‘학번 -> 학과 -> 학과건물’의 형태로 식별되며, 이 때 학과건물은 학번에 이행적 함수 종속된 상태라고 한다.

학생 테이블

학번 * 이름 학과 학과건물 전화번호
2020105055 SONG 컴퓨터공학과 공대9호관 01012345678
2020037001 PARK 물리학과 제1과학관 01022223333
2020037001 PARK 물리학과 제1과학관 023005123
학과 * 학과 건물
컴퓨터공학과 공대9호관
물리학과 제1과학관

BCNF(Boyce-Codd Normal Form)

보이스-코드 정규형은 제 3정규형의 종류이다. 제 3규형을 만족하면서 추가적인 조건을 만족하는데 함수 종속성 X->Y에서 후보키가 아닌 X가 존재해서는 안된다는 조건이다.

수강 테이블

학번 * 수강과목 * 교수
2020105055 COMP321 최형배
2020037001 COMP321 최형배
2020037001 STAT452 김판호

여기서 ‘{학번, 수강과목} -> 교수’로 기본적으로 제 3정규형을 만족한다.

하지만 만약 교수 한 명이 하나의 과목만을 강의한다고 가정하면, ‘교수 -> 수강과목’이라는 종속성이 발생한다. 여기서 교수는 후보키가 아니므로, 이는 Boyce-Codd 정규형을 위반한다.

수강 테이블

학번 * 교수
2020105055 최형배
2020037001 최형배
2020037001 김판호

교수 테이블

교수 * 수강과목
최형배 COMP321
김판호 STAT452

songmk 🙁