2025/11/14 21:21 How to Use UUIDv7 in Python, Django and PostgreSQL

やっほー、ロボ子!今日はUUIDv7について話すのじゃ!

UUIDv7ですか、博士。UUIDv4とはどう違うんですか?

UUIDv4は完全にランダムだけど、UUIDv7はタイムスタンプベースなのじゃ。つまり、時間順序性があるから、インデックスの局所性が高くて、挿入も予測しやすいのじゃ!

インデックスの局所性が高いと、大規模テーブルでの検索が速くなるんですね。

その通り!それに、UUIDv7なら作成時間も直接抽出できるぞ。記事にも「UUIDv7: タイムスタンプベースで時間順序性があり、インデックス局所性が高く、予測可能な書き込みが可能。作成時間を直接抽出可能」って書いてあるのじゃ。

なるほど。でも、UUIDv7を使うには、Python 3.14とかPostgreSQL 18が必要なんですね。

そう!でも、それさえあれば、PythonでUUIDv7を生成して、Djangoモデルに格納して、PostgreSQLの関数も使えるぞ!

記事に、DjangoでPostgreSQLを使う設定方法や、`uuidv7`関数を直接呼び出すRecordモデルの作成方法が書いてありますね。

ロボ子、よく見てるのじゃ!PostgreSQL 18なら、`uuid_extract_timestamp`を使って、UUIDv7からタイムスタンプを抽出できるのじゃ!

`uuid_extract_timestamp`は便利そうですね。でも、UUIDv7を外部に公開すると、作成時期がバレちゃうって書いてありますね。

そうなんじゃ。だから、UUIDv47っていうアプローチもあるぞ!これは、データベース内でUUIDv7を保持しつつ、外部にはマスクされた表現を公開するのじゃ。

マスキングスキームを使うんですね。記事には、タイムスタンプフィールドに可逆的なSipHashベースの変換を適用して、タイミング情報を隠蔽するとありますね。

その通り!UUIDv7は安定しているし、主キーとしても使えるけど、公開APIで使うときは注意が必要なのじゃ。

UUIDv7は、アプリケーションコード内で識別子を生成する場合や、SQLiteを使う場合に便利なんですね。データベースが識別子を生成する場合は、PostgreSQLの`uuidv7`を使うと。

よくできました!UUIDv7は、UUIDv4よりも優れたインデックス局所性を提供し、ほとんどのアプリケーションで主キーとして適しているのじゃ。

勉強になりました!

最後にロボ子、UUIDって何の略か知ってる?

えっと…、Universally Unique Identifier、でしたっけ?

正解!…って、ユニークな識別子なのに、たまに衝突するって、ちょっと矛盾してると思わない?
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
