Skip to content
isdnetworks
Go back

무료 슬롯이 일반 슬롯을 가리켰다

슬롯 정보 테이블에 컬럼이 둘 있었다.

game_type       1: 일반게임, 2: 무료스핀게임
main_slot_num   무료스핀용 슬롯과 대응되는 일반 슬롯의 슬롯번호

그리고 설명에 한 줄이 붙어 있었다.

일반 슬롯의 main_slot_num 값은 0 이다

Table of contents

Open Table of contents

같은 테이블에 둘 다 있었다

일반 슬롯과 무료스핀 슬롯이 같은 테이블에 있다.

seq  slot_name      game_type  main_slot_num
─────────────────────────────────────────────
1    슬롯A          1          0
2    슬롯A 보너스   2          1
3    슬롯B          1          0
4    슬롯B 보너스   2          3

2번이 1번을 가리키는 식으로 같은 테이블의 다른 행을 가리키는 구조다.

무료스핀 슬롯은 릴 배치도 페이라인도 따로 갖는다. 슬롯으로서의 성질이 일반과 같으니 다른 테이블로 나눌 이유가 없어 보인다. 다만 어느 일반 슬롯에 딸린 것인지는 알아야 하고 그것이 main_slot_num 이다.

0이 없음이었다

일반 슬롯은 이 값이 0이다. seqAUTO_INCREMENT 라 1부터 시작하니 0인 슬롯은 없다. 그래서 0이 가리키는 대상 없음이 된다.

여기서 궁금했던 것이 왜 NULL 이 아니냐는 것이었다. NULL 은 값이 없음을 뜻하는 표준적인 방법이고 0은 존재하지 않는 번호를 쓰는 방법이다.

왜 NULL이 아닌가

NULL 을 쓰면 이런 것이 걸린다.

WHERE main_slot_num = 0        -- 일반 슬롯
WHERE main_slot_num IS NULL    -- 일반 슬롯 (NULL이면)

비교 방식이 다르고 NULL 은 조인이나 조건에서 한 번 더 생각해야 한다.

WHERE main_slot_num <> 1   -- NULL 행은 안 걸린다

매뉴얼에는 =<> 같은 비교 연산자로 NULL 을 가릴 수 없다고 나와 있다. NULL 과의 비교는 결과가 다시 NULL 이라 조건이 참이 되지 않으므로 IS NULL 을 따로 붙여야 하고 빠뜨리면 그 행이 조용히 빠진다.

0이면 이런 것이 없어서 NOT NULL 로 둘 수 있고 그 컬럼에 항상 값이 있다.

외래키를 못 걸게 된다

반대로 0에는 문제가 있는데 0인 슬롯이 없으니 그 컬럼에 FOREIGN KEY 를 걸 수 없다.

NULL 이면 외래키를 걸어도 되는데 NULL 은 참조 검사에서 빠지기 때문이다. 0은 없는 행을 가리키는 값이라 걸 수 없다.

FOREIGN KEY 를 걸면 없는 번호를 넣는 실수를 DB 가 막아 준다. 그때 나오는 것이 ER_NO_REFERENCED_ROW_2 다. 0을 쓰기로 하면 그 보호를 포기하게 된다.

어느 쪽이 나은지는 모르겠다. 0은 비교가 단순한 대신 외래키를 못 건다. NULL 은 외래키가 가능한 대신 비교에서 주의가 필요하다. 이 설계는 전체가 외래키를 안 쓰는 쪽이라 그 안에서는 0이 자연스러워 보인다.

비교 — 종류 컬럼과 참조 컬럼

game_type 도 있다.

1: 일반게임
2: scatter게임(무료스핀)

그러면 main_slot_num 과 겹치지 않나 싶었다. game_type 이 1이면 main_slot_num 이 0이고 2면 0보다 커서 둘이 같이 움직인다.

이론적으로는 main_slot_num 하나로 판별된다. 0이면 일반이고 0이 아니면 무료스핀인데 game_type 이 따로 있다.

WHERE game_type = 1
WHERE main_slot_num = 0

며칠 보다가 이해가 됐다. 두 쿼리가 같은 결과인데 읽을 때 뜻이 다르다.

앞의 것은 일반 게임을 찾는다로 읽히고 뒤의 것은 부모가 없는 것을 찾는다로 읽힌다. 찾으려는 것이 앞의 것이면 앞처럼 쓰는 편이 낫다.

또 하나는 확장 여지다. 게임 종류가 셋으로 늘면 main_slot_num 으로는 3번을 표현 못 한다. 0이냐 아니냐 둘뿐이기 때문이다. game_type 이 있으면 값을 늘리면 된다.

정리


Share this post on:

Previous Post
비어 있는 값이 오류가 아니었다
Next Post
어느 단위의 상태인지 안 적혀 있었다