0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[PostgreSQL]自動インクリメントとUUIDの違い

Posted at

はじめに

オリジナルアプリを作成するにあたって、Supabaseを使用してデータベースを構築しました。その際に、各テーブルのIDカラムの型を指定する際に新しく学んだことがあったため、備忘録も兼ねてまとめていきます。

調べるきっかけになったこと

データベース設計を行う際に、各テーブルに主キーを設定すると思います。
その際、私は以下のようにInteger型を指定していました。

カラム名
PK id Integer
nickname String
email String
password String

今までMySQLを使ってデータベース構築をすることが多く、主キーに対して自動インクリメント(ID)でidフィールドを設定していたのですが...

Supabaseの場合だとUUIDで保存されるので、idカラムはString型にしましょう

とレビューをいただいたので、自動インクリメント型(Integer型)とUUID(String型)で主キーを保存する違いについて調べてみました。

自動インクリメント型(Integer)

IDが連番の整数値で管理される。
データベースのIDフィールドに新しいレコードが追加されるたびに、1,2,3...と順番にID番号が増加する。

特徴

  • 一意性
    1つのデータベース内で一意のIDを持つ。
    ただし、異なるデータベースやシステムの間では重複する可能性がある。

  • メモリ効率がよい
    32ビットまたは64ビットの整数型で、最大でも10桁や19桁の数値で表されるため、インデックスや検索を効率的に行うことができる。

  • 管理がシンプルだが、特定がしやすい
    数値で管理をするので、視覚的に分かりやすくデータ管理ができる。
    一方で、連番でデータを管理するため次のIDが予測しやすく、セキュリティリスクがある。

UUID

全世界で一意の識別子を生成するための方法。
現在多くのRDSで採用されており、どのIDとも重複しないのでユニーク性の高さが保証されている。

  • 一意性
    世界中で一意のIDを生成できる。
    異なるシステム間やデータベース間でUUIDが衝突する可能性が極めて低い。

  • サイズが大きい
    128ビットのデータを使って生成されるため、一般的に36文字で表現される。
    そのためかなり長い文字列になり、インデックスや検索性能に影響を与える場合がある。

  • 推測されにくい
    ランダムに生成されるため、外部からIDを推測することが非常に困難。
    人間が読みやすい形式ではないため、視認性は落ちるがセキュリティの安全性は高い。

両者の比較

特徴 自動インクリメント UUID
一意性 データベースの中のみ一意 全世界で一意
サイズ 32bitまたは64bit 128bit
推測性 高い 低い
用途 小規模システム, パフォーマンス重視 分散システム,セキュリティ重視のシステム
パフォーマンス 高速かつ効率的 インデックス効率が低いことがある
セキュリティ 低い 高い
データベースサイズ 小さい 大きい

使い分けは?

システムの要件や規模、用途によって選択をする必要があるが、以下をベースに判断する。

  • 小規模、シンプルな構成のアプリケーション→自動インクリメント(Integer型)
  • 分散システムや高いセキュリティを求める場合→UUID
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?