주문 기능을 구현하면서 테이블의 참조를 활용하기 위해 챗지피티와 이야기를 나누던 도중 챗지피티는 id값을 int로 설정하고, Supabase의 공식문서에서는 bigint(int 8)로 설정하고 있다는 사실을 알게되었다.
[참고] postgresql에서는 int8을 bigint의 별칭으로 사용한다.
나의 경우 Supabase의 공식문서를 보면서 진행했기 때문에 테이블을 만들 때 id를 int8로 설정했다.
공식문서에 작성된 예제들을 살펴보았을 때, id를 거의 int8로 설정하여 만들고 있었고 그렇기에 나 또한 별생각 없이 int8로 설정했다.
아래는 공식문서에 작성된 예제 중 하나이다.
-- Create the table
create table notes (
id bigint primary key generated always as identity,
title text not null
);
-- Insert some sample data into the table
insert into notes (title)
values
('Today I created a Supabase project.'),
('I added some data and queried it from Next.js.'),
('It was awesome!');
alter table notes enable row level security;
왜 지피티에선
int를 썼지..? 그렇다면 Supabase는 왜int 8..?
둘의 차이점이 뭐지?
Supabase에서 컬럼의 데이터타입을 설정할 때도 id에서 int8 썼으니까 숫자형의 경우 int8로 설정하면 되겠지~하고 넘어갔었다. 하지만 아무생각없이 데이터타입을 설정하는 것은 적절하지 않다고 생각이 들었고 둘의 차이점에 대해 정리할 필요성을 느꼈다.
-2,147,483,648 ~ 2,147,483,647-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807int와 bigint 중 적합한 자료형을 선택하기 위해 다음과 같이 고려해 봐야 한다.
int는 대략 42억 개의 고유 ID를 생성할 수 있다. 일반적인 애플리케이션에서는 충분하지만, 대규모 전자상거래 시스템처럼 고유 ID가 자주 생성되는 시스템에서는 한계에 도달할 수 있다.bigint는 훨씬 많은 ID 값을 저장할 수 있어, 대규모 트래픽이나 장기적인 확장성을 고려할 때 더 적합하다. 특히 42억 개 이상의 ID가 필요한 경우에는 필수적이다.int의 경우 bigint에 비해 10% 이상의 디스크 용량을 절약한다고 한다.
데이터베이스의 확장 가능성을 생각했을 때, bigint는 장기적인 데이터 증가와 ID 소모 속도를 대비하는 안전한 선택일 수 있다. 글로벌 서비스나 대규모 애플리케이션의 경우 bigint를 사용하는 것이 적절하다.
대규모로 확장할 계획이 없고, 43억 개 이상이 필요하지 않을 것으로 예상된다면 int 를 사용하는 것만으로도 충분할 것이다.
트래픽이 많거나 데이터가 폭발적으로 늘어날 가능성이 있다면, bigint가 더 나은 선택이다.
특히 글로벌 서비스나 장기적으로 데이터를 많이 저장해야 하는 프로젝트라면 bigint가 안전한 선택!
Supabase에서 bigint를 사용하는 이유는 확장성을 염두에 두고 설계된 데이터베이스 구조 때문일 것이다.
[참고]
[면접] id를 왜..bigint..?
[MySQL/DB] id값은 INT or BIGINT?, AUTO_INCREMENT or UUID?
[MySQL] id 컬럼 데이터타입(INT vs BIGINT) | Knowledge-Archive