#title Bottom-Up 방식으로 모델링해보기 [[TableOfContents]] ==== 문제 ==== 예제를 찾기 힘들기 때문에 데브피아에 올라온 질문을 토대로 설명을 해보도록 하겠다. 질문은 다음과 같다. {{{ 업체에 따른 품목에 따른 제품규격에 따른 가격의 변동을 관리해야 합니다. {등록일, 업체명, 제품명, 규격(다양), 가격} 이렇게 데이터가 쌓여야 하는데 문제는 규격이 유동적이라는 점입니다. 이 데이터를 가지고 현황을 뽑을 때 규격별로 뽑아야 하거든요. 2007-06-03, 삼성전자, 세탁기0001, 드럼02, 다리01, 호스02, ...., 500,000원 2007-07-21, 삼성전자, 세탁기0001, 드럼02, 다리01, 호스02, ...., 510,000원 2007-08-09, 삼성전자, 세탁기0001, 드럼02, 다리01, 호스02, ...., 520,000원 2007-06-03, 삼성전자, 세탁기0002, 드럼04, 호스01, ...., 400,000원 2007-07-22, 삼성전자, 세탁기0002, 드럼04, 호스01, ...., 490,000원 2007-05-03, 삼성전자, 세탁기0003, 다리21, 호스06, ...., 800,000원 2007-06-25, 삼성전자, 세탁기0003, 다리21, 호스06, ...., 750,000원 2007-07-12, 삼성전자, 세탁기0003, 다리21, 호스06, ...., 880,000원 규격이 유동적으로 들어가고 정해진 규격의 가격의 이력이 관리되어야 하는데 테이블을 어떻게 만들어야 할지 모르겠어요. 간단한 방법이 없나요? 카테고리를 써야 하나요?? 이건자신이 없는데... ㅜㅜ 규격을 "드럼02/다리01/호스02/.../.../" 이렇게 묶어서 컬럼에 넣을 생각도 하고 있습니다. 그럼 현황 뽑을 때 죽어나요...TT; 도와주세요. }}} 질문 원본: http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=41&MAEULNo=17&no=1841&ref=1841 질문 원본을 보고 어떻게 모델링해야 할지 생각해 보자. 그래야 필자가 제시하는 방법과 비교를 해 볼 수 있다. (물론 필자가 제시하는 것은 정답이 아니라 그냥 필자 같으면 이렇게 하겠다는 것이다.) ==== 해결 과정 보기 ==== 질문의 내용은 ‘업체별 제품별 제품 규격 별 가격을 변동을 관리해야 하는데 어떻게 해야 좋은 모델을 만들 수 있을까’이다. 질문에서 보면 핵심이 되는 엔터티 집합은 ‘업체’와 ‘제품’이다. 제품규격은 코드성 엔터티 집합으로 만약 업계표준 같은 것이 정해져 있다면 코드 엔터티 집합이라는 것은 명확해진다. 여기서 ‘업체’는 질문에서 보면 ‘제조업체’로 볼 수 있다. ‘제조업체’는 현재로써 특별히 관리해야 할 건덕지가 보이지 않으므로 이것도 코드 엔터티 집합으로 볼 수 있다. 그러므로 다음의 엔터티 집합이 본래의 모습이다. attachment:model01.jpg ‘제조업체’, ‘제품규격’을 코드화 해서 대충 다음과 같은 모델이 만들어 질 것이다. attachment:model02.jpg 문제는 제품규격에 대한 가격변동에 따른 이력을 관리해야 하는 것에 있다. 즉, ‘제품’과 ‘제품규격’ 사이의 관계가 ‘제품가격변동이력’으로 변경되며, 1:다의 관계에서 다:다의 관계가 된다. attachment:model03.jpg 이제 다:다 관계를 풀어 이력 엔터티 집합으로 만들면 된다. 여기서 한 가지 결정을 해야 하는 것은 이력 관리시 가격이 변동되었다는 이벤트까지 관리를 할 것인지를 결정해야 한다. 실제 데이터는 다음과 같이 들어갈 것이다. {{{ --이벤트까지관리 시작일 종료일 -------- -------- 20010107 20010502 20010502 20010707 20010707 20011107 20011107 20011207 --이력만관리 시작일 종료일 -------- -------- 20010107 20010501 20010502 20010706 20010707 20011106 20011107 20011206 }}} 어찌되었건 최종적으로 다음과 같은 모델이 될 것이다. attachment:model04.jpg 그렇다면 해당 제품의 현재 가격을 어떻게 쿼리해서 가져올까? 아마도 다음과 같이 될 것이다. {{{#!geshi sql Select a.제조업체명 , b.제품명 , d.제품규격 , c.가격 from 제조업체 a inner join 제품 b on a.제조업체번호 = b.제조업체번호 inner join 가격변동이력 c on a.제품번호 = c.제품번호 inner join 제품규격 d on c.제품규격번호 = d.제품규격번호 where '20071026' between c.시작일 and c.종료일 }}} 요구사항에 따라서 제품규격을 알기 위해서는 항상 ‘가격변동이력’과 조인해야 함이 부담스럽다면 다음과 같은 관계의 비정규화도 고려해 볼 수 있다. attachment:model05.jpg