당첨 금액 테이블을 봤다.
slot_num 슬롯번호
symbol_num 심볼(아이콘) 번호
win_type 당첨 종류(당첨 심볼 개수)
win_money 당첨 종류별 지급 금액
설명에 이렇게 적혀 있었다.
당첨 종류는 각 심볼별로 3개당첨, 4개당첨, 5개당첨 세 종류씩이다
심볼 하나에 행이 셋이다.
Table of contents
Open Table of contents
앞과 반대였다
같은 설계서에서 릴과 페이라인은 문자열 한 칸에 넣어 뒀는데 여기는 행으로 나뉘어 있다.
릴 문자열에 통째로
페이라인 문자열에 통째로
당첨금액 행으로 나뉨
같은 사람이 짠 설계인데 방식이 다르다. 그러면 무엇을 기준으로 갈랐는지가 있을 것으로 보였다.
어떻게 쓰이나 봤다
두 방식의 차이를 이해하려고 어떻게 쓰이는지를 봤다. 릴은 클라이언트가 화면을 그리려고 통째로 받고 당첨 금액은 스핀 결과가 나오면 그 심볼과 그 개수의 금액을 찾는다.
결과: 7번 심볼이 4개 나옴
↓
7번 심볼의 4개 당첨 금액을 조회
부분 조회다. 여기서 앞의 것과 갈리는 지점이 보였다.
당첨 금액을 문자열로 두면 "3:100,4:500,5:2000" 같은 모양이 될 텐데 이러면 매번 잘라서 찾아야 한다.
SELECT win_money FROM win_money_info
WHERE slot_num = ? AND symbol_num = ? AND win_type = ?;
행으로 두면 조회 한 번이다. 그리고 (slot_num, symbol_num, win_type) 복합 인덱스를 걸 수 있어서 EXPLAIN 의 type 이 const 나 ref 로 나온다. 문자열 안의 값에는 인덱스를 못 걸고 FIND_IN_SET 으로 조건을 걸어도 전수 스캔이 된다.
배수였다
win_money 설명이 이랬다.
당첨 종류별 지급 금액(베팅한 금액에 곱해줄 금액)
금액이 아니라 배수다. 지급은 베팅 금액에 win_money 를 곱한 값이 된다.
컬럼 이름은 money 인데 실제로는 곱할 수라 이름과 내용이 다르다. 설명을 안 읽으면 win_money = 100 을 100코인 지급으로 읽을 텐데 베팅이 10이면 1,000이다. 설명서에만 적혀 있는 정보이고 win_multiplier 였으면 그 자리에서 갈렸을 것이다.
배수로 두는 것 자체는 이유가 있어 보였다. 금액을 고정하면 베팅 금액이 달라져도 지급이 같아서 말이 안 되는데 슬롯은 베팅 금액을 유저가 고르므로 비례해야 맞다. 밸런스를 조정할 때도 배수 하나만 고치면 모든 베팅 구간에 적용된다.
세 종류인 이유
3개와 4개와 5개 세 종류라는 것도 생각해 봤다. 릴이 다섯 개니 한 페이라인에 최대 5개가 같은 심볼일 수 있다.
1개, 2개 → 당첨 아님
3개 → 당첨
4개 → 더 큰 당첨
5개 → 최대
3개부터 당첨이라 세 종류이고 릴 개수가 종류 수를 정한다.
만약 릴이 여섯 개가 되면 3부터 6까지 네 종류가 되어 행이 늘어난다. 문자열이었으면 구분자 형식을 바꾸고 explode 하는 코드도 함께 고쳐야 하는데 행 구조라 INSERT 만 하면 된다.
앞에서 본 칸 수가 변동될 수 있다는 것과 반대 방향이다. 릴은 길이가 변하고 여기는 행이 는다.
판단 기준 — 문자열과 행
두 자리를 놓고 보니 기준이 조금 보였다. 통째로 읽고 통째로 쓰면 문자열이고 특정 조건으로 하나를 찾으면 행이다.
그리고 여기에 하나 더 붙는 것 같다. 값이 자주 조회되면 행 쪽이 인덱스를 탈 수 있고 로딩 때 한 번 나가는 값이면 문자열이다. 릴은 게임 시작 때 한 번 내려가고 당첨 금액은 매 스핀마다 조회된다.
다만 이것은 문서만 보고 짐작한 것이다. 실제로 당첨 금액을 매번 DB 에서 읽는지 아니면 메모리에 올려 두는지는 모른다.
메모리에 올려 두면 문자열이든 행이든 상관없어질 것 같고 코드를 보면 알게 될 부분이다.
정리
- 같은 설계서 안에 문자열로 둔 곳과 행으로 나눈 곳이 있다
- 통째로 읽고 통째로 쓰면 문자열이 편하다
- 조건으로 하나를 찾으면 행이 편하다
- 행이면 복합 인덱스를 걸 수 있어
type이const나ref가 된다 - 문자열 안의 값은
FIND_IN_SET을 써도 전수 스캔이 된다 - 컬럼 이름은
win_money인데 내용은 배수였다 - 배수로 두면 베팅에 비례하고 조정이 한 곳으로 모인다
- 당첨 종류가 셋인 것은 릴 개수가 다섯이라서다
- 릴이 늘면 행이 늘고 문자열이면 형식을 바꿔야 한다
- 실제로 어떻게 읽는지는 코드를 봐야 알 것 같다