오늘은 파생 속성 (derived attribute)에 대해서 알아보도록 하겠습니다.
파생 속성이란 기본적인 속성 정보 이외에, 이 기본 속성을 가지고 계산해서 알 수 있는 정보를, 추가 속성으로 설계한 것을 말합니다.
예제를 위해서 회원이 주문을 하는 경우에 대한 데이터 모델을 그려보겠습니다.
<그림1> 주문 데이터 모델
이것은 인터넷 쇼핑몰에서 회원이 여러 상품을 묶어서 한번에 주문하는 내용입니다. 누적 주문 금액에 따라서 회원의 등급이 결정되구요.
이때 다른 속성을 가지고 계산해서 알 수 있는, 즉 파생 속성은 어떤것이 될까요?
생각 해 보셨나요?
네, 주문 테이블의 총 금액이요? 맞습니다.
주문총금액 = 해당 주문건의 (주문상품의 상품가격 X 개수)의 총 합
이라는 식으로 구할 수 있으니까요.
이게 다 일까요? 눈을 크게 뜨고 좀 더 찾아보세요. ^^
상품 테이블의 판매가격도 구매가격에 마진율을 곱해서 계산할 수 있을 것 같구요,
회원의 등급도, 해당하는 회원의 전체 주문건의 총 금액을 더하면 결정할 수 있을테니 넓은 의미에서 파생이라고 할 수 있습니다.
네, 지금 보시는 것처럼 파생속성은 꽤 흔하게 사용되고 있습니다.
그럼, 이런 파생속성을 만들어 내는 이유는 무엇일까요?
방금 보신 사례에서 명확히 나타나듯, 자주 수행하게 되는 계산을 줄여보려는 것입니다.
이러한 계산을 수시로 하게 된다면 시간이 걸리고 부하가 발생하기 되니까요.
하지만, 세상에 공짜는 없습니다. 파생속성을 만들어두게되면 대상이 변경되거나 추가될 때 마다 파생속성도 update 해야 하는 일이 발생하니까요. 주문상품이 늘었다 줄었다 하면 그때마다 총금액도 함께 변경해주어야 한다는 말입니다.
이러한 장단점을 잘 저울질 해보고 파생속성을 둘 지를 결정해야 합니다.
최근에 모델을 검토하다보니 이러한 파생속성이 정말 많다는 것을 다시 느끼게 되네요. 그런데, 거기에서 한 발 더 나아가서, 이러한 파생 속성이 한 테이블에 여러개 생기게되니 이것을 아예 분리해서 별도 테이블로 만든 사례를 발견했습니다.
위에서 예를 든 사례에 적용해 풀어 보자면 이렇게 되는 거죠.
<그림2> 파생 속성의 별도 테이블 설계
주문에 관련된 주문상품의 상세 금액에 지속적으로 변경 된다고 할때 그것을 반영할 파생 속성들을 주문과 별도로 주문금액 이라는 테이블로 만들어 두는거죠. 물론 주문과의 관계는 1:1이 될거구요.
주문상품에 어떤 변경이 일어날 때 마다 주문 금액쪽을 수정해 주어야 하는데, 상세의 금액 및 구매개수 컬럼의 변경 시 트리거(trigger)가 수행되도록 해서 수정이 빠르고 정확하게 일어나도록 해 두었네요.
그리고 주문상품이 굉장이 자주 조회되고 수정되는 테이블인 업무이기 때문에, 이렇게 테이블을 분리하면 주문에 대한 기본정보를 조회하려고 할 때, 주문과 주문금액만 조회하면 되기 때문에 조회하는 속도도 향상 되었습니다.
지금 소개드린 경우처럼 한 테이블에 파생 속성이 여러개 출현하는 경우에는 이것을 아예 분리해서 설계하는 것도 여러가지 장점이 있으니 긍정적으로 적용 해 보시길 바랍니다.
'Data Modeling' 카테고리의 다른 글
FK가 양쪽에서 상속된다면? (0) | 2013.08.08 |
---|---|
속성 정련하기 (2) | 2013.07.30 |
아크관계를 위해 키 조정하기 (0) | 2013.07.11 |
엔터티 분류하기 - 예제 (0) | 2013.06.29 |
엔터티 분류하기 (0) | 2013.06.26 |