Inor

[DB] 정규화 본문

Computer Engineering/Database

[DB] 정규화

Inor 2017. 8. 14. 21:55

정규화


 정규화란 하나의 테이블이 갖고 있는 엔터티들의 중복을 줄여서 DB를 갱신할때 발생할 수 있는 갱신 이상을 예방하고 저장 공간의 낭비를 줄여주기 위해서 수행하는 작업입니다. 크고 제대로 조직되지 않은 테이블과 테이블의 관계를 작고 잘 조직된 형태로 변형 시키는 것을 정규화라고 합니다. 갱신이상에는 삽입 이상(insert), 삭제 이상(delete), 수정 이상(update)가 있습니다.


  • 삽입 이상 : 원하지 않는 자료가 삽입 되거나 삽입 작업을 수행해야 하는데 자료가 부족해서 삽입하지 못하는 문제점 입니다.
  • 삭제 이상 : 하나의 자료를 삭제하고 싶지만 해당 튜플을 삭제할 경우에 원하지 않는 자료의 삭제가 동반되는 문제점 입니다.
  • 수정 이상 : 정확하지 않게 갱신 되거나 일부 튜플들만 갱신 되어 정보의 일관성이 깨지는 문제점 입니다.



제 1 정규화


 모든 속성은 원자값을 갖고 있어야 하며 중복 기능을하는 열을 갖고 있는 경우에는 분리를 합니다. 아래는 제 1 정규형을 수행하는 과정 입니다.



 위의 테이블을 보면 Tel. No. 1, Tel. No. 2, Tel. No 3 이름을 갖고 있는 3개의 열이 중복된 기능을 하고 있는 것을 확인할 수 있습니다. 이런 경우에 제 1 정규화를 수행해서 적절하게 테이블을 작고 잘 조직된 형태로 변형을 시켜줘야 합니다.



 Customer 테이블을 Customer Name, Customer Telephone Number이라는 두개의 테이블로 나누었고 중복 기능을 하는 열을 삭제 해줬습니다.




제 2 정규화


 제 2 정규화는 제 1 정규화를 만족 시키면서 테이블에 존재하는 모든 함수 종속 관계가 완전 함수 종속이어야 합니다. 완전 함수 종속이라는 말은 테이블의 결정자가 2개가 있을 경우에 일반 속성이 2개의 결정자 전부에 종속하는 경우가 완전 함수 종속을 뜻합니다. 만약에 2개의 결정자 중에서 하나의 결정자에만 종속하는 경우에는 부분 함수 종속이라고 합니다. 그림을 보면서 설명 하도록 하겠습니다.



 위의 Employees' Skills 테이블을 보면 종업원가 기술이라는 두개의 결정자가 있고 근무지라는 일반 속성이 있습니다. 그런데 근무지는 종업원, 기술의 조합에 종속되지 않고 종업원에만 종속되는 것을 확인할 수 있습니다. 다시 말해서 종업원에 의해 근무지가 결정되는 것을 확인 할 수 있습니다. 이런 경우 부분 함수 종속이라고 하는데 제 2정규화를 통해서 부분 함수 종속을 완전 함수 종속으로 바꿔 보겠습니다.



 Employees; Skills 테이블을 종업원과 종업원의 기술 테이블로 나누었고 그 안의 속성들을 살펴보면 종업원에게만 부분 함수 종속을 하던 근무지라는 속성을 종업원 테이블로 이동 시키고 해당 테이블은 종업원, 근무지라는 두 가지 속성만 존재 합니다. 그리고 종업원에의해서 근무지가 결정되는 완전 함수 종속 이라는 특징을 만족 시키고 있습니다.




제 3 정규화


 제 3 정규화를 만족 시키려면 제 2 정규화를 만족 시키면서 테이블내의 모든 속성이 이행적 종속이 되지 않아야 됩니다. 아래의 예제를 보면서 제 3 정규화가 이루어지는 과정을 확인 해보도록 하겠습니다.



 위의 테이블은 제 2 정규화는 만족 시키고 있지만 제 3 정규화는 만족 시키지 못했습니다. 그 이유는 우승자 생년 월일이라는 속성이 우승자에 종속된 상태이기 때문입니다. 즉, 대회, 연도(기본키) -> 우승자 이고 우승자 -> 우승자 생년 월일 이기 때문입니다. 이런 경우에 테이블을 작고 조직된 형태로 변형 시켜줘야 합니다. 아래는 제 3 정규화를 수행한 테이블 입니다.



 우승자 생년 월일이라는 테이블을 새로 생성 했습니다. 테이블의 속성들은 우승자와 우승자 생년 월일인데 우승자라는 기본키를 갖고 있고 우승자 생년 월일이라는 속성은 우승자라는 기본키에 종속된 형태를 보여주고 있습니다. 즉, 제 3 정규화를 훌륭하게 수행한 것이라고 할 수 있습니다.




BCNF 정규화


 강한 제 3 정규화라고도 불리는 정규화 입니다. 제 3 정규화가 만족돼야하고 모든 결정자가 후보키여야지 BCNF 정규화 상태라고 할 수 있습니다. 즉, 후보키가 아닌 속성이 후보키를 결정하는 형태가 되면 안된다는 것을 뜻 합니다.





 위의 테이블을 보면 후보키가 아닌 교수명이 과목명을 결정하는 것을 확인할 수 있습니다. 이것은 BCNF 정규화가 되지 않은 상태 입니다. 아래와 같이 지도교수 테이블과 교수 테이블로 나눠줬고 BCNF 정규화를 만족 시킨 것을 확인할 수 있습니다.




제 4 정규화


 제 4 정규화는 두 개 이상의 다치종속이 발생 했을때 이를 제거하는 과정을 말 합니다. 다치 종속이란 테이블의 속성 A, B, C가 있을때 (A, C) 값에 종속되는 B라는 속성이 A 값에만 종속되고 C에는 독립일 경우에 다치 종속이라고 합니다.



 위의 개설 교과목 테이블에서 C는 P와 T에 다치 종속이지만 P는 T에 독립적 입니다. 새로운 교수 P4가 데이터베이스를 담당하도록 데이터베이스를 변경할때 교재 T3, T4, T5에대한 3개의 튜플을 삽입해야 합니다. 교수와 교재 속성이 서로 무관한 것이지만 하나의 테이블에 포함 시켰기 때문에 위와 같은 문제가 발생 합니다. 그래서 교수와 교재를 서로 다른 테이블에 저장하도록 두개의 테이블을 새로 생성 했습니다.

'Computer Engineering > Database' 카테고리의 다른 글

[DB] 트랜잭션 : Recovery(회복)  (0) 2017.08.14
[DB] 트랜잭션 : Log  (0) 2017.08.14
[DB] 트랜잭션 : undo, redo  (0) 2017.08.13
[DB] 트랜잭션(Transaction)  (0) 2017.08.11
Comments