ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 포인트(Point) 테이블 설계
    내가 공부하고 싶은 IT/지식정리 2022. 11. 20. 21:35

    포인트 설계 시 고민했던 부분들과 해결하는 과정 정리

     

    초반 설계 시에 정확한 요구사항 전에 관련 레퍼런스를 찾아보다가 제일 잘 정리되어 있고 거의 비슷하게 설계가 가능했던 좋은 레퍼런스가 있었다.

    https://techblog.woowahan.com/2587/

     

    신규 포인트 시스템 전환기 #1 – 개발 단계 | 우아한형제들 기술블로그

    {{item.name}} 포인트 시스템 개편기 #1 – 개발 안녕하세요? 우아한 형제들에서 결제/정산 (+포인트와 비즈머니) 시스템을 개발하고 있는 이동욱입니다. ‘사내 블로그에 글을 더 쓸 일이 있을줄이

    techblog.woowahan.com

    해당 글에서 좋은 DB 설계 방식에 모티브를 얻고 요구사항에 맞는 조건들을 정리했다.

     

     

    요구사항

    1. 포인트의 상태는 적립(Save), 사용(Use), 사용취소(Use cancel), 적립취소(Save cancel), 만료(Expire)  5 종류의 상태가 발생할 수 있다.

    2. 적립 자체는 여러 상황에서 발생할 수 있다.(ex. 리뷰작성, CS, 마케팅 등등) 또한 적립이 발생한 액션을 알 수 있어야 한다.

    3. 적립된 포인트를 한번에 사용할 수 있다.

         시나리오 예시

         1) 1000원 적립

         2) 2000원 적립

         3) 2500원 사용

         4) 500원 남음

    4. 유효기간 종료 될 경우 자동으로 만료가 되어야 한다.

     

     

    설계

    point_master(포인트 적립 정책), point_member(회원별 포인트), point_member_detail(회원별 포인트 상세) 3가지의 테이블을 설계 했다.

     

    point_master 는 어드민에서 사용자에게 발급하는 포인트에 대한 정책이기 때문에 별도로 설명하지 않고 넘어가고 포인트 관련의 핵심인 point_member, point_member_detail 에 관련해서만 정리하겠다.

     

    ERD 정리

    create table point_member
    (
        point_member_id          bigint auto_increment comment '포인트 회원 아이디'
            primary key,
        member_id                bigint        not null comment '회원 아이디',
        point_master_id          bigint        null comment '포인트 마스터 아이디',
        point_status_code        varchar(1)    not null comment '포인트 액션 형태',
        point                    int default 0 not null comment '포인트',
        issue_date               varchar(8)    not null comment '발급 일자 yyyymmdd',
        expiry_date              varchar(8)    not null comment '만료 일자 yyyymmdd',
        point_type_code          varchar(2)    null comment '포인트 포인트 구분 코드',
        ref_unique_id            bigint        null comment '각 테이블의 아이디',
        reason                   varchar(100)  null comment '사유',
        memo                     varchar(100)  null comment '메모'
    )
    create table point_member_detail
    (
        point_member_detail_id   bigint auto_increment comment '포인트 회원 상세 아이디'
            primary key,
        point_member_id          bigint        not null comment '포인트 회원 상세 아이디',
        member_id                bigint        not null comment '회원 아이디',
        point_status_code        varchar(1)    not null comment '포인트 액션 형태',
        point                    int default 0 not null comment '포인트',
        save_point_member_id     bigint        null comment '적립 원본 아이디'
    )

     

    시나오리오 별 상황

    1. 적립

    point_member 에 100 적립
    point_member_detail 에 100 적립

    적립 상황 시에는 point_member 와 point_member_detail 에 테이블에 각각 하나의 row 가 추가된다.

    save_point_member_id 에는 point_member의 id 를 그대로 저장한다.

     

    2. 사용

    point_member 에 500 사용
    point_member_detail 에 500 사용되는 과정 예시

    사용 시에는 먼저 100, 200, 300 씩 순차적으로 적립이 된 상황에서 (총 600 포인트)

    500포인트를 사용 할 경우 먼저 적립된 포인트 부터 순차적으로 차감되는 과정을 point_member_detail 에서 확인 할 수 있다.

     

     

    이런식으로 포인트 관련 테이블을 설계 할 경우 포인트의 적립과 차감에 관련된 히스토리를 쌓으면서 사용자에게는 요약된 정보를 보여 줄 수 있어서 쿼리를 할 때도 유용하다고 생각한다.

     

    '내가 공부하고 싶은 IT > 지식정리' 카테고리의 다른 글

    Elasticsearch bool 쿼리  (0) 2023.01.01
    Elasticsearch DSL 기본  (0) 2023.01.01
    Elasticsearch Inverted Index 의 이해  (0) 2022.12.25
    Elasticsearch 분석기 테스트  (0) 2022.12.25
    Elasticsearch 분석기  (0) 2022.12.25
Copyright @ 2016-2020 AmazonEberea