|
데이터 모델링을 잘 하려면 국어사전을 많이 보는 것이 도움이 된다. 왜냐하면 우리가 그냥 무심코 지나쳤던 단어들에 대한 깊은 생각을 할 수 있기 때문이다. 예를 들어, 게임계에서 아주 잘 사용하는 ‘유저(user, 이용자)’라는 단어를 생각해보면 우리가 얼마나 그냥 지나쳤었는지 알 수 있다. 네이버 국어 사전에는 ‘이용자’의 뜻이 다음과 같이 나와 있다. [명사]어떤물건이나 시설, 서비스 따위를 이용하는 사람. 단어의 뜻을 잘 살펴보면 ‘이용한다’는 뜻과 ‘사람’이라는 뜻이 합쳐진 것을 볼 수 있다. ‘이용한다’는 동사이고, ‘사람’은 명사이다. 이것만 보아도 ‘이용자’는 개체집합이 아닌 관계라는 것을 알 수 있다. 만약 사람이 게임을 이용한다면 아마도 다음과 같이 ‘사람’은 ‘고객’이 될 것이고, ‘이용자’는 관계가 될 것이다. 게임 말고도 게시판 등의 제공되는 서비스를 이용하는 사람도 있다면 다음과 같은 모델이 될 것이다.
예제를 찾기 힘들기 때문에 데브피아에 올라온 질문을 토대로 설명을 해보도록 하겠다. (질문 원본) 질문의 내용은 업체별 제품별 제품규격별 가격을 변동을 관리해야하는데 어떻게 해야 좋은 모델을 만들 수 있을까이다. 질문에서 보면 핵심이 되는 엔터티 집합은 ‘업체’와 ‘제품’이다. 제품규격은 코드성 엔터티 집합으로 만약 업계표준 같은 것이 정해져 있다면 코드 엔터티 집합이라는 것은 명확해진다. 여기서 ‘업체’는 질문에서 보면 ‘제조업체’로 볼 수 있다. ‘제조업체’는 현재로써 특별히 관리해야 할 건덕지가 보이지 않으므로 이것도 코드 엔터티 집합으로 볼 수 있다. 그러므로 다음의 엔터티 집합이 본래의 모습이다.
--이벤트까지관리 시작일 종료일 -------- -------- 20010107 20010502 20010502 20010707 20010707 20011107 20011107 20011207 --이력만관리 시작일 종료일 -------- -------- 20010107 20010501 20010502 20010706 20010707 20011106 20011107 20011206 어찌되었건 최종적으로 다음과 같은 모델이 될 것이다.
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.종료일 요구사항에 따라서 제품규격을 알기 위해서는 항상 ‘가격변동이력’과 조인해야 함이 부담스럽다면 다음과 같은 비정규화도 고려해 볼 수 있다.
* 참고: 글자수 제한으로 소스1,2,3는 파일로 올린다. 요걸 구현해 보것다. 편의상 왼쪽의 편지를 보내는 사람을 ‘Sender’라고 하고, 오른쪽의 편지를 받는 사람을 ‘Receiver’라고 하것다.
무조건 아래의 코드를 입력해보자. (복사보다는 직접 타자를 쳐보는 것이 더 좋겠지?) 편지를 보내고, 받는 사람, 우체국, 우편차, 어떻게 편지를 전달하는지에 대한 것을 구현한다. 이제 메시지를 보내보자. 2~3회 실행해보자. 메시지는 Queue에 쌓이게 되고, 메시지를 받아서 Msg테이블에 잘 저장해보자. 그러면 이제 Person테이블이 없는 사람에게 메시지를 보내보자. 메시지 보내기 부분에서 다음과 같이 Receiver를 Person테이블에 ‘없는놈’에게 메시지를 보내보고(소스2 수정하여 실행), 위에서 실행했던 메시지를 받아보자.(소스3 실행)
<소스4> 이제 ‘수취인불명’ 메시지를 받아보자. 아래 소스는 <소스3>과 비스무리하다.
<소스5> 자~ 이제 또 한번 한 숨 돌리고(5초 가량 기둘린다.)메시지가 잘 도착했는데 살펴보자.
역시 잘 된다. 보낸놈과 받는놈이 바뀐 것을 볼 수 있다. 예제만 보면 ‘아~ 조낸 복잡하네~!! 무어여 이게~~ 간단한 것을 이따시로 복잡하게 해논기여~~’라고 말하는게 눈에 훤하다. 하지만 비동기 통신, 안정적인 메시지 처리, 보내진 순서대로 처리하는 등의 내부적인 것을 구현하려면 이 정도 복잡함은 진짜 새 발의 피다. 중요한 것은 Service Broker가 SOA의 구현이라는 것이다. 또한 프로시저화 한다면 이러한 복잡함은 숨겨진다. 프로시저화 한다면 인터페이스를 단순해져 불러다가 쓰는 입장에서는 복잡함을 느끼지는 못할 것이다. 다시 한번 말하지만 이것은 절대 복잡한 것이 아니다. 복잡한 것은 이미 SQL Server 2005에 구현되어 있다. 아주 무궁무진한 가능성을 지닌 기능임에는 틀림없다. 허허.. <강좌후기> 아..띠부럴.. 취침시간을 1시간 43분이나 넘겨버렸다. 내일 또 하루죙일 골골 대겠다..떱.. 허허 간만에 문서 만들었당~ 오늘 테이블정의서를 뽑는 툴을 찾다가 짜증이 나서 담배를 피고 있는데.. 리포팅 서비스를 이용해보면 어떨까 해서리.. 대충 잘 되는지 해보았다. 잘된다.. 잘 이용하면 .rdl 파일만 들고 다니면서 연결문자열 정도만 수정하면 DBA에게는 매우 좋은 툴이 되리라 생각해다. .. 안 좋나?? 허허 1. [시작]->[프로그램]->[SQL Server 2005]->[ SQL Server Business Intelligence Development Studio] 선택 2. [파일]->[새로만들기]->[프로젝트]->[보고서 서버 프로젝트 마법사]
| ||||