본문 바로가기
Data Modeling

아크관계를 위해 키 조정하기

by csk 2013. 7. 11.

오늘은 통합이나, 아크(arc) 관계 설정을 위해서 키를 조정하는 상황에 대해서 살펴 보겠습니다.


예를들어 도서를 대출할 때 개인회원이나 법인 회원이 대출 가능한 경우 입니다. 


개인회원은 주민등록번호를 사용하여 식별하구요, 법인회원은 법인번호로 식별하도록 합니다. 그런데, 법인은 해마다 일정금액을 기부해야만 법인 회원 자격이 유지되도록 하고 있기 때문에, 법인번호와 회원등록년도를 조합하여 식별하도록 키를 구성하겠습니다.


<그림1. 개인회원, 법인회원>


개인회원이나 법인회원 모두가 도서 대출을 할 수 있는 경우, 도서대출 테이블에 전달할 키 (Foreign Key)가 문제가 됩니다.


만약 아무 생각없이 개인이나 법인을 모두 연결한다면 컬럼이 이렇게 구성되겠지요.



<그림2. 여러 유형의 회원에 의한 대출>



그런데, 이때에는 개인이 대출한 경우는 주민번호 컬럼만 값이 들어있고 나머지는 비어있게(null) 되구요, 법인이 대출한 경우에는 법인번호와 등록년도가 들어있고 주민번호 컬럼은 비어있게 됩니다. 


그리고, 또 한가지 단점은 각각의 컬럼이 어떤 의미를 가지는지가 컬럼명을 통해 명확하게 보이질 않습니다.


각각의 컬럼이 대출에서 가지는 의미란 무엇일까요?

주민번호나 법인법호가 대출에 전달된 이유는 누가 대출했는지 하는 대출자 정보를 관리하기 위함입니다. 그래서 이것을 누구나 알 수 있게 하기위해서 컬럼명을 대출자번호 정도로 하면 좋겠지요. 그리고 이것은 지난 글에서 말씀드렸듯이 ('선택적(optional) 관계의 모든 것' 글 참조) 관계에 역할명(role name)을 주면 가능 해 집니다. 


그런데, 아직 하나의 문제가 있네요. 개인은 식별자가 한개의 컬럼인데 반해, 법인은 식별자가 두 개의 컬럼으로 이루어 졌으니까요.


이러한 문제를 해결하는 좋은 방법은 법인 회원에 인조식별자(인조 키 artificial key)를 설계하는 것입니다. 법인회원의 숫자를 감안하여 10자리 일련번호를 부여하구요. 기존의 식별자 컬럼들은 일반 컬럼으로 남겨두겠습니다. 법인번호로 특정 법인회원의 정보를 조회하거나, 특정한 해에 기부금을 낸 법인회원의 목록을 조회하는 등 필요한 경우가 있을테니까요. 


그럼 양쪽 컬럼 모두 식별자가 하나가 되어 대출에 전달하기가 쉬워졌네요. 그럼 관계의 역할명을 대출자 번호로 해서 각 회원의 키가 전달되도록 하겠습니다. 이때 대출자 번호의 컬럼 길이는 두 테이블의 키 중에서 긴 쪽에 맞추어야 겠지요. 타입도 같게 맞추어야 할거구요.



<그림 3. 하나의 컬럼으로 통합하여 전달한 회원 정보>


이렇게 하면 보다 깔끔하게 여러 테이블에서 아크관계로 전달되는 정보를 정리할 수 있습니다.


단점이라고 하면 이런 조정작업을 통해서 법인회원 테이블은 직관적인 이해 측면에서 손해를 본다는 것을 들 수 있습니다. 최초에 법인번호에 회원등록년도가 키로 잡혀 있을때는 누구나 같은 법인이더라도 해마다 뭔가 등록 작업을 해야 회원으로 인정된다는 것을 짐작할 수 있었는데, 지금은 그걸 알기가 매우 어렵게 되었기 때문입니다.


실제로 모델을 정련하면서 이렇게 아크관계의 성격으로 연결되는 테이블을 명확하게 만들기 위해서 인조키를 설계하는 경우가 종종 있네요. 예제에서처럼 두 개 정도(개인, 법인)의 테이블이라면 그냥 두어도 무방하겠지만, 세 개 이상의 테이블에서 아크관계로 전달된다면 저는 이렇게 키를 조정해서라도 하나의 컬럼으로 처리하도록 하는것이 좋다고 생각합니다.     

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

속성 정련하기  (2) 2013.07.30
파생 속성 추가하기  (0) 2013.07.25
엔터티 분류하기 - 예제  (0) 2013.06.29
엔터티 분류하기  (0) 2013.06.26
ERD에서 올바른 관계(relationship) 맺어주기  (0) 2013.06.20