본문 바로가기
Data Modeling

선택적(optional) 관계의 모든것

by csk 2013. 6. 6.

답지 않게 오늘은 좀 선정적?인 제목을 달아봤습니다. 혼자서 글을 쓰고 있고, 부끄러워 주변에 알리지도 않으면서도, 방문자가 늘지않고 오히려 줄어드니 기운이 빠져서요. 제목을 이렇게 하면 방문자가 늘까요? :-)


오늘은 선택적 관계에 대해서 알아보겠습니다.

optional 은 관계위에 동그라미로 표현하고, "~ 일 수도 있다" 라고 읽지요.


예를들면 이런겁니다. 

그림1. 부서와 사원


사원은 늘 특정 부서에 속하지만, 부서중에는 사원이 하나도 없는 부서도 존재한다는 의미입니다. 


반대의 경우도 물론 가능하겠죠.

그림2. 부서와 사원


부서는 늘 사원을 가진다. 부서를 만듦과 동시에 팀원들을 발령한다는 의미죠. 하지만 사원은 부서에 속하기도 하고 속하지 않기도 한다 인데, 예를들어 신입사원이 입사했을때 한동안 팀을 지정하지 않고 둔다거나 하는 상황이 되겠네요. 


이럴때는 사원 테이블에 있는 부서코드(FK)는 null 값이 가능한 컬럼이 됩니다. 



그런데, 만약 이렇게 된다면 어떨까요?

그림3. 부서와 사원


사원이 없는 부서도 관리하고, 부서에 속하지 않은 사원도 관리하는 상황이죠. 가능은 합니다만 주의깊게 써야 한다고 한번 말씀드린 적이 있습니다. 양쪽이 모두 optional인 관계는 아무 상관없는 테이블 간에 연결해 두어도 문제가 없기 때문에, 정말로 무관한 테이블 사이에 그어진건 아닌지 확인 하셔야 하거든요.




자, 이제 optional에 대한 기본을 아셨다면, 조금 더 복잡한 사용예를 보시죠.


첫째로 아크관계 (Arc relationship)입니다.


아크 관계는 말그대로 원의 둘레 (호) 모양인데요, 그 호 안에 들어오는 관계들이 한 순간에는 한가지만 들어온다는 의미 이고, 따라서 아크관계의 상대편 엔터티들은 늘 optional 표시가 되어야 합니다. 


그림4. 회원과 비회원에 의한 주문


주문이 발생할 때 주문자는 회원과 비회원 중의 한명일때 이렇게 표현하게 됩니다. 


아 역시 DB Designer에서는 표현할 수 없어서 그림판을 이용해 눈에띄는 빨간색으로 그렸습니다. 아크관계는 ERwin에서도 표현할 수 없어서 선 그리기 기능을 이용합니다. 


이 의미를 잘 생각해 보세요. 주문입장에서는 늘 둘중 하나에서만 데이터가 흘러들어오기때문에 위 그림4에서와 같이 회원과 비회원은 모두 optional이 설정되어야 합니다. 


여기서 잠깐, 왜 관계는 두개인데, FK가 하나밖에 없지? 하는 생각이 들죠? 안들어도 할 수 없구요.. :) 이건 제가 두개의 관계를 작성할때 관계의 role name을 똑같이 주문회원으로 주었기 때문입니다. FK는 역할명을 기준으로 생성되기 때문에 역할명이 같은 관계는 하나의 컬럼으로 표시가 된답니다. 


그림5. 법인과 개인이 회원으로 가입


이번에는 일대일의 아크관계 예제입니다. 우리의 회원은 법인과 개인이 가입할 수 있습니다. 그렇다면 회원은 법인이거나 개인이죠. 한번에 둘 다 일수는 없습니다. 따라서 법인과 개인 쪽 관계에 모두 optional 이 설정되어야 합니다.


둘째로 여러 팀이 계층을 이루는 조직구조를 표현하는 상황을 생각해 보겠습니다.


회사에는 팀이 있는데, 이것이 복잡한 계층구조를 이룬다고 가정할께요. 팀위에 팀이 있고, 팀 아래 하위팀이 서너개 있고... 이렇게 자유로운 형태의 tree 구조를 가지고 있는 경우를 표현하고자 한다면 어떻게 하면 좋을까요? 흠... 자유롭다고는 하지만 한 팀의 상위 조직,팀은 하나이지, 여러개일 수는 없다는 전제를 두겠습니다. 


가장 간단하고 명확한 방법은 팀에 자기참조관계 (self relationship, recursive relationship)를 맺어주는 겁니다.


그림6. 부서의 자기참조관계


이렇게 하면 자유로운 계층구조의 조직을 한방에 표현할 수 있습니다. :)


그런대, 이때 주의하셔야 할것은 자기참조관계의 양쪽 모두! optional로 하셔야 한다는 점입니다. 

아무리 자유로운 계층구조라 하더라도 그 끝은 있게 마련입니다. tree의 시작 부서는 그 상위부서가 없을것이고, tree의 말단 부서는 그 하위부서가 없을 거란 얘기죠. 이 점을 표현하기 위해서 꼭 optional이 표현되어야 하는 것입니다.


자기참조관계가 싫다면 이렇게 상하위부서 조합의 순서쌍을 별도 테이블로 관리하는 방법도 가능합니다.


그림7. 부서의 상하위부서 조합


관계가 두개 인것은 하나는 상위부서로써, 다른 하나는 하위부서로써 기록되는 것을 표현하는 것입니다. 이걸 병렬관계(parallel relationship)이라고 부르죠. 

바로 위의 자기참조에서 말한대로, 최상위부서는 상위부서가 없고, 최하위 부서는 하위부서가 없습니다. 이때문에 이 병렬관계에서도 두개의 optional 기호가 나타나는 것이죠.


그럼 여기서 퀴즈하나. ;-)


저 두개의 병렬관계중 어느것이 상위부서를 표현하는 것이고, 어느것이 하위부서를 표현하는 것일까요? 


생각해보셨나요?


네...


임의의 부서는 다른 부서의 상위 부서로는 여러번 나타날 수 있습니다. 하위부서가 3개라면 세번 나타나겠죠. 그래서 1:M으로 표현된 위쪽 관계가 상위부서를 표현하는 관계입니다. 

같은 맥락으로, 임의의 부서는 다른 부서의 하위부서로는 한번만 나타날 수 있습니다. 여러 부서의 하위에 존재하는 경우는 없으니까요. 그래서 1:1로 표현된 아래쪽 관계가 하위 부서를 표현하는 관계입니다.


사실 이 형태는 제품 생산의 부품관리에 쓰이는 BOM (Bill of Material) 모델로 더 유명합니다. 


오늘은 optional에 대한 개념과 생각해 볼만한 관련 모델을 살펴봤네요. 다음게 뵙겠습니다. 

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

ERD에서 올바른 관계(relationship) 맺어주기  (0) 2013.06.20
엔터티 통합하기  (0) 2013.06.13
복합키 정리하기  (0) 2013.05.30
잘못된 관계를 설정 하면 발생하는 일  (2) 2013.05.23
관계 종류 결정하기  (0) 2013.05.18