모델링을 하다보면 어느쪽 테이블에 FK를 둘 지 하는 것이 고민이 될 때가 있습니다. 오늘은 그런 상황에 대해서 살펴보도록 할께요.
먼저 가장 단순하게, 다음과 같은 상황이라면 어떨까요?
<그림1-1> 1:M 관계
그림과 같이 1:M 관계라면 당연히 M쪽에서 FK를 가지게 됩니다. 아니 가져야 합니다. 1 쪽에서 M 개의 데이터를 수용할 수는 없으니까요.
팀장 쪽에서 팀원 이라는 속성을 팀원1~팀원100 정도로 가지고 있지 않는 한, 팀원의 정보를 가지는 것은 불가능합니다. 한 팀장 밑에 팀원은 여러명 일 테니까요.
데이터는 이렇게 들어가게 되겠지요.
( 아래그림처럼, 테이블에 들어갈 데이터를 예를들어 써보시면 확실하게 이해가 갑니다. 저도 평소에 뭔가 헷갈린다 싶을 때는 꼭 데이터를 예를 들어 적어보는데요, 생각이 명확히 정리가 되고 실수하는 일을 막아준답니다.^^)
<그림1-2> 1:M 관계의 데이터
그럼 1:1 인 경우는 어떻게 하는게 좋을까요?
<그림 2-1> 1:1 관계
1:1의 관계에서 한쪽에 option이 존재할다면, 데이터 모델상에서 optional 부호가 존재하는 쪽 테이블에 FK 컬럼을 두는것이 좋습니다.
<그림 2-2> 1:1 관계의 데이터
윗줄과 같이 멘티 쪽에 FK 컬럼을 두면 멘티는 멘토가 늘 있기 때문에 null 데이터가 발생하지 않지만, 아랫줄과 같이 멘토쪽에 FK 컬럼을 두면 해당 컬럼이 null 인 경우가 발생하니 까요. 물론 최근 DBMS의 기능이 우수하여 큰 차이가 없지만 일단 데이터의 축적된 형태만 보아서도 전자가 더 좋다고 말할 수 있습니다.
그럼 조금만 더 진행해서 아래와 같은 관계를 생각해 볼께요.
<그림3-1> 아크 관계 형태의 1:1 관계
다양한 업무(입고, 배송...)에서 검수 작업이 일어나고 이때 검수 테이블에 데이터가 발생하는 경우 입니다. 그럼 각각의 업무 테이블에 검수번호를 FK로 둘 수도 있구요, 검수 테이블에 여러 업무 테이블의 식별자를 받아들일 수 있는 관련업무번호라는 의미상의 FK를 둘 수도 있습니다. 현재 그림은 양쪽에 모두 FK를 그려 본 상태이구요.
이렇게 아크관계로 FK를 가져오면 아까 멘토 멘티에서 처럼 검수의 검수관련번호에 null일 발생하는 경우가 드물기때문에 쉽게 어느 한쪽에 FK를 두자고 결정할 수는 없습니다.
역시 가장 중요한건 조회를 어떤식으로 많이 하느냐 인데요, 각각의 업무에서 관련 검수 정보를 함께 보여주는 경우가 많다면 각 업무 쪽에 FK를 두는것이 편리 할 테고, 검수 쪽에서 관련 업무를 보여주는 경우가 많다면 검수쪽에 FK를 두는것이 좋겠습니다.
보통의 경우에는 업무 정보에 검수를 함께 보여주지만, 검수 번호를 가지고 어느 업무에서 쓰였는지 알아야 하는 경우도 꽤 자주 있다면, 위 그림처럼 양쪽에 다 넣어주시는게 좋습니다.
만약 향후에 입고나 배송 이외에도 검수관련 업무가 추가될 확률이 높고, 그때의 변경을 가장 최소화 하고 싶다면, 여기서 검수번호를 각 업무쪽에서는 없애고, 검수 쪽에 관련 번호만 두는 방안을 권해 드립니다. 그럼 최소한 DB 모델상의 변경은 확실히 피할 수 있고, 만약 검수 테이블에 insert하는 부분을 잘 모듈화 해두었다면 그 모듈을 호출하는 한 줄을 추가하는 것만으로 수정을 마무리 할 수 있을테니까요.
'Data Modeling' 카테고리의 다른 글
메타 모델 이란? (4) | 2013.08.23 |
---|---|
공통코드 테이블 (Code Table) 설계하기 (0) | 2013.08.15 |
FK가 양쪽에서 상속된다면? (0) | 2013.08.08 |
속성 정련하기 (2) | 2013.07.30 |
파생 속성 추가하기 (0) | 2013.07.25 |