데이터베이스 개발자 질문과 답변 게시판
데이터베이스 개발/운영 관련 질문과 답변을 올리는 게시판입니다. 궁금하신 내용을 이곳에서 문의하시면 SQLER 분들의 답변을 받으실 수 있습니다. 문의를 하실때에는 최근 작업하신 특이 사항이나, 장애 발생 전 상황을 상세히 올려 주시면 답글을 적어주시는 SQLER분들의 답변이 더 정확할 수 있으니 도움 되시길 바랍니다. 쿼리 문의일 경우, 실제 문제가 재현되는 테이블생성, 샘플데이터 생성 쿼리를 함께 올려 주시면 더 빠르고 정확한 쿼리 문의 응답이 가능합니다.
많은 도움 받고 있습니다.
감사합니다.
포인트 충전 및 사용시 제가 생각한 방법은 두가지 있습니다.
첫번째 방법
1. 포인트 충전시 유저테이블 point필드 update
- insert into users(userid, point)
values(1, 1000)
2. 포인트 사용(차감)시 유저테이블 point 필드 update
- update users
set point = (point - 100)
where userid = 1
- 현재 유저가 사용할수 있는지 판단은 select
select @point = point
from users
where userid = 1
if(@point < 100)
return 포인트가 부족합니다.
두번째 방법
1. 포인트 충전시 포인트 충전 테이블 insert
- insert into pointcharge(userid, point)
values(1, 1000)
2. 포인트 사용(차감)시 포인트 사용 테이블 insert(2번 사용(차감)했음)
- insert into usepoint(userid, point)
values(1, 100)
- insert into usepoint(userid, point)
values(1, 100)
select @chargepoint = sum(point)
from pointcharge
where userid = 1
select @usepoint = sum(point)
from usepoint
where userid = 1
set @remainpoint = (@chargepoint - @usepoint)
if(@remainpoint < 100)
return 포인트가 부족합니다.
첫번째 방법이 더 직관적이여서 사용중 입니다.
users테이블을 자주사용하는지라 두번째 방법을 생각해본건데
성능향상에 도움이 될런지요
혹시 두번째 방법으로 했을때 더 이점이 있는지요(장단점)
감사합니다.
첫번째 방법은 프로그래밍 하기에 쉬운 형태입니다,,
다만 적립, 사용 로그를 따로 쌓지 않으면 포인트를 언제 쌓았는지 언제 사용했는지 알수 없으며,
적립한 포인트의 만료기간을 산정하기 어렵습니다,,
두번째 방법은 첫번째 방법의 단점을 커버하지만, 차감하는 로직이 비교적 어려워 집니다,,
쉽게 처리하려면 커서를 이용해서 과거에 적립했던 포인트부터 순차적으로 차감할 수 있겠지요,,
물론 한번 쿼리로 차감도 가능합니다만, 복잡도가 상승하겠네요,,,
아, 두번째 방법도 사용에 대한 로그는 별도로 기록해야 논란이 생겼을 때 대응하기 쉬워지겠죠,,,,