본문 바로가기

컴퓨터 지식/Database

데이터베이스 정규화이론- 제 2정규형

오늘은 데이터베이스 제 2정규형에 대해서 알아보겠습니다.

릴레이션에 제 1정규형에 속하고, 기본키가 이닌 모든 속성이 기본키에 완전 함수 종속이 되면

제 2정규형에 속한다고 볼 수 있습니다.


이게 무슨 말인지 좀 더 자세히 알아보겠습니다.


출처: 네이버 지식백과


제 1정규형을 만족하는 릴레이션입니다.

그런데 이 릴레이션에서 조금 이상한 점을 찾을 수 있을 것입니다.

Primary Key로 {고객아이디, 이벤트번호} 집합이 된다고 했었는데요.


근데 등급, 할인율 애트리뷰트는 고객아이디와, 이벤트번호랑은 관계가 없습니다.

차라리 고객아이디랑 등급, 할인율은 관계가 있다고 볼 수 있겠죠.

그런데 굳이 이벤트 번호를 끼워서 등급과 할인율을 결정지을 필요가 없다는 것이죠.


왜냐하면 Primary Key는 최소화된 Key를 원칙으로 하기 때문에 굳이 이런 중복을 가질 필요가 없는 것입니다.


그렇기 때문에 고객 릴레이션과, 이벤트 참여 릴레이션으로 위 릴레이션을 나눌 수 있습니다.


출처: 네이버 지식백과



이렇게 하게 되면 고객 아이디에 대해서 등급과 할인율에 결정이 되고,

고객아이디와 이벤트번호에 따라서 당첨여부가 결정될 수가 있습니다.

즉 각 릴레이션의 애트리뷰트들이 아무런 관계도 없이 존재하지 않는 것을 확인할 수 있습니다.

이런 것을 완전 함수 종속이라고 이야기 하고,

따라서 제 2정규형을 만족한다고 할 수 있습니다.


그렇다면 제 2정규형에는 어떤 문제가 있을까요?

1정규형과 마찬가지로 삽입 이상, 갱신 이상, 삭제 이상이 발생할 수 있습니다.


첫번재 삽입 이상에서는 새로운 등급이 생긴 경우를 생각해볼 수 있습니다.

만약 새로운 등급인 bronze 등급이 생겼다고 해봅시다. 그런데

아직 그 등급에 해당하는 고객이 없다면!?

고객 아이디가 Null이 되고 고객 릴레이션에서 고객 아이디는 Primary Key이기 때문에

Null 값이 들어갈 수 없다는 제약조건에 걸리게 됩니다.

이는 개체 무결설 제약조건을 위반하는 것으로 삽입 이상이 발생하게 되는 것입니다.



두번째 갱신 이상입니다. 

회사의 매출이 상승하여 gold 등급의 할인율을 10% -> 12%로 올릴 계획이라고 했을 때,

단순히 apple 아이디의 등급에 대한 할인율만 변경하는 것이 아닌, carrot 아이디에 대한 할인율도

변경을 해야 합니다. 즉 하나만 변경해서 다른 것들이 자동으로 변경이 되지 않는 구조인 셈이죠.


즉, 여기서 생각해볼 수 있는 문제는 사실, 할인율은 고객아이디(P.K)에 의해서 결정되는 것이 아니라는 것입니다.

물론 어떤 관점에서 생각한다면 마치 고객아이디에 따라서 할인율이 결정되는 것이 아닌가? 그렇게 생각할 수도 있습니다.

그러나 그 본질을 따져보면, 아이디에 따라서 할인율이 결정된 것이 아니라, 등급에 따라서 할인율이 결정되는 것입니다.

결국, 이 문제는 나중에 다시 한번 다뤄지겠지만,

할인율과 등급으로 된 릴레이션을 만들 필요가 생기게 됩니다.


세번째는 삭제 이상입니다.

이 역시 고객 릴레이션과 관련이 있습니다.

만약 banana라는 vip 고객이 탈퇴를 했다고 가정합시다.

그러면 이 회사의 vip 등급은 사라지게 되고, 그에 따라 vip는 20% 할인을 받을 수 있다는 

정보까지 손실이 됩니다.


이상으로 제 2정규형은 무엇인지, 그리고 제 2정규형이 가지고 있는 문제는 무엇인지 살펴보았습니다.

여기서 나타난 문제는 '이행적 함수 종속' 문제 입니다. 고객의 아이디에 따라서 등급이 결정되었고,

등급에 따라서 할인율이 결정되는 것인데, 이게 한 릴레이션에 모두 표현이 되었기 때문에 문제가 되는 것입니다.

이 문제를 해결한 것이 제 3정규형인데, 이는 다음 시간에 살펴보도록 하겠습니다.