postgre로 스키마를 작성하다가
궁금한 점이 생겼다.
나는 bigserial로 id 타입을 지정하는데 동료는 bigint로 하는 것이었다.
bigserial은 64비트 정수타입으로 알고 있는데 bigint도 64비트 정수타입인데
대체 둘이 뭐가 다르길래 나누어 놓은걸까? 하고 알아보니 다음과 같았다.
BIGINT 타입의 데이터와 동작은 동일하지만, 자동 증가(시퀀스)가 포함된 데이터 타입입니다.
새로운 레코드가 삽입될 때 자동으로 고유한 값이 할당됩니다.
내부적으로 시퀀스(sequence)를 사용하여 고유 값을 관리합니다.
사용 시점:
데이터베이스에서 자동으로 고유 ID를 관리하고 싶을 때.
대부분의 CRUD 시스템에서 간단한 기본 키로 사용하기에 적합합니다.
장점:
자동으로 고유한 ID를 생성하므로 관리가 쉽습니다.
코드 작성 시 ID 생성 로직이 필요 없습니다.
단점:
시퀀스를 사용하기 때문에 데이터 마이그레이션 시 시퀀스의 값이 꼬일 가능성이 있습니다.
값이 무작위가 아닌 순차적이기 때문에, 보안이 중요한 경우에는 예측 가능한 ID가 문제일 수 있습니다.
64비트 정수타입
자동 증가 기능이 없습니다.
값을 명시적으로 삽입하거나 애플리케이션에서 값을 관리해야 합니다.
사용 시점:
데이터베이스 외부에서 ID를 생성 및 관리하려는 경우.
예를 들어, UUID, 특정 알고리즘을 통해 ID를 생성하거나 분산 환경에서 고유 ID를 생성하는 시스템에 적합합니다.
장점:
ID 값을 완전히 제어할 수 있습니다.
자동 증가 값에 의존하지 않아 데이터 마이그레이션이나 재정렬이 더 쉽습니다.
단점:
ID 값을 별도로 생성해야 하므로 관리 부담이 있을 수 있습니다.
TSID처럼 실제로 id를 서버에서 생성하는 경우가 아니라면, bigserial을 사용하는 법이 보편적일 것 같다.