#title 엔터티 집합의 상호 배타성 [[TableOfContents]] 먼저 ‘상호배타성’을 설명해야 하지만 바로 예제로 들어가겠다. 무엇이 문제인지 살펴보고 ‘상호배타성’이 무엇인지 살펴보도록 하겠다. 아래의 예제를 보면서 반드시 무엇인 문제인지 살펴보자. ==== 예제 ==== 다음은 우리의 고객이 원하는 리포트 형태이다. 그러면 데이터베이스 모델러 또는 설계자 또는 개발자는 어떻게 모델링 및 설계를 해야 하는지 고민을 하게 될 것이다. attachment:엔터티집합의상호배타성/design_tuning07.JPG 우리의 개발자는 고민에 빠졌다. 그래서 다음과 같이 설계를 했다. (다음을 보고 형상화 해보세요.) 여기서 ‘변동구분’은 입고, 출고, 반납, 교환을 말한다. {{{[상품]}}} 인덱스번호 | 상품이름 | 상품코드 | 재고수량 | 입력날짜 | 수정날짜 {{{[재고]}}} 인덱스번호 | 상품코드 | 변동수량 | 변동구분 | 입력날짜 | 수정날짜 ==== 무엇이 문제인가? ==== 문제는 ‘상품’에 ‘재고수량’ 속성이 있는 것이다. 즉, ‘상품’이라는 집합이 ‘재고수량’이란 개념까지 포함하게 된 것이다. 이로써 ‘상품’은 진정한 ‘상품’이 아니게 되었다. 이제부터 상품 기획자는 상품을 기획할 때 ‘재고수량’도 생각을 해야 한다. 말이 되는가? ‘재고 = 입고 – 출고’ 이다. ‘재고’에서 계산되어 알 수 있는 값이다. 그러면 ‘재고수량’은 자연스럽게 유도속성이란 것을 알 수 있다. 또한 ‘시간’의 차원까지 생각한다면 그냥 ‘재고수량’이 아니라 정확히 말하면 ‘현재 재고 수량’이다. 즉, 갑자기 차원이 하나 더 늘어나게 되어 버리는 것이다. 트랜잭션 처리 측면에서 살펴보자. 입고, 출고, 반품, 교환의 업무 트랜잭션이 발생하게 되면 ‘재고수량’을 맞춰 주어야(유도속성) 한다. 예를 들어, ‘재고’의 개체수가 1천 만 건이라고 생각해 보자. 입고, 출고, 반품, 교환의 업무 트랜잭션이 발생하게 되면 재고를 계산하기 위해서는 매번 1천 만 건의 데이터를 집계한 후 ‘현재 재고수량’을 맞춰 줘야 하는 우울한 상황이 발생하게 된다. 물론 서버에서 현 재고 수량에 대한 계산값을 가지고 있을 수도 있다. 서버에 문제가 생기면 파일로 남겨둔다고도 할 수 있다. 그렇다고 트랜잭션의 원자성을 보장 할 수 있는가? 아마도 DBMS보다는 안정성이 떨어질 것이다. 또는 처음 입고된 수량을 가지고 있고, 계속해서 갱신을 해줘도 된다. 어쨌든 현재로써는 시계열성은 가지지 못하고 이는 단순히 주문처리에 관련된 단일 사용자 관점에 불과해지므로 데이터베이스의 기본 사상에 어긋나게 된다. 만약 입고, 출고와 같은 시계열성을 가지는 개체집합을 붙인다고 해도 여전히 데이터의 중복(유도속성)에 의한 '데이터의 불일치'에 대한 과제는 여전히 남게 된다. 유도 속성의 가장 큰 문제는 데이터 동기화 즉, ‘데이터의 불일치’의 발생이다. 데이터 불일치는 잘못된 의사결정으로 이어질 수 있다. 생각해보라. 단가가 1천 만원인 A제품의 재고를 항상 1000개를 전후로 맞추어야 공급망에 문제가 생기지 않는데, 테이블의 ‘재고수량’은 100으로 되어 있어(실제로 재고는 1000개로 데이터의 불일치) 재고 담당자는 재고가 100개 밖에 없다고 생각하여 구매발주를 할 것이다. (물론 이런 재고담당자는 없다.) 돈이 얼마인가? 100억 원이다. 최악의 경우 재고처리 문제와 현금 회전율이 좋지 않아 기업이 도산 할 수도 있다. 당신이 설계한 DB때문에... ==== 상호배타성 ==== 앞에서 살펴본 예제에서 잘못된 설계로 인해 정보시스템에 어떤 영향을 미치는지 살펴보았다. 자칫하면 ‘유도속성 문제네’ 라고 치부할 수 있다. 하지만 그 이전에 ‘상품’에 ‘재고’와 관련된 속성이 튀어 들어간 것이 근본적인 문제의 원인이라고 할 수 있다. 좀 더 어려운 말로 어려운 말로 표현하면 엔터티 집합의 ‘상호배타성’이 문제다. 왜 ‘상호배타성’이 문제가 될까? 그것은 엔터티 집합이 될 수 있는 2가지 기본 조건 중에 하나이기 때문이다. 다음이 그 2가지 조건이다. 1. 상호배타성 2. 상호식별성 상호배타성은 엔터티 집합이 독립적이며, 중첩(Overlap)이 없어야 한다는 뜻이다. 즉, 엔터티 집합에 다른 엔터티 집합의 의미가 섞여있으면 안 된다는 뜻이다. 상호식별성은 개체간에 구분을 할 수 있어야 함을 뜻한다. 예를 들어, 다음의 두 스키마를 보자. 1. 사람(머리, 몸통, 팔, 다리) 2. 사람(머리, 몸통, 팔, 다리, ISBN) 사람이란 개체를 추상화시켜 간단히 머리, 몸통, 팔, 다리만을 표현했다. 그런데 2번째를 보면 쌩뚱 맞게도 ISBN이 튀어나왔다. 즉, ‘책’이란 엔터티 집합에 있어야 맞을 법한 ISBN이 사람에게 있는 것이다. 즉, ‘사람’이라는 엔터티 집합과 ‘책’이란 엔터티 집합은 상호배타적이어야 함에도 불구하고, 2번의 경우는 그렇지 못하다. 앞선 예제에서 ‘상품’ 엔터티 집합에 ‘재고수량’이 속성이 이라는 것은 ‘상품’과 ‘재고’가 개념적 중첩부분이 있다는 것이다. 엔터티 집합간에 중첩?? 그렇다! 이는 관계의 또 다른 표현이었을 뿐이다!! 질문: 그럼 어떻게 바꾸면 좋은 모델이 되었다고 할 수 있을까?