DATOR


자판기 데이터모델 시나리오 #1 데이터모델


자판기와 관련된 데이터 모델을 설계해 봅니다. 

 

< 목적>

  • 우리 주변에서 있는 사물들에서 발생하는 이벤트를 데이터 모델로 어떻게 형상화 되는지 살펴 본다.
  • 데이터의 입력/출력,  입고/출고, Input/Output이 어떻게 구현될 수 있는지 살펴 본다.
  • 보이는 대로 모델링 방식과 추상화한 모델링의 방식을 살펴본다.

< 시나리오 >

  • 우리가 관리하는 자판기는 여러 종류가 있다. 
  • 자판기에서 판매하는 재료는 음료수캔, 커피, 과자, 생활용품 등이다.
  • 어떤 자판기는 음료수캔 재료만을 취급하지만 , 복합 자판기는 음료수 + 커피 + 생활용품을 모두 다룰 수 있다.
  • 자판기에 재료을 투입할때는 상품 선택 위치에 따라 재료를 넣어 주어야 한다.  재료의 위치는 때때로 변경될 수 있다.
  • 우리가 운영중인 재료가 몇개 있는지, 몇개가 자판기에 투입되어 있는지, 사용수량은 어떻게 되었는지 수량관리를 하고 싶다.

데이터 모델은 2가지 관점에서 진행 보도록 한다. 

첫번째는 위 시나리오를 바탕으로 액면 그대로 설계를 하는 것이다. 모델링에 대한 깊은 이해 없이 겉으로만 드러난 현상만을 가지고 테이블을 설계할 때 나타날 수 있다.   

 

< 첫 번째 모델링 : 보이는 대로 테이블 설계를 해 보자 ~ >

 

[개념도 1]

1.자판기실물.jpg

K모델러는 자판기에서 사용하는 재료를 조사하여 보니 "콜라, 사이다, 커피, 율무, 껌, 초코릿" 6가지 였다.  그리고 자판기에 세팅 할 수 있는 재료를 살펴 보니 콜라 1개, 사이다1개, 커피, 율무, 껌, 초코릿은 1개씩만 세팅 할 수 있었다.  즉 현재로서는 커피를 2개 세팅할 수 있는 자판기는 없다고 가정한다.  그래서 작성한 자판기 개념도는 [그림1]과 같았다.

개념도를 바탕으로 테이블이 다음과 같이 설계되었다.  2*3개의 재료를 관리, 판매 할 수 있는 모델이다.

 

[ 데이터 모델 1]

1.자판기모델.jpg  

재료 > 재료는 자판기에서 판매 가능한 모든 재료들이 관리된다.  위 시나리오에서는 "콜라, 사이다, 커피, 율무, 껌, 초코릿" 6가지가 관리된다.   커피종류가 3개라면 커피1 = '모카', 커피2 ='아이스',  커피3 = '블랙'  3건이 등록되어 진다.

자판기 > 자판기 개체를 관리한다.  자판기에 투입될 수 있는 모든 재료들 만큼 재료ID + 재료수량 컬럼을 만들어 놓았다.  현재는 6개 재료만 관리하기 때문에 6개의 속성들이 있다.  자판기의 슬롯이 max 6개 이기 때문에  컬럼 종류가 6개 이다.  자판향후 다른 재료를 위한 예비컬럼으로서 재료1, 재료2 속성이 추가 되었다.  재료수량에는 현재 자판기에 설치된 재료들의 재고 수량을 관리된다.  자판기 재고수량이 기준 수량이하로 떨어지면 새로운 재료를 투입해야 한다. 

현재 모델에는 자판기의 사이다 안전재고 수량을 어떻게 관리 해야 할지 막막하기만 하다.  새로운 요건이 추가되거나 변경되면 컬럼을 늘이거나 또 다른 테이블들이 주렁주렁 매달릴 것으로 예상된다.   실제로 개체성격의 데이터에 업무적인 컬럼들이 붙어버리면 개체만의 고유속성이 무엇인지?  업무속성은 무엇인지?  중복속성인지 아닌지를 판단하기는 쉽지 않다... 

자판기 이력 > 자판기에 재료가 투입될때,  재료가 판매되었을때의 이력이 보관된다.  즉 INPUT과 OUTPUT의 데이터가 누적된다.  이력은 판매, 교체, 투입, 제거등의 모든 이벤트들을 관리 할 수 있다.  자판기 마스터 테이블의 재료ID + 재료수량 컬럼이 똑 같이 존재한다.  재료수량은 투입되거나 사용되어진 수량을 의미한다.

 

모델 설명에서 알수 있듯이 수량의 의미가 재료, 자판기, 이력에서 그 의미가 조금씩 달라진다.  재고수량, 사용수량, 누적수량이 속성명에 명시되어 있지 않고 테이블의 용도에 따라 달라진다.  당연히 모델만 보아서는 그 의미를 짐작 할수가 어려울 것이다.

 

이제 데이터를 발생시켜 보겠다.

 

[ 데이터 예시 > 재료, 자판기 ]

 2.사례데이터1.jpg

재료 > 재료 데이터는 재료의 총수량, 자판기 투입수량과 남아 있는 재고 수량이 관리되고 있다.  이런 데이터는 자판기 이력에서 IN, OUT 발생시 업데이트 되고 있을 것이다.

        > 코카-1은 총 50개였는데 자판기에 30개 투입되었고 20개 남아있다. 

자판기 > 자판기는 JA-10, JA-20 2대가 있다.  JA-10 자판기는 콜라 + 사이다 판매용이고,  JA-20 자판기는 콜라 + 밀크커피 판매용이다.   따라서 해당 재료의 컬럼에만 데이터가 입력되어 있다. 

          > JA-10 자판기에는 현재 콜라 5개,  사이다 7개가 남아 있음을 알 수 있다.

          > JA-20 자판기에는 콜라 12개 밀크 70(g)이 남아 있다.

 

[ 데이터 예시 > 이력1 ]

2.사례데이터2.jpg

자판기는 JA-10 이력 데이터를 살펴 보자.  JA-10 자판기에는 IN, OUT 구분자로서 투입, 출력을 알 수 있다.  IN일 때는 콜라 10개, 사이다 10개가 동시에 투입되었다.  동시에 투입되었기 때문에 이벤트는 01번에 기록되고 해당 컬럼에 데이터가 입력되었다.   02 순번에서는 콜라만 1개 판매되었고,  03일대는 콜라, 사이다가 동시에 판매 되었다는 것을 알 수 있다.

           - 이력 테이블의 SUM( IN )    = 콜라 10개,  사이다 10개

           - 이력 테이블의 SUM( OUT ) = 콜라 5개,   사이다 3개

JA-10 자판기에는 콜라는 5개 남아 있고 사이다는 7개 남아있음을 알 수 있다.   이 값은 "자판기" 테이블에 반정규화 되어 관리되고 있다.  왜냐하면 자판기에 얼마의 재고(잔고)가 남아 있는지를 파악해야 하기 때문이다.

 

[ 데이터 예시 > 이력2 ]

2.사례데이터3.jpg

자판기 JA-20의 커피ID가 재미있다.  처음에는 블랙-1 제품을 판매하다가 밀크-1로 교체 되었음을 알 수 있다.  그리고 자판기테이블에는 현재 밀크-1 제품이 70(g) 재고가 남아 있음을 기록하고 있다.

 

위의 데이터 모델과 데이터 관리방법에는 어떤 에로 사항이 있을까?  얼핏보면 큰 문제는 없어 보인다.  관리하는 속성들이 컬럼들로 되어 있으니 혹자는 이해하기 더 편해 할 수도 있겠다. 

재료, 자판기라는 개체가 관리되고 있고,  자판기 판매이력이 관리되고 있으니 비즈니스를 처리하는 데는 문제가 당장 발생하지 않을 수 있다. 

만약 자판기의 슬롯에 다른 제품을 판매하고 싶다면?  여러 슬롯이 있는 복합적인 자판기가 발생한다면 컬럼을 계속 추가해야 할까?  입력, 출력과 관련된 데이터 발생로직은 적절한 것일까 ?  판매 이벤트가 발생하였을 때 콜라 + 사이다가 동시에 투입, 판매 되었다면 함께 이벤트 기록하는 것이 좋을까 ?

 

여러가지 걱정스러운 생각들이 든다.  무슨 문제가 있을지 생각해 보는 것은 각자의 몫에 맡긴다.

누군가 꼼꼼하게 읽어 보는 회원이 있을지 살짝 고민이 된다..ㅎㅎ. 말이 많아서리...

 

두번째 모델링에서는 동일한 환경과 업무요건을 가지고 다른 방식으로 구현해 보도록 하겠다.

 

 

* 따뜻한 데이터 세상 만들기 - FROM 핫신 *
Tag :

Leave Comments