PROGRAMMING WORKSHOP

VB.Net |
System.Data.DataSet...관계형데이타베이스에 관하여

2012년 구정명절 하여야 할 것 다 한 후 연휴의 여백에 컴을 여니..

이런 질문이 있다
엑세스2007을 배우고 있는데...
테이블간 관계설정에서 조인유형을 모르겠어요.
아무리 책과 인터넷을 찾아봐도 자세히 설명되어있는 것이 없네요...
예를 들어 고객정보와 주문정보 테이블에서 고객ID를 기본키로 설정한다고 하면...
조인유형을 어떻게 해야하는지, 왜그렇게 하는 지 ...

아주 중요한 질문인데.. 이것을 어디에서 처리할까??
이전에 이코너, 저코너에서 설명을 하지만..별로 중요성을 설득시키지 못한
주제중의 하나다
왜냐면 엑셀에서는 외부의 내용을 하나의 단일테이블로 불러서(SQL을 통하여)
사용하면 되니.. 열변을 토해보았자..입만 아픈 일이다
그러나 마침 알고자 하는 질문이 있으니 다시 설명을 하는데
VB.Net코너에서 간단하게 질문에 대한 답을 하고 하던 이야기 진행하자

왜냐면 마침 DataSet을 진행중인 이곳이고
또한 지금까지, 간단한 하나의 테이블에 대한 이야기를 했었고
관계테이블의 이야기를 마악 꺼내려던 참이니.. 잘된 것이다
또한
데이타베이스는 VBA로 처리하던, VB.Net으로 처리하던
공통의 주제인 중요한 것이니..이 곳에서 설명을 하는 것이 좋을 것 같다
왜 관계형이어야 하는지
앞페이지에서 활용한 XML화일 같은 것도 관계형 DB에서
만들어낸 하나의 테이블인 셈이다
DB는 관계형 테이블로 구성되지만..결과물은 하나의 테이블로..

실은 관계형테이블..즉 테이블의 구조설계는
VBA나 VB.Net에서는 DB의 소비자적인 입장이 되다 보니까..
그냥 이미 데이타베이스설계된 내용을 갖여오면 되니, 별로 관심이
없거나 관심을 갖을 필요도 없을 것이다!!라는 생각은 소극적 생각이고..
만약 억세스로 회사나 조직의 데이타베이스를 구축하여야겠다!!
라는 생각이 들거나 그런 위치에 있다면 관계형데이타베이스라는
개념을 알아야 좋은 데이타베이스를 구축할수 있는 것이다
그냥 하나의 테이블로 처리해도 된다..

또한 테이블을 구성한다고 하는 것은
어떤 회사나 조직의 모든 정보의 흐름을 이해하여야 할 수 있는
작업이 된다
그러니 데이타베이스를 설계한다고 하는 것은
회사의 모든 흐름의 재평가를 하는 입장이 되는것이다
데이타베이스가 없던 조직의 데이타베이스를 구축하면
그동안에 업무의 흐름의 비효율을 한눈에 잡아내는 도구가
되기도 하는 것이다
그러니 기존의 조직의 구성요원들은 데이타베이스 구축을
당연히 싫어 한다
왜냐면..자신의 업무의 내용을 투명하게 설명해주어야 하는
입장이 되니..
어휴..거..뭐 그런걸 만든다고..없어도 잘 된다니까..
라는 불평불만을 받아야 하는 입장이 되기도 한다
아주 적대적 관계가 되기 딱 좋은 입장이 되는 것이다

입장을 바꾸어서
여러분이 하는 일을 쨔식들이 나타나서
정보의 효율화니, 자동화니, 하면서
업무내용을 설명해 달라고 한다면...당연 밥맛일 것이다!!
그런 입장이 바로 데이타베이스설계라고 할 수 있다
공연히 재수없으면 이런 적군들이 아우성을 쳐서..윗선에
씹어대어..본래 씹는 사람들은 머리도 좋고..선동성도 강하고, 아주 그럴듯하게
편을 먹구..진행을 방행하게 된다
그 친구 좀 이상하더라구요..
그렇게 안해도 잘 되거등요.. 별로 실력도 없어 뵈구..#@
줏대없고, 쥐뿔도 뭐 잘 아는 것이 없는 윗선은..
...
그냥 한방에 짤리는 수도 있는 입장이다..하하..

VB.Net에서 DataSet은 DataTable이 여러개 구성된다고 했었다
DataSet은 억세스의 아래와 같은 관계형테이블을 그대로
메모리속에 옮겨놓은 것이라고 생각하면 된다



매번 이야기하지만 테이블의 구조설계는 억세스의
Northwind.mdb화일의 테이블만 이해하면 된다고 이야기 하지만..
모두가 뭔가 빨리 이해하고 가는 방법이 없을까..!!
만 생각하니..항상 뭐가 뭔지..그냥 남이 주는 테이블이나
받아서 분석하게 된다
최소한 VBA를 하더라도 자기 회사의 테이블 구조를 알게 되면
어떠,어떠한 정보를 어떻게 뽑아서 달라고 메인DB관리자에게
요청을 할 수 있는 입장이 된다

Northwind.mdb화일의 데이타구조를 살펴보면서 이야기하면 이해가 모두 된다
데이타베이스는 어떤 일의 프로세스상에서 발생하는 정보를
체계적으로 분리하여 관리하는 것..
NorthWind.mdb라는 가상의 유통회사의 하나의 일의 프로세스는
언제,
어떤 고객회사에게,
어떤직원을 통하여,
어느회사에서 납품받은,
어떤 류형의,
어떤 상품을,
단가얼마에,
몇개를,
어떤 운송회사를 통하여,
언제까지 납품해달라는
주문을 언제 받았다
라는 하나의 프로세르가 반복하여 발생하는 내용이다

어느 데이타베이스나 Northwind사의 경우와 같이 반복되는 프로세스와 관련된
정보를 하나의 문장으로 작성해 보고나 그림을 그려 보거나
하면서 대강의 윤곽을 잡아 가는 것이다
이렇게 시나리오를 잡으면..
기본테이블이라는 것이 발생하는 것을 알수 있다
아하..고객회사테이블이 하나 있어야 겠구나
상품분류를 관리하는 테이블이 하나 있어야겠구나
상품명을 관리하는 테이블이 하나 있어야 겠구나
직원을 관리하는 테이블이 하나 있어야 겠구나
운송회사를 관리하는 테이블이 하나 있어야 겠구나
라는 것이 자연스럽게 발생하게 되고
이런 기본테이블을 참조하여
주문발생테이블을 하나 만들게 되는 것이다
모든 주문..발생..세무서에서 째려보는 주문테이블이
만들어 지게 되는 것이다
주문테이블이 업무의 핵심테이블이 되는 셈이다
이 주문테이블에서 각각의 기본테이블의 정보를 끌어다가 사용하는 셈이다
세금적게 내려고 이 주문테이블을 조작을 하기도 하겠지..
소위 말하는 매출누락..
아무튼..데이타베이스는 일의 블랙박스다
그러니 만들자니 그렇고, 안만들자니 그렇고..그런 것이
데이타베이스인 셈이다..
이런 일이야 없겠지만..그렇게 민감한 업무라고 볼수 있는 것이다
나쁜마음 먹고..매출누락을 시켜도 세무서에서는 고객회사쪽의 데이타베이스를
관찰하면 또 매출누락을 잡아 내게도 되는 셈이니..
거짓말 하지 말고 잘 만들어서 투명한 사회가 되게하라고
하는 셈이다

위의 정도의 썰에 아직 감이 안오시면..
엑셀시트에 한번 작성을 해보시면 안다
아래와 같이 NorthWind.mdb에서 관계되는 테이블을 연결하여
쿼리로 뽑아서 엑셀에 옮긴 내용이다



만약에 관계형으로 만들지 않았다면
위의 엑셀테이블과 같이 같은 이름을 반복하여 나열하여야
하는 비효율이 발생한다

아래와 같이 각각의 분리된 테이블에서 분리된 테이블의
키값을 주문테이블에 엮어 놓으면



데이타베이스과 아주 간편해지게 되는 셈이다
아휴..보기가 복잡한데요..그냥 반복되어도 이름이 있으면 좋겠는데
그렇다면 만약에 어떤 고객사의 회사주소나 회사명이 바뀌었다고치자
그럼..일일이 하나하나 죄다 고쳐야 된다
아하!!!!..그럼 문제군..
그렇지..고객회사를 관리하는 기본테이블상에서 AAA라는 회사의
주소를 한번만 바꾸면 주문테이블상의 수백번 거래를 한 AAA사의
내용이 한꺼번에 정리가 되는 셈이구나...!!!아하!!
그냥 고객회사의 ID만 연결되어 있으니..
고객회사에서 굿을 하던 무엇을 하던 실시간으로 관계가
구성되니..문제가 하나도 없게 되는 셈이다

분석에 들어가서도 어떤 고객회사의 거래실적이 얼마나
되는지 알아 보는 것도 거래테이블상의 해당 고객회사의 ID가
들어 있는 것만 찾아내면 되는 것이다

엑셀에서 4월달의 거래내용을 보고 싶다면..
각각의 관련된 테이블의 관계를 찾아서 거래테이블을 중심으로
각각의 ID와 연결된 참조정보를 엮어서 만드는 작업이'
바로 쿼리라고 하고 이때 발생하는 이런 테이블이 쿼리테이블인 셈이다
쿼리테이블은 물리적인 테이블이 아니고 가상의 테이블인 셈이다
VB.Net에서
앞페이지에서 이야기했던 DataView개체가 이런 쿼리테이블인 셈이다
메모리상의 가상의 테이블에서 또 일부정보만 뽑아내는 DataView
약간의 성격이 다르지만 개념은 그런 개념인 것이다

아무튼 일에 대한 프로세스를 분석하여 구조적으로
체계적으로 발생하는 정보를 정리정돈하는 작업이 데이타베이스의
설계인 셈이니..
업무의 표준화, 작업의 표준화, 그리고 사루자동화의 기본핵심이
되는 셈이다

외국에서는 그런 표준화가 그래도 개념이 우리와는 좀 달라서
억세스를 참으로 많이 활용하는데
우리는 그렇지 못한 것이 좀 안타까운 일이다
우리는 오피스에 포함된 억세스를 한번도 열어본 적이 없는 것이
대부분이다..참으로 이상한 일이고, 안타까운 일이다
데이타베이스라는 개념자체가 별 특별한 것인줄 알고 접근하지 않으려
하고 , 껄끄러워 하고, 자신의 업무비밀을 뺏어간다고 생각하고
모두 각자의 수첩에 적어 놓기를 좋아하는 것 같다
공유..공유..하면서 뭘 공유하겠다는 것인지 참으로 아리송한
환경이기도 한 셈이다

아..그것참..질문에 대한 답이나 해주지..원 장황하게..서술이 길다
헷소리 그만하고..
질문하신분이 조인의 유형이 어떤 것이 있고, 왜필요한지가 궁금하시다고
했다..
Join의 유형..
두개의 테이블에서 조인의 유형이 있는 셈이다
세가지가 있다
Left Join
Right Join
Inner Join
두개의 테이블이 하나는 왼쪽, 하나은 오른쪽에 있다
예를 들어서 왼쪽에 고객테이블이 있고
오른쪽에 주문테이블이 있다고 할때
Left Join이라고 하면
왼쪽테이블 즉 고객테이블에 A라는 회사가 있는데
거래는 한번도 없다..그럼 당연히 A라는 회사의 ID는 거래테이블상에 없다
그런데 Left Join을 한다면
거래가 없어도 고객테이블의 고객명단이 모두 나타나게 하는
쿼리 테이블이 만들어지는 것이다
만약 Right Join이라고 하면
거래테이블상의 모든 내용이 나타나고 당연히 A라는 회사는 나타나지 않는
쿼리 테이블이 되는 것이고
만약 Inner Join을 한다면
고객회사와 주문이 이루어진 내용만 골라내는 쿼리테이블을
만드는 셈이다..
그러니 3가지 유형이 설명이 되는 셈이다
말로 때우자니 ..헷갈리니..
억세스테이블을 지극히 간단히 싱거운 것을 하나만들자
학생테이블을 하나 만들고
사는곳테이블을 하나 만든다
학생의 사는곳이 여러곳일 수도 있다고 치고..말이되나??
아무튼 관계를 보기 위한 것이니까..



억세스화일을 열어서 보시면
INNER, LEFT, RIGHT JOIN의 의미를 알수 있을 것이고..
충분히 질문의 답이 되었을 것이다
LEFT JOIN 이나 RIGHT JOIN 은 LEFT OUTER JOIN 이라고 도하고
RIGHT OUTER JOIN이라고도 SQL에서 사용하지만
OUTER라는 말은 빼도 된다

이참에 모두 억세스를 통하여 DB 에 대한 활용의 기회들이
되시면 참으로 좋고...!!

***[LOG-IN]***