-
포인트(Point) 테이블 설계내가 공부하고 싶은 IT/지식정리 2022. 11. 20. 21:35
포인트 설계 시 고민했던 부분들과 해결하는 과정 정리
초반 설계 시에 정확한 요구사항 전에 관련 레퍼런스를 찾아보다가 제일 잘 정리되어 있고 거의 비슷하게 설계가 가능했던 좋은 레퍼런스가 있었다.
https://techblog.woowahan.com/2587/
해당 글에서 좋은 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 와 point_member_detail 에 테이블에 각각 하나의 row 가 추가된다.
save_point_member_id 에는 point_member의 id 를 그대로 저장한다.
2. 사용
사용 시에는 먼저 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