1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

データベースの裏ボス?!サロゲートIDって、実はキミのことだったんだね!

Posted at

一度執筆した内容をGeminiで「ゆるい」文体でリライトしてもらいました!


みんな、元気〜? データベースと格闘してるそこのあなた、ちょっと聞いてくださいな。

今日はね、データベースのテーブルでひっそり頑張ってる、とあるナイスなヤツのお話だよ。その名も「サロゲートID」!

なんだか難しそうな名前だけど、実はみんなが普段「主キー」って呼んでる、あの「ID」の親戚みたいなもんなんです。いや、親戚どころか、もはや本人だったりするんだけど…?(笑)


サロゲートIDって、誰?何者?

まずね、サロゲートIDってなんやねん?って話からいきましょうか。

サロゲートIDってのはね、データベースのテーブルで「このデータはこれ!」ってピシッと決めるために使う、「人間が考えたわけじゃないID」のこと。

え?どういうこと?って思うよね。もっとざっくり言うと、システムが勝手に「はい、あんたにはこの番号ね!」って振ってくれるIDのことなんです。

特徴をあげるとね:

  • システムがテキトーに生成しちゃう: 「1, 2, 3...」って連番だったり、なんかよくわからん暗号みたいな文字列だったりするよ。
  • ビジネスにはまったく関係ない: 社員番号とか、メールアドレスみたいに「これってこういう意味があるんだよ!」みたいなのは一切なし。ただの識別子。
  • 中身が変わってもIDは変わらない: たとえば、あなたの名前が変わっても、あなたの学生時代の出席番号は変わらないでしょ?そんな感じ。
  • 絶対にダブらない保証付き: 同じIDのデータは世界に一つだけ!って決まってるんだ。

これだけだと、「ふーん?」って感じかな?じゃあ、普段みんなが使ってる「自然キー」と比べてみよう。

  • 自然キー: こっちはね、実際のデータそのものがIDになっちゃうパターン。「ECサイトの商品コード」とか、「みんなのメールアドレス」とかがこれだね。これらは「これを見ればどのデータか分かる!」っていう意味がある。
  • サロゲートID: それに対してサロゲートIDは、システムさんが「管理しやすいように付けとこ!」って感じで勝手に作っちゃう、意味なしIDってわけ。

なんでサロゲートIDを使うの?なんか良いことあるの?

実はね、サロゲートIDって地味だけど超優秀なんです!

  • データの中身が変わってもIDはノータッチ: 例えば、ユーザーのメールアドレスが変わっちゃうと、そのメールアドレスを参照してる他のデータも全部直しに行かなきゃいけないんだけど、サロゲートIDならそんな手間はなし!平和〜。
  • 関連データとの紐付けが安定する: 上の理由と一緒なんだけど、他のテーブルからIDを参照するときも「このID、変わっちゃわないかな…?」って心配する必要がないから、安心して紐付けられるんだ。
  • 処理が爆速になることも!: 特に数字のサロゲートIDは、データベースの中での比較とか結合が「え、もう終わったの!?」ってくらい速いことがあるよ。
  • めんどくさい複合キーとはおさらば!: いくつものカラムを組み合わせてIDにする「複合キー」って、なんかごちゃごちゃして分かりにくいよね?サロゲートIDなら、IDが一個で済むからスッキリ!

デメリットもあるよ、人間だもの(?)

もちろん、サロゲートIDも完璧じゃない。ちょっとだけ残念ポイントもあるんだ。

  • ちょっとだけ場所を取る: IDを保存するためのスペースが、ほんの少しだけど必要になっちゃう。
  • ID見ても何のデータか不明: IDの数字や文字列だけ見ても、「これって何のデータだっけ?」ってなっちゃうんだよね。
  • たまに重複データに気づきにくいことも: たとえば、うっかり同じ人を2回登録しちゃっても、サロゲートIDは別々に振られちゃうから、IDだけ見てると「あれ?同じ人だ!」って気づきにくいことがあるんだ。

「いつものあのID」って、まさかのサロゲートIDだったの!?

さあ、ここが今日のハイライトですよ、奥さん!

みんながデータベース設計とかで「主キー」って言われて、「あー、あの『1から始まる連番のやつね!』」って思い浮かべる、あの「AUTO_INCREMENT」とか「SERIAL」とかって呼ばれてるやつ、あるでしょ?

あれとサロゲートIDって、どう違うと思う?

実は…

みんなが「いつものID」って呼んでる連番のIDは、サロゲートIDの中でも一番メジャーな存在なんだ!

そうなんです!普段何気なく使ってる「1, 2, 3...」って増えていくIDは、バリバリのサロゲートIDだったんですよ、旦那!

サロゲートIDにもね、いくつか種類があるんだ。代表的なのはこの2つ!

1. いつものインクリメントID(一番よく見るやつ)

# SQLAlchemyで書くとこんな感じ
from sqlalchemy import Column, Integer
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True, autoincrement=True)  # そうそう、この1, 2, 3...ってやつ!
    # あとは好きなカラムを追加してね

特徴:

  • とにかく「1, 2, 3, 4...」って感じで、次に何が来るか丸わかり。
  • 一番シンプルで、データベースもサクサク動いてくれることが多いよ。
  • あんまり場所も取らない、良い子ちゃん。

2. UUID(なんかめっちゃ長いID)

# SQLAlchemyで書くとこんな感じ
import uuid
from sqlalchemy import Column
from sqlalchemy.dialects.postgresql import UUID

class User(Base):
    __tablename__ = 'users'
    id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
    # あとは好きなカラムを追加してね

特徴:

  • Universally Unique IDentifier」の略で、日本語にすると「宇宙規模で唯一無二のID」みたいな感じ?とにかく、世界中どこを探しても同じIDは存在しないぜ!ってくらい唯一無二。
  • 次に何が来るかなんて、神様にも予測不能。
  • あっちこっちにデータが散らばってても、しっかりIDを振りたいときに便利なんだ。
  • いつものIDより、ちょっとだけ場所を取っちゃう(長いからね!)。

どっちのIDと付き合う?使い分けのヒント!

さあ、インクリメントIDにするか、UUIDにするか、悩むところだよね。どっちを選ぶかは、キミのシステム次第だよ!

項目 インクリメントID UUID
次がわかるか わかる まったくわからん
処理の速さ 超速い まあまあ速い
場所の消費 ちょびっとだけ そこそこ使う
あっちこっちのシステムと連携 苦手 得意
セキュリティ(IDがバレやすいか) バレやすい バレにくい

インクリメントIDがおすすめの場合

  • データベースが一個しかないとき: サーバーが複数ないシンプルなシステムなら、これで十分!
  • とにかく速さが命!: 少しでも処理を早くしたいなら、こっちが有利だよ。
  • シンプルなシステム: 複雑なことをしないなら、一番楽ちん。
  • IDが連番でも困らないとき: IDの並びが外部に知られても大丈夫ならね。

UUIDがおすすめの場合

  • システムが色んなところに散らばってる!: たとえば、いろんな国のサーバーにデータが分散してる、みたいな場合はUUIDが超便利。
  • データベースをコピーしまくりたいとき: 複製してもIDがかぶらないから安心!
  • 秘密は守りたい!: IDが外部に公開される可能性があって、推測されにくい方がいいならこれだね。
  • 外部にIDを見せるとき: APIとかで他のサービスとIDをやり取りするなら、唯一無二のUUIDがかっこいいし安心。

具体的な使い分けの例

  • 社内用のログ記録: とにかくバンバン記録したいし、速さも欲しいから、インクリメントIDがピッタリ!
    class InternalLog(Base):
        id = Column(Integer, primary_key=True, autoincrement=True)
    
  • みんなに見せるユーザーID: 外部の人が見る可能性もあるし、システムも大きくなりそうだから、UUIDでクールに決めちゃおう!
    class PublicUser(Base):
        id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
    
  • 商品コードとか、もともと決まってるやつ: すでに会社で使ってる商品コードみたいに「これがIDね!」って決まってるなら、わざわざ新しいIDを作らずに、そのままそれを使っちゃうのもアリだよ(これが「自然キー」ってやつね!)。
    class Product(Base):
        product_code = Column(String(20), primary_key=True)  # もともとあるやつをそのまま使う!
    

結局、サロゲートIDって最高かよ!

どうだったかな?サロゲートIDって、最初は「なんじゃそりゃ?」って感じだったかもしれないけど、実はデータベースの縁の下の力持ちで、みんながよく使うあのインクリメントIDも、このサロゲートIDの仲間だったってことがわかってもらえたかな?

自分の作るシステムに合ったIDをうまく選んで、最強のデータベースを作っちゃおうぜ!

んじゃ、またね〜!

1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?