DB 에서 금액 관련 테이블 작성시..
글쓴이: 망치 / 작성시간: 수, 2009/12/02 - 11:39오전
보통 사이버머니라던가 포인트 거래 관련 자료가 저장되는 DB 를 디자인할때 궁금한점이 생겨 글을 올립니다.
컬럼을 signed 로 해서 가감(-/+)을 모두 기록 한 다음 특정 시점의 SUM 값을 이용해서 계산하는지..
아니면 이벤트가 발생할때마다 각 사용자 정보 테이블을 기록한 특정 컬럼에 바로 +/- 한 값을 저장하는지..
또는 두가지 모두 사용해서 매 거래시마다 전자의 방법으로 레코드는 계속 쌓여가고 후자의 컬럼에 최종 SUM 값을 업데이트 하는 식으로 하는지..
일반적인 경우 어떤식으로 관리를 하는게 안정적인가요? 이외의 방법이 있다면 어떤게 있나요?
Forums:
포인트 증감내역
포인트 증감내역 조회기능이 필요하다면 포인트 컬럼은 최종값만 저장되어 있고 내역은 별도의 테이블에 넣도록 하는 것이 일반적인 것으로 알고 있습니다. 그렇지 않다면 이벤트가 일어날 때마다 포인트 컬럼의 값을 가감하는 식으로 만들 것입니다.
1. 구체적인 상황에
1.
구체적인 상황에 따라 답이 달라지겠지만...
내역 조회가 필요하다면 무조건 가감(+/-)을 모두 기록해야겠고...
내역 조회가 필요하지 않다면
그 정보가 얼마나 중요한가에 따라 달라지겠네요.
중요한 정보라면 모두 기록하고 필요하면 그 값을 합치라고 권하고 싶습니다.
그닥 중요하지 않은 거라면
번거롭게 내역 관리할 필요가 없죠. 그냥 특정 컬럼에 +/-를 바로 해주시는게 효율적이죠.
중요한 정보인데, 내역관리는 하고 싶지 않다면...
lock을 적절히 걸어서 데이터가 잘못되지 않도록 신경써주시면 되고요.
2.
두가지 방법 모두 다 사용하는 것... 즉...
포인트 컬럼에 최종값만 저장하고 내역은 별도의 테이블에 넣도록 하는 것은
피하는게 원칙입니다.
데이터의 중복이 발생하기 때문인데요...
물론 성능 이슈가 있을 때는 예외도 있습니다만...
그 경우에도 다른 방법으로 성능 문제 해결이 불가능하다는 전제가 있어야 합니다.
--
academic은 제 고등학교 때 동아리 이름입니다.
academic, 아주 가끔은 저도 이랬으면 좋겠습니다.
----
academic은 제 고등학교 때 동아리 이름입니다.
academic, 아주 가끔은 저도 이랬으면 좋겠습니다.
사이버 머니나
사이버 머니나 포인트 거래는 정보 특성상 발생이나 차감이력이 관리되어야 할 정보로 판단되구요. 그럼 별도의 테이블에서 발생시점과 값 저장하도록 해야하구요. 특정 회원의 전체 포인트 값은 해당 시점에 그 테이블을 sum해서 가져오면 될 거구요. 단, 온라인 상에서 실시간으로 sum하는 작업이 성능적으로 문제가 된다면 별도의 sum된 값을 회원 테이블에 중복해서 가지고 있어야 겠죠. 이렇게 성능과 같은 물리적 이슈를 설계에 반영하는 작업이 물리모델설계 작업이라고 볼 수 있겠네요. 이렇게 값을 중복해서 관리할 경우 앞에서 지적한 것처럼 데이터 간의 무결성을 어플리케이션에서 반드시 유지시켜줘야 합니다. 트랜잭션으로 묶어서 처리되게끔 하면 되겠죠.
Trigger를
Trigger를 추천합니다.
:)
인생의 무게를 느껴라. 아는 만큼 보이는게다.
답변 모두
답변 모두 감사드립니다.
제 생각에도 트랜잭션으로 묶고 sum 된 값을 가지고 있는 녀석을 만들어 두는게 좋을것 같습니다.
현재 작업중인 부분은 MSSQL 로 작업중이라 트랜잭션등을 쉽게 적용 할 수 있을것같은데, 나중에 MySQL 쪽에서 비슷한 작업을 해야 할 경우엔 어떤식으로 해야할지 좀 알아봐야겠네요.
---------------------------------------
http://www.waitfor.com/
---------------------------------------
http://www.waitfor.com/
http://www.textmud.com/
댓글 달기