-
테이블의 PK는 어떤값으로 잡아야 할까?프로젝트/게시판 프로젝트 2022. 4. 21. 02:06반응형
프로젝트에 사용하는 회원 테이블의 PK를 어떤 값으로 잡을지 고민하고 있습니다.
각 후보들에 대해 분석하여 보겠습니다.
검색을 하던 중 인조 식별자/본질 식별자라는 키워드도 알게 되었습니다.
본질 식별자
업무에 의해 만들어진 식별자 ( ID값과 같은 경우)
인조 식별자
본질 식별자가 복잡한 구성을 갖고 있어서 인위적으로 만든 식별자
우선 PK란?!
Primary Key의 약어로 데이터베이스의 기본키를 의미합니다.
기본키는 중복된 값을 가질 수 없고 NULL 값일 수 없는 키로 튜플을 식별하기 위해 반드시 필요한 키입니다.
후보들
- ID
- UUID
- Auto Increment
ID
Identification의 약자로 보통 사용자가 어떤 사이트에 인증을 얻기 위해 로그인할 때 사용됩니다.
사용자마다 단일한 값을 보장하기 때문에 PK의 후보가 될 수 있습니다. (Unique 하며 Null 값이 아니다!)
UUID
Universally Unique IDentifier의 약자로 보통 분산 컴퓨팅 환경에서 사용되는 식별자입니다.
128비트(16바이트)의 숫자이므로 10^38승까지 정확히340,282,366,920,938,463,463,374,607,431,768,211,456개가 생성 가능합니다.
물론 극악의 확률로 유일성을 보장하지 않을 수 있지만 실질적으로는 유일함을 보장합니다.
Auto Increment
단순히 1부터 시작하여 숫자를 늘려가면서 식별자를 만들어내는 방식입니다.
매우 단순하지만 너무 많은 id가 생성되면 오류가 발생할 수도 있습니다.
예를 들어 int형의 경우는 -21억 ~21억의 수를 표현할 수 있습니다.
만약 21억을 넘어가게 된다면? bit의 overflow가 일어나서 -값이 나오게 될 것입니다.
또한 42억 개를 넘어가는 경우에도 계속 중복된 pk값이 생성되는 경우가 발생할 수 있습니다.
그래서 뭘 사용하면 될까?
- 인덱싱 측면
- MySQL에서는 엔진으로 InnoDB를 기본적으로 사용합니다.
- 이때 PK는 기본적으로 자동으로 인덱싱 되며 정렬됩니다.
- 이 경우에서는 UUID 또는 ID를 사용하는 경우에는 새로운 회원이 삽입될 때마다 정렬되며 성능에 영향을 줄 수 있습니다.
- 하지만 Auto Increment의 경우에는 순차적으로 증가하기 때문에 정렬이 발생하지 않습니다.
- 분산 시스템 측면
- 만약 여러 개의 데이터베이스를 사용하고 별다른 동기화가 되어있지 않다면 데이터베이스 A가 insert를 받으면 1,2,3,4,5,6으로 키를 증가할 것이고 데이터베이스 B 또한 insert를 받으면 1,2,3,4,5,6으로 키가 증가합니다. 즉, Duplicate Key가 발생할 수 있습니다.
- ID의 경우에도 데이터베이스 A와 데이터베이스 B에서 동일한 회원이 가입한다면 곤란한 상황이 발생할 수 있습니다.
- UUID의 경우에는 애초에 겹 칠일이 없기 때문에 문제가 발생하지 않습니다.
- 탈퇴했을 때
- ID의 경우에는 해당 아이디가 탈퇴했을 때 히스토리를 남겨야 할지 아니면 모든 기록을 지워야 할지에 대해 고민해봐야 합니다. 만약 ID를 PK로 선정했다면 해당 아이디를 삭제하기 전에 관련된 모든 내용들을 제거해야 합니다.
- 또한 탈퇴했던 ID를 다른 유저가 같은 아이디로 재가입하는 경우에 원래 아이디를 사용했던 사람이 쓴 글이 남아있다면 문제가 될 수 있습니다.
- 위의 내용의 경우에는 회사의 정책에 의해 결정할 수 있습니다. 예시) 회원 사용 여부만 y/n으로 구분하고 1년에 2번 작업해서 데이터를 다 날려버리는 형식
결론
단일 데이터베이스를 사용할 예정이고 전반적인 측면들을 따져보았을 때 나의 서비스가 40억 명이 사용할 만큼 규모가 있지 않기 때문에 Auto Increment방식을 채택하겠습니다.
또한 Java에서는 unsigned int를 지원하지 않기 때문에 그냥 long type을 사용하고자 합니다.
출처
https://okky.kr/article/424100
OKKY | DB 회원테이블에서 int형식의 index컬럼이 꼭 필요할까요?
안녕하세요. 새로운 서비스를 개발중에 있는 3년차 개발자 입니다. 전에 다니던 회사의 경우 회원테이블에 int형의 index컬럼(auto_increment. Mysql 기준)을 항상 잡아 놓았 는데요.. 이렇게 설계할경우
okky.kr
https://velog.io/@qnfmtm666/DevTip-UUID-vs-Auto-Increment
[DevTip] UUID vs Auto Increment
UUID 는 간단하게 범용 고유 식별자라고 생각하면 편할것 같습니다.예를 들어 내가 뭔가 만들 때마다 식별할 수 있는 고유값을 만들고 싶다면 사용하면 됩니다.문서를 만들고 문서의 고유 식별자
velog.io
'프로젝트 > 게시판 프로젝트' 카테고리의 다른 글
@Builder 제대로 알고 사용해보기 (0) 2022.04.30 JPA로 CRUD 해보기 + 테스트코드 (0) 2022.04.28 Spring Boot + MySQL 연동(feat. Spring initializr) (0) 2022.04.26 프로젝트 데이터베이스 설계(RDBMS vs NoSQL 선정기준 + 특정 RDBMS 선정이유) (0) 2022.03.29 로그인 기능 구현 시 고려 사항(쿠키, 세션, 로컬 스토리지, 인증과 인가, 토큰, Oauth) (0) 2022.03.24