본문 바로가기
Data Modeling

FK가 양쪽에서 상속된다면?

by csk 2013. 8. 8.

갑자기 이런 질문을 받았더랬습니다.  "이렇게 양쪽에서 FK를 상속 받는거 괜찮은건가요?" 라구요.


( 상속이라는 용어를 쓰려니, 불현듯, 이것이 객체지향에서 나온 용어이지 데이터 모델링에서 쓰던 용어는 아닌것 같아 맘에 걸리네요. 데이터 모델에서는 FK가 전달된다 라고 해야하나요? 하지만 어짜피 FK의 전달도 방향성이 있고, 양쪽 엔터티를 부모-자식간이라고 부르기는 하니 상속이라는 표현이 틀리진 않을것 같다는 생각을 잠시 뭉게뭉게~ 해봤습니다. ;-) )



<그림1> 양쪽에서 상속받는 FK - 프로그램사용컬럼.프로그램ID


위 모델에서 프로그램사용컬럼 테이블의 테이블ID는 프로그램사용테이블과 테이블컬럼의 양쪽에서 전달됩니다. 그런대, 동일한 속성명이기 때문에 하나의 컬럼으로 나타나 있구요. 이것이 괜찮은 것인지? 가능한 것인지? 물어온 것이었습니다.


잠시 모델을 전체적으로 살펴볼께요. 테이블이 있구요, 각 테이블에 정의된 컬럼들이 있습니다. 그리고 프로그램에서 사용하는 테이블이 관계 엔터티(associative entity)로 그 사이에 있습니다. 어느 프로그램이 어느 테이블을 사용, 즉 등록, 수정, 삭제, 조회 하는가 하는 정보를 담고 있겠죠. 그리고 각 프로그램에서 테이블을 사용할때 콕 찝어서 어느 컬럼을 사용하는지 하는 정보가 프로그램사용컬럼에 담겨져 있습니다. 


이렇게 시나리오를 보니 CRUD 매트릭스를 작성할 만한 내용이 모델링 되어 있다는 걸 알 수 있겠네요. 


이러한 시나리오를 표현한 모델로써 무리가 없어보입니다. 

그럼 다시 테이블ID 컬럼에 집중해서 살펴보겠습니다. 


이 컬럼이 물론 양쪽의 테이블에서 전달되어 왔지만 문제가 없습니다. 왜냐하면 프로그램사용컬럼의 테이블ID는 프로그램테이블에서 왔건, 테이블컬럼 테이블에서 왔건 동일한 정보이어야만! 하니까요. 동일한 정보 이어야 하기 때문에 이게 양쪽에서 왔지만 속성으로 한번만 나타나도 전혀 문제가 없는 것입니다. 


만약에 위와 같은 상황을 다음과 같이 조금 다르게 모델링 했다고 가정해 볼께요.

<그림2> 양쪽에서 상속 받는것을 피하려고 바꾸어 본 모델


이렇게 하면 위에서 고민했던 상황, 즉 양쪽에서 동일한 속성이 FK로 전달 되는 문제는 발생하지 않습니다. 하지만, 프로그램사용컬럼 테이블의 프로그램과 테이블 조합이 프로그램사용테이블에도 존재하는 조합이냐 하는 점이 보장되지 않습니다. 이 데이터 모델 상으로는 프로그램에서 사용하는 테이블이라고 지정하지 않은 테이블의 컬럼도 프로그램사용컬럼 테이블에는 버젓이 들어갈 수도 있다는 얘기 입니다. P1 프로그램이 T1 테이블을 사용하지 않는데도, (프로그램사용 테이블에 (P1,T1) 조합 정보가 없는데도) 프로그램사용컬럼 테이블에는 P1이 T1.C1 과 T1.C2 컬럼을 사용한다는 정보가 들어 갈 수도 있다는 말이죠.


반대로, <그림1>의 모델에서는 이걸 막을 수 있구요.


이점이 중요한 차이점이고, 이것을 볼 줄 하는 능력이 실제 모델링을 하면서 꽤 유용하겠구나 하는 걸 이 질문을 받으며 느꼈습니다. 


한가지 기억하실 점은, 모든 제약사항을 데이터 모델 상에서 구현해야하는건 아니고, 구현할 수 있는것도 아니라는 겁니다. 어떤 규칙들은 응용 프로그램 수준에서 구현하는 것이 더 적절 하기도 합니다. 어느쪽에서 그 규칙을 보장할 것이냐는 선택의 문제인 거죠.

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

메타 모델 이란?  (4) 2013.08.23
공통코드 테이블 (Code Table) 설계하기  (0) 2013.08.15
속성 정련하기  (2) 2013.07.30
파생 속성 추가하기  (0) 2013.07.25
아크관계를 위해 키 조정하기  (0) 2013.07.11