_대문 | 방명록 | 최근글 | 홈피소개 | 주인놈 |
FrontPage › 직책/직무/직급
|
|
[edit]
1 사례 #분류테이블로
[edit]
2 무엇이 문제인가? #잘못된 것부터 고치고 넘어가자. 일단 테이블이라는 것은 물리적인 용어이다. 물론 지금 상황의 경우는 간단하여 바로 물리설계(테이블설계)가 가능하지만 실제 프로젝트에는 이렇게 하면 곤란하다. 일단 분류테이블이라고 하는 것을 “코드엔티티(집합)”으로 명칭을 수정하겠다. (물론 실제로 정규화라는 것은 관계형 데이터 모델의 용어 즉, 논리적인 것인데 현재까지도 관계형으로 대부분의 설계가 이루어지기 때문에 구분을 크게 두지는 않는다.) 그렇다면 직무, 직책, 직급의 의미는 무엇일까? 네이버 국어사전에는 다음과 같이 나온다.
![]() 이렇게 ERD를 그렸다면 상당히 상세하게 된다. (물론 관계명은 관계 맺은 테이블들의 관점에서 모두 정의를 했어야 하지만 여기서는 이 정도로 끝내겠다.) 그러나 위의 질문을 보면 직급과 직무, 직책의 관계는 위와 같은 관계로 볼 수 없다. 그저 사원의 속성으로 판단되는 것을 볼 수 있다. 물론 각각의 사원이 하나 이상의 직급을 가질 수도 있고, 여러 개의 직무를 가질 수 있으며, 직무에 대한 책임인 직책도 여러 개를 가질 수 있다. 이렇게 본다면 또한 사원의 직급, 직무, 직책은 다중값 속성이 되어 또한 1정규화(반복그룹이 있다.) 위배이다. 그러나 위의 질문에서는 다중값 속성이 아니라고 판단되고, 반드시 있어야 할 속성으로 판단하여 ERD는 다음과 같이 그려질 수 있다.
![]() 질문에서는 A타입의 테이블과 B타입의 테이블 중 어떤 것이 좋을까 하고 물었다. 결론부터 말하면 당연히 B타입이다. 그 이유를 살펴보자. 먼저 A타입을 살펴보자. 다음과 같이 속성들간에 종속이 발생했다. 종속성만 판단되면 지금까지 필자가 열심히 떠들었던 것은 필요 없이 다이렉트로 정규화를 할 수 있다.
[edit]
3 실제로 처리양을 따져보자 #개발자들이 위와 같이 테이블을 만드는 이유는 아마도 두 개의 테이블을 접근하는 것(조인)보다 하나의 테이블에 접근하는 것이 더 빠르겠지라는 막연한 생각 때문일 것이다. 과연 빠를까? 답은 아니올시다이다. 이유를 살펴보자. A타입으로 테이블을 생성했을 때 다음과 같이 쿼리했다고 가정하자.
SELECT 아이디, 이름, 직무명 FROM 사원 사원테이블에 1만건이라고 가정하고 아이디의 길이가 8바이드, 이름의 길이가 8바이트, 직무명의 길이가 10바이트라고 가정하면 다음과 같이 I/O양이 계산이 나온다.
10000 * (8 + 8 + 10) = 260000 바이트
그러나 직무코드가 100건이고, 다음과 같이 조인을 하였다면 어떻게 계산될까?
SELECT A.아이디, A.이름, B.직무명 FROM 사원 A INNER JOIN 직무코드 B ON A.직무코드 = B.직무코드 이 쿼리는 다른 조건들이 없으므로 무조건 직무코드부터 읽혀질 것이다. 물론 Merge Join이라면 동시에 읽어서 정렬 후 비교 할 테지만 말이다. 쉽게 계산하기 위해서 두 테이블을 한번 씩 풀스캔했다고 생각해보자. 위에서와 마찬가지로 직무코드에 대한 계산을 빼고, 결과 집합을 놓고 계산을 하면
직무코드 테이블에서 읽은 것 100*10 = 1000 바이트
사원테이블에서 읽은 것 10000 * (8 + 8) = 160000 바이트 총 161000 바이트다. 두 개의 쿼리문에서의 입/출력 양의 차는 약 100000 바이트나 차이가 난다. 아마도 사원테이블을 시간이 지날수록 비대(퇴사한 사원의 정보를 지우지 않고 있다면..)해 질 것이며, 이해 비해 직무코드 테이블은 별로 커지지 않을 것이다.
[edit]
4 결론 #이로써 질문에 대한 답은 B타입으로 결정되었을 것이다. 그러나 이것으로 끝나서는 안된다. 필자는 가끔 이런 경우 코드테이블이 과연 필요할까 생각해본다. 어떤 이유가 있겠지만 그 이유가 나중에 응용 프로그램에서 if(1==m_strCode) m_strName = ‘부장’ else if … 라면 실망스러울 것이다.
|
생각은 자유롭고 독립적인 듯 보이지만 인간은 생각보다 더 강한 것을 가지고 있다. 그것은 생각을 인도할 수 있는 능력이다. |