본문 바로가기
Data Modeling

관계 종류 결정하기

by csk 2013. 5. 18.

오늘은 관계의 종류를 결정하는 방법을 살펴보도록 할께요.

 

가장 일반적인 관계인 1:M 관계에는 식별자관계(identifying relationship)과 비식별자관계(non-identifying relationship)가 있습니다.

 

예를들어 회사의 사원들이 존재하는데, 이들은 입사할때 특정한 사번을 부여받고, 모든 사원들은 부서에 소속된다면 다음과 같이 표현합니다. 이것은 비식별자 관계라고 합니다. 각각의 식별자가 독립적으로 존재하기 때문에 붙여진 이름입니다. 

 

그림1. 부서 사원 비식별자 관계

 

이 사원의 매일의 근무 시간  정보를 기록하는데, 각자 사번별로 일자를 기록하여 관리한다면 다음과 같이 표현하죠. 이것은 식별자 관계라고 합니다. 그림에서 보듯 근태정보는 사번과 일자의 조합으로 식별할 수 있기 때문에 관계가 식별자에 영향을 미쳤다고 해서 식별자 관계라고 부릅니다.


그림2. 사원 근태 식별자 관계

 

무료 도구인 DB Designer를 사용하는데, 관계표시가 확연히 구분되지 않아서 아쉽네요. 1번그림은 관계가 회색으로 표현된 (ERwin에서는 점선으로 표현하죠) 비식별자 관계로 부서의 식별자가 사원에 일반속성으로 전이된것을 볼 수 있구요. 2번 그림은 검정식으로 표현된 식별자 관계로 사원2의 식별자가 근태에 식별자속성으로 전이된것을 확인할 수 있습니다. 


그럼 좀 실제적인 상황에서 관계를 찾고 관계의 유형을 결정 해 보도록 하겠습니다.

 

도서관의 회원이 특정 도서를 한번에 여러권 대출할 수 있는 도서관이 있는 상황입니다.

기본적으로 다음 네 개의 엔터티가 존재한다고 할 수 있죠.

 

그림 3. 회원, 대출, 대출도서, 도서 엔터티

 

1단계는 업무 처리 상 서로 관계가 있는 엔터티가 있는가? 하는 질문을 던져봅니다. 이 질문으로 관계의 존재여부를 알아낼 수 있습니다.

 

회원과 도서?        -> 관계가 없어보입니다. 도서 기증 회원등을 관리한다면 모르지만, 그런 가정을 하지 않았고, 

                              지금은 대출이라는 업무에 한정하여 고민하고 있는 중이니까요.

회원과 대출?        -> 관계가 있지요. 대출은 특정 회원이 하는 것이니까요.

대출과 대출도서?  -> 당연히 밀접한 관계가 있겠지요.

도서와 대출?        -> 얼핏 관계가 있어보이지만, 사실 여러권을 대출하는 것을 처리하기 위해 대출도서라는 

                              엔터티를 도출한 마당이니, 도서와 대출 이 둘사이에는 직접적인 관계가 없다고 봐야 겠지요.

도서와 대출도서?  -> 바로 직전에 살펴 봤듯이 관계가 있겠지요.

회원과 대출도서?  -> 확실히 관계는 있습니다. 하지만 위에서 도출한 관계들로 미루어 보면 회원은 대출과 

                              관계가 있고 대출과 대출도서가 또한 관계가 있으니 이 관계까지 추가하면 관계 정보가 

                              중복됩니다. 따라서 관계가 없는 걸로... ;-)

 


 

이렇게 해서 어느 엔터티들 간에 관계를 맺어야 할지 결정 했습니다.

이제 두번째이자 마지막 단계로 그 관계가 식별자에 영향을 미칠만큼 직접적인가? 하는 질문을 던져보겠습니다.

 

회원과 대출은 식별자에 영향을 미칠만큼 직접적인 관계가 있을까요? 

-> 회원은 회원번호로 대출을 합니다. 그러나 대출은 회원과도 도서와도 또 해당 도서관과도 관계가 있기때문에 

    식별자를 회원번호 + 일련번호로 하는것은 지나치다고 생각됩니다. 이러한 경우는  비식별자 관계로 연결하면 

    됩니다.

    만약, 회원이 없이도 대출이 일어날 수 있다면 대출 엔터티의 회원번호 FK (foreign key) 컬럼에 null 이 가능

    하다고 결정하면 됩니다. 상당히 약한 관계가 되는 것이죠.  

 

도서와 대출도서는 식별자에 영향을 미칠만큼 직접적인 관계가 있을가요?

-> 모든 도서가 대출되는 것은 아니고, 도서는 도서 자체의 관리번호가 있기때문에 직접적인 관계가 있다고 

    할수는 없습니다.

    대출도서 입장에서는 대출한 도서의 정보가 반드시 연결되어야 하겠지만, 도서 입장에서는 늘 지금까지의 

    대출 이력들을 함께보여주지는 않습니다. 따라서 이러한 경우는 비식별자 관계가 적절하구요. 관계는 항상 

    존재하기는 하므로 대출도서의 도서번호  FK를 not null로 처리하는 것이 수준이면 적절합니다.

 

대출과 대출도서는 늘 관계가 있을까요?

-> 네. 대출이 발생하면 언제나 대출도서가 함께 발생하게 되고, 대출도서란 대출에 종속된 정보입니다. 

    이렇게 직접적인 관계는 식별자 관계로 연결해 주면 됩니다. 

그림 4. 최종 관계 그림

 

 

관계를 맺는 작업을 단계적인 질문을 던짐으로써 진행할 수 있도록 정리해 보았습니다. ERD를 작성할 때 도움이 되었으면 좋겠네요.

'Data Modeling' 카테고리의 다른 글

복합키 정리하기  (0) 2013.05.30
잘못된 관계를 설정 하면 발생하는 일  (2) 2013.05.23
속성이냐 엔터티냐  (0) 2013.05.10
서브타입 해체하기  (0) 2013.05.01
이력 데이터 관리하기  (4) 2013.04.24