본문 바로가기

Server Oriented/DB-Oracle

스크레치 복권 발급과 관련된 단상

1. 복권 경품 DB 를 만들어서..

 - 각 경품에 대하여 확보된 총 수량

 - 관리자가 세팅하기에 따라 현재 오픈될 수 있는 수량

 - 경품 코드와 경품 명칭 (경품 코드는 일련번호로 따는 것이 덜 번거로움)

 - 꽝도 하나의 경품으로 세팅

 - 경품도 그룹이 있을 터인데, 이를테면 물품과 포인트 등등으로 구분


2. 경품은 난수로 일차 세팅 (seed 에 해당)

 - round(dbms_random.value(경품코드1, 경품코드2)) 

   상기 1에서 그룹을 잡은 경품 코드별로,

   로그인 했을 때 발급되는 복권에 대한 경품 코드를 난수로 체크,

   특정 이벤트(이를테면 회원가입, 물건 구입 등등)에 해당하여 발급되는 복권에 대한 경품 세팅


3. 사용자가 방문시 seed 를 체크하고 기타 사항을 확인하여 복권을 발급

 - insert ~ select ~ 문으로 체크하여 복권 발급

   복권을 긁었는지 긁지 않았는지 칼럼을 정해서 update

   사용자가 복권을 긁을 화면이 열리면 이미 발급된 복권을 세팅하고,

   긁으면 해당 복권 코드를 기준으로 update

 - 복권 전체 건수를 미리 insert 하고 복권을 긁을 때 update 하는 방식은 비추. 

   복권 발급 요건에 맞을 때 발급 (이를테면, 해당 사용자가 로그인 해서 해당 이벤트 화면에 접속시 해당 인원에 대한 복권 발급)

   하루에 1개씩 주는 복권이라면, 아직 긁지 않은 복권을 다음 날에 삭제할 것인지 체크

   물건 구매시 주어지는 복권이 구매 취소되는 경우라면, 아직 긁지 않았을 때 해당 복권을 삭제.

 - 상기 insert ~ select 문에는,

   상기2에서 만들어진 seed 를 기준으로 아래 조건이 맞으면 꽝으로 대체

 - 특정 그룹에 속하는 경품은 1인에게 최대 1개만 발급

   특정 그룹에 속하는 경품은 특정일시 이후나, 특정 시간대에 발급

   해당 경품이 확보된 총 수량 이하로 발급

   해당 경품 현재 오픈될 수 있는 수량 이하로 발급

   꽝이 아닌 경품이 하루에 최대 몇 건까지 발급 (총 경품수를 전체 기간으로 나눈 수)

   2시간 이내에 꽝이 아닌 경품은 1건만 발급


상기와 같은 내용을 세팅.