DB 에서 금액 관련 테이블 작성시..

망치의 이미지

보통 사이버머니라던가 포인트 거래 관련 자료가 저장되는 DB 를 디자인할때 궁금한점이 생겨 글을 올립니다.

컬럼을 signed 로 해서 가감(-/+)을 모두 기록 한 다음 특정 시점의 SUM 값을 이용해서 계산하는지..
아니면 이벤트가 발생할때마다 각 사용자 정보 테이블을 기록한 특정 컬럼에 바로 +/- 한 값을 저장하는지..

또는 두가지 모두 사용해서 매 거래시마다 전자의 방법으로 레코드는 계속 쌓여가고 후자의 컬럼에 최종 SUM 값을 업데이트 하는 식으로 하는지..

일반적인 경우 어떤식으로 관리를 하는게 안정적인가요? 이외의 방법이 있다면 어떤게 있나요?

세이군의 이미지

포인트 증감내역 조회기능이 필요하다면 포인트 컬럼은 최종값만 저장되어 있고 내역은 별도의 테이블에 넣도록 하는 것이 일반적인 것으로 알고 있습니다. 그렇지 않다면 이벤트가 일어날 때마다 포인트 컬럼의 값을 가감하는 식으로 만들 것입니다.

academic의 이미지

1.

구체적인 상황에 따라 답이 달라지겠지만...

내역 조회가 필요하다면 무조건 가감(+/-)을 모두 기록해야겠고...

내역 조회가 필요하지 않다면

그 정보가 얼마나 중요한가에 따라 달라지겠네요.

중요한 정보라면 모두 기록하고 필요하면 그 값을 합치라고 권하고 싶습니다.

그닥 중요하지 않은 거라면

번거롭게 내역 관리할 필요가 없죠. 그냥 특정 컬럼에 +/-를 바로 해주시는게 효율적이죠.

중요한 정보인데, 내역관리는 하고 싶지 않다면...

lock을 적절히 걸어서 데이터가 잘못되지 않도록 신경써주시면 되고요.

2.

두가지 방법 모두 다 사용하는 것... 즉...

포인트 컬럼에 최종값만 저장하고 내역은 별도의 테이블에 넣도록 하는 것은

피하는게 원칙입니다.

데이터의 중복이 발생하기 때문인데요...

물론 성능 이슈가 있을 때는 예외도 있습니다만...

그 경우에도 다른 방법으로 성능 문제 해결이 불가능하다는 전제가 있어야 합니다.

--
academic은 제 고등학교 때 동아리 이름입니다.
academic, 아주 가끔은 저도 이랬으면 좋겠습니다.

----
academic은 제 고등학교 때 동아리 이름입니다.
academic, 아주 가끔은 저도 이랬으면 좋겠습니다.

magma1의 이미지

사이버 머니나 포인트 거래는 정보 특성상 발생이나 차감이력이 관리되어야 할 정보로 판단되구요. 그럼 별도의 테이블에서 발생시점과 값 저장하도록 해야하구요. 특정 회원의 전체 포인트 값은 해당 시점에 그 테이블을 sum해서 가져오면 될 거구요. 단, 온라인 상에서 실시간으로 sum하는 작업이 성능적으로 문제가 된다면 별도의 sum된 값을 회원 테이블에 중복해서 가지고 있어야 겠죠. 이렇게 성능과 같은 물리적 이슈를 설계에 반영하는 작업이 물리모델설계 작업이라고 볼 수 있겠네요. 이렇게 값을 중복해서 관리할 경우 앞에서 지적한 것처럼 데이터 간의 무결성을 어플리케이션에서 반드시 유지시켜줘야 합니다. 트랜잭션으로 묶어서 처리되게끔 하면 되겠죠.

oldbell의 이미지

Trigger를 추천합니다.
:)

인생의 무게를 느껴라. 아는 만큼 보이는게다.

망치의 이미지

답변 모두 감사드립니다.

제 생각에도 트랜잭션으로 묶고 sum 된 값을 가지고 있는 녀석을 만들어 두는게 좋을것 같습니다.
현재 작업중인 부분은 MSSQL 로 작업중이라 트랜잭션등을 쉽게 적용 할 수 있을것같은데, 나중에 MySQL 쪽에서 비슷한 작업을 해야 할 경우엔 어떤식으로 해야할지 좀 알아봐야겠네요.

---------------------------------------
http://www.waitfor.com/

---------------------------------------
http://www.waitfor.com/
http://www.textmud.com/

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.