intro
최근 회사에서 multiple-column unique index 사용할 일이 있었는데,
그 과정에서 알게된 사실들을 간단하게 정리해보려고 합니다.
우선 unique index를 사용이 필요한 상황을 간단하게 예시로 설명해보겠습니다.
아래와 같이 사용자의 정보를 정의한 테이블 있다고 가정해보겠습니다.
name | address |
---|---|
철수 | 서울 |
영희 | 경기도 |
영수 | NULL |
저희 서비스의 설계에서는 이름과 주소(address
)의 조합이 unique할 필요가 있었고
동시에 주소 자체는 NULL
과 중복을 허용할 필요가 있었습니다.
예를 들어, 위의 테이블에서(철수, 경기도)
데이터는 철수
가 겹치기 때문에 데이터가 적재되어서는 안되지만,(철희, 서울)
은 이름/이름과 주소의 조합이 모두 unique하기 때문에 적재될 수 있어야 했습니다.
problem
처음에는 단순하게 두 컬럼을 unique index로 묶으면 문제가 해결될 것으로 기대했습니다.
하지만 기대와 다르게 아래와 같이 이름이 중복되고 주소가 NULL
일 경우에도 데이터가 적재되는 문제가 있었습니다.
name | address |
---|---|
철수 | NULL |
철수 | NULL |
원인이 되는 부문은 역시나 NULL
값이었습니다.
잠깐 아래 쿼리를 살펴보겠습니다.
SELECT IF(NULL != NULL, 'true', 'false');
SELECT IF(NULL = NULL, 'true', 'false');
두 NULL
값이 같은 값이라면 true
를, 다르다면 false
를 반환하는 간단한 쿼리입니다.
(실제로 위와 같이 사용하시면 안됩니다.)
위 쿼리의 결과는 무엇일까요?
결과는 모두 false
가 나오게 됩니다.
이처럼 NULL
이라는 값은 비교가 불가능한 값이기 때문에 주소값에 NULL
을 허용할 경우,
(참고로, NULL
과 NULL
이 아닌 다른값을 비교할 경우, 결과는 NULL
이 나옵니다.)
이름과 조합을 unique index로 거는 것만으로는 문제를 해결할 수 없었습니다.
solution
위 문제의 해결 방안으로는 크게 두 가지를 생각하였습니다.
- 이름만을 가지는 unique index를 추가한다.
- 주소에 default 값으로 빈 문자열이 들어가도록 설정한다.
(혹시나 그 외에 좋은 방법이 있다면 댓글 부탁드립니다.)
여기까지 multi-column unique index를 사용하면서 알게된 내용을 정리해봤습니다.
'전체보기 > Database' 카테고리의 다른 글
[MySQL]Index 파헤치기 - multi-column index range scan(수정) (0) | 2021.07.28 |
---|---|
[MSSQL] DECIMAL 사칙연산 파헤치기 (0) | 2020.10.15 |
[MSSQL] Collation 충돌 해결하기 (0) | 2020.06.13 |
[MSSQL] Collation 파헤치기 (1) | 2020.06.12 |
[Database]Isolation level 파헤치기 - 서로 다른 isolation level을 가진 transaction들은 어떻게 동작할까? (0) | 2020.03.01 |