一度執筆した内容を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をうまく選んで、最強のデータベースを作っちゃおうぜ!
んじゃ、またね〜!