정규화란?
관계형 데이터베이스의 설계에서 중복을 최소화하게 데이터를 구조화하는 프로세스를 정규화라고 한다. 즉, 테이블 간의 중복된 데이터를 허용하지 않음으로써 무결성(Integrity)를 유지할 수 있으며, 저장 용량 역시 줄일 수 있어 스토리지를 절약 할 수 있다.
데이터베이스 정규화의 목표는 이상이 있는 관계를 재구성하여 작고 잘 조작된 관계를 생성하는 것에 있다. 일반적으로 정규화란 크고, 제대로 조직되지 않은 테이블들과 관계들을 작고 잘 조직된 테이블과 관계들로 나누는 것을 포함한다. 정규화의 목적은 하나의 테이블에서의 데이터의 삽입, 삭제, 변경이 정의된 관계들로 인하여 데이터베이스의 나머지 부분들로 전파되게 하는 것이다. ( 위키백과 )
[ 제 1정규화 (1NF) ]
제 1정규화란 테이블의 컬럼이 원자값(Atomic Value, 하나의 값)을 갖도록 테이블을 분해하는 것이다. 예를 들어 아래와 같은 수강테이블이 존재한다고 하자.
수강과목 | 수강자 |
수학 | 홍길동 |
과학 | 임꺽정, 신사임당 |
사회 | 홍길동, 임꺽정 |
발생할 수 있는 이상(Anomaly)의 예
- 갱신이상: 홍길동이 사회과목을 '역사'로 바꾸었다. 그럼 임꺽정이 듣고 있는 사회 과목도 바뀌어버린다.
- UPDATE 과목 SET 수강과목 = '역사' WHERE 수강과목 = '사회' AND 수강자 = '홍길동'
- 삭제 이상: 임꺽정이 '과학' 과목을 수강취소했다. 그럼 신사임당의 수강 정보도 삭제된다.
- DELETE FROM 과목 WHERE 수강과목 = '과학' AND 수강자 = '임꺽정'
위의 테이블에서 수강자 컬럼이 여러개의 수강자(속성)를 가지고 있기 때문에 (원자값이 아니기 때문에) 제1 정규형을 만족하지 못하고 있다. 그렇기 때문에 이를 제 1정규화하여 분해할 수 있다. 제 1정규화를 진행한 테이블은 아래와 같다.
수강과목 | 수강자 | 일련번호 |
수학 | 홍길동 | 1 |
과학 | 임꺽정 | 2 |
과학 | 신사임당 | 3 |
사회 | 홍길동 | 4 |
사회 | 임꺽정 | 5 |
제 1정규화를 할때 가장 간단한 방법은 원자값으로 분해해 튜플로 구분하고 다른 키를 추가 하는 것이다.
실제로 복잡한 테이블은 이렇게 단순하게 분해해 버리면 다른 중복 문제들이 많이 생겨 테이블 구조를 따져봐야 한다.
[ 제 2정규화 (2NF) ]
제 2정규화란 제1 정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해하는 것이다. 즉 부분적 함수 종속을 제거해야 한다. 전 함수 종속이라는 것은 기본키의 부분 집합이 다른 속성에 대한 결정자가 되어선 안된다는 것을 의미한다.
다음은 2정규화를 만족하지 않는 테이블이다.
발생할 수 있는 이상(Anomaly)의 예
- 삽입이상: 데이터베이스, 자료구조 수업을 듣는 학생을 추가하고자 할 경우 더이상 불필요한 중복정보인 강의실 정보또한 삽입되야 한다.
- 갱신이상: 데이터베이스 수업의 강의실이 변경되었다. 하나만 변경하면 모순이 발생하므로 다 찾아서 변경해야 한다.
- 삭제이상: 401번 학생번호를 가진 학생이 스포츠경영학 수업을 취소하였다. 이 삭제로 인해 스포츠경영학의 강의실 정보는 아예 사라져 버린다.
이 테이블에서 기본키는 ( 학생번호, 강좌이름)으로 복합키이다. 그리고 ( 학생 번호, 강좌이름)인 기본키는 성적을 결정하고있다. (학생번호, 강좌이름) --> 성적
그런데 여기서 강의실이라는 컬럼은 기본키의 부분 집합인 강좌이름만으로 결정될 수 있다. (강좌이름) --> (강의실)
즉, 기본키(학생번호, 강좌이름)의 부분키인 강좌이름이 결정자이기 때문에 위의 테이블의 경우 다음과 같이 기존의 테이블에서 강의실을 분해하여, 별도의 테이블로 만들어 제2 정규형을 만족시킬 수 있다.
[ 제 3정규화 (3NF) ]
제3 정규화란 제2 정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 테이블을 분해하는 것이다.
- 이행적 함수 종속의 예 : A --> B 이고 B --> C 일 때 A --> C 인 관계
발생할 수 있는 이상(Anomaly)의 예
- 삽입이상: 데이터베이스, 자료구조 수업을 듣는 학생을 추가하고자 할 경우 더이상 불필요한 중복정보인 수강료 정보또한 삽입되야 한다.
- 갱신이상: 데이터베이스 강좌 수강료가 25000으로 변경되었다. 하나만 변경하면 모순이 발생하므로 다 찾아서 변경해야 한다.
- 삭제이상: 스포츠경영학을 듣는 401 학생이 수업을 취소하였다. 스포츠 경영학의 수강료는 정보는 사라진다.
기존의 테이블에서 학생번호는 강좌 이름을 결정하고 있고, 강좌 이름은 수강료를 결정하고 있다. 그렇기 때문에 이를 (학생 번호, 강좌 이름) 테이블과 (강좌 이름, 수강료) 테이블로 분해해야 한다.
[ BCNF 정규화 ]
BCNF 정규화란 제3 정규화를 진행한 테이블에 대해 모든 결정자가 후보키가 되도록 테이블을 분해하는 것이다. 즉 결정자이면서 후보키가 아닌 것을 제거해야 한다. 예를 들어 다음과 같은 특강 수강 테이블이 존재한다고 하자.
발생할 수 있는 이상(Anomaly)의 예
- 삽입이상: 200학생이 데이터베이스를 수강하고자 할 경우, 현재 불필요한 홍길동 교수 정보가 한번 더 삽입된다.
- 갱신이상: 홍길동의 담당 과목이 알고리즘으로 바뀌었다. 담당 과목을 변경할 경우, 학생의 수강 과목이 변경되어 버린다.
- 삭제이상: 300학생이 자퇴해서 삭제하고자 한다. 이 삭제로 인해 인공지능 과목을 유관순 교수가 담당하고 있다는 정보가 사라진다.
특강수강 테이블에서 기본키는 (학생번호, 특강이름)이다. 그리고 기본키 (학생번호, 특강이름)는 교수를 결정하고 있다. 또한 여기서 교수는 특강 이름을 결정하고 있다.
그런데 문제는 교수가 특강 이름을 결정하는 결정자이지만, 교수는 학생번호를 결정 지을 수 없으므로 후보키가 아니라는 점이다. 그렇게 때문에 BCNF 정규화를 만족시키기 위해서 위의 테이블을 분해해야 하는데, 다음과 같이 특강 신청 테이블과 특강 교수 테이블로 분해할 수 있다.
보통 정규화는 BCNF 까지만 하는 경우가 많다. 그 이상 정규화를 하면 정규화의 단점이 나타날 수도 있다.
4정규형 이상은 다음 게시물을 참고하자.
참고
'모델링' 카테고리의 다른 글
[DB모델링] 키(key) (0) | 2024.08.20 |
---|---|
[DB모델링]ERD 화살표 표기법 (0) | 2024.08.16 |
[DB모델링] 엔터티(Entity) 와 속성 (Attribute) (0) | 2023.03.21 |