정규화를 하는 이유?
한 릴레이션에 여러 엔티티의 애트리뷰트들을 혼합하게 되면 정보가 중복 저장되고, 이는 저장 공간을 낭비시킨다. 또한, 중복된 정보로 인해 갱신 이상이 발생되며, 동일한 정보를 한 릴레이션에는 변경하고, 나머지 릴레이션에서는 변경하지 않은 경우 어느 것이 정확한지 알 수 없다. 이 때문에 정규화 과정을 거쳐 해결한다.
갱신 이상의 종류
<회원> 테이블
학번(PK) | 이름 | 클래스 | 강사 | 과목명 |
---|---|---|---|---|
1 | 홍길동 | A | 신다람쥐 | 넥슨 취직 대비 |
2 | 신첨지 | B | 이노드 | 웹 어플리케이션 |
3 | 김아무 | B | 이노드 | 웹 어플리케이션 |
4 | 최태수 | C | 최디비 | 데이터베이스 |
5 | 이길투 | C | 최디비 | 데이터베이스 |
삽입 이상
원하지 않는 자료가 삽입되거나, 삽입하는데 자료가 부족하여 삽입이 되지 않아 발생하는 문제이다.
위 테이블에서 네트워크 과목을 신설할 때 학생이 한명도 없으므로, 이름과 학번이 null값을 갖는다. 학번은 PK이므로 null을 가질 수 없으므로 오류가 발생한다.
삭제 이상
하나의 자료만 삭제하고 싶지만, 그 자료가 포함된 튜플 전체가 삭제됨으로 원하지 않는 정보 손실이 발생하는 문제점을 말한다.
위 테이블에서는 "홍길동" 튜플을 삭제하면, (클래스 A, 신다람쥐, 넥슨 취직대비)가 삭제된다. 위에서 클래스 A 정보를 가진 튜플은 "홍길동"이 유일하므로 없어지면 안되는 A 클래스의 정보가 사라지게된다.
수정(갱신) 이상
정확하지 않거나 일부의 튜플만 갱신되어 정보가 모호해지거나 일관성이 없어져 정확한 정보 파악이 되지 않는다.
위 테이블에서 B클래스의 강사 이름을 "웹마스터"로 바꾸게 되면, 모든 튜플에서 B클래스의 강사 이름을 전부 수정해야한다.
정규화 과정
실무에서는 주로 1~3정규형만을 사용한다고 한다. 그러므로 3정규형까지만 정리해보겠다.
제 1 정규형
애트리뷰트의 도메인이 오직 원자값만을 포함하고, 튜플의 모든 애트리뷰트가 도메인에 속하는 하나의 값을 가져야 한다.
복합 애트리뷰트, 다중값 애트리뷰트, 중첩 릴레이션 등 비 원자적인 애트리뷰트들을 허용하지 않는 릴레이션 형태이다.
제 2 정규형
모든 비주요 애트리뷰트들이 주요 애트리뷰트에 대해서 완전 함수적 종속이면 제 2 정규형을 만족한다고 볼 수 있다. 완전 함수적 종속이란 X->Y 라고 가정했을 때, X의 어떠한 애트리뷰트라도 제거하면 더 이상 함수적 종속성이 성립하지 않는 경우를 말한다. 즉, 키가 아닌 열들이 각각 후보키에 대해 결정되는 릴레이션 형태를 말한다.
제 3 정규형
어떠한 비주요 애트리뷰트도 기본키에 대해서 이행적으로 종속되지 않으면 제 3 정규형을 만족한다고 볼 수 있다. 이행 함수적 종속이란 X->Y, Y->Z의 경우에 의해서 추론될 수 있는 X->Y의 종속관계를 말한다. 즉, 비주요 애트리뷰트가 비주요 애트리뷰트에 의해 종속되는 경우가 없는 릴레이션 형태를 말한다.(한 테이블에서 X->Y->Z이면, X->Y, Y->Z 두 테이블로 나눈다.)
정규화의 단점?
무작정 정규화를 하는 것은 좋지 않다. 테이블 간의 조인을 자주해야한다면 오히려 한 테이블에 있는 것이 퍼포먼스가 좋을 수도 있다는 이야기이다.
'CS기본지식 > 데이터베이스' 카테고리의 다른 글
트랜잭션 (0) | 2017.11.19 |
---|---|
조인 (0) | 2017.06.10 |
[SQL] select문 (0) | 2017.06.08 |
테이블 수정 및 삭제 (0) | 2017.06.08 |
varchar와 char의 차이 (0) | 2017.06.07 |