[DB] int와 bigint, ID 설정 시 어떤 것이 더 적합할까?

이지·2024년 10월 8일
post-thumbnail

주문 기능을 구현하면서 테이블의 참조를 활용하기 위해 챗지피티와 이야기를 나누던 도중 챗지피티는 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로 설정하면 되겠지~하고 넘어갔었다. 하지만 아무생각없이 데이터타입을 설정하는 것은 적절하지 않다고 생각이 들었고 둘의 차이점에 대해 정리할 필요성을 느꼈다.

🔎 int와 bigint의 차이

int

  • 4바이트 크기의 정수형
  • 저장 가능한 값의 범위 -2,147,483,648 ~ 2,147,483,647
  • 최대 약 42억 개의 고유한 ID 값 저장 가능

bigint

  • 8바이트 크기의 정수형
  • 저장 가능한 값의 범위 -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
  • 훨씬 더 많은 양의 데이터, 즉 수조개의 고유한 ID 값 저장 가능

🤔 어떤 기준으로 선택해야할까?

int와 bigint 중 적합한 자료형을 선택하기 위해 다음과 같이 고려해 봐야 한다.

1. 데이터의 규모

  • int는 대략 42억 개의 고유 ID를 생성할 수 있다. 일반적인 애플리케이션에서는 충분하지만, 대규모 전자상거래 시스템처럼 고유 ID가 자주 생성되는 시스템에서는 한계에 도달할 수 있다.
  • bigint는 훨씬 많은 ID 값을 저장할 수 있어, 대규모 트래픽이나 장기적인 확장성을 고려할 때 더 적합하다. 특히 42억 개 이상의 ID가 필요한 경우에는 필수적이다.

int의 경우 bigint에 비해 10% 이상의 디스크 용량을 절약한다고 한다.

2. 확장 가능성

데이터베이스의 확장 가능성을 생각했을 때, 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

0개의 댓글