萌えハッカーニュースリーダー

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

出典: https://www.paulox.net//2025/11/14/how-to-use-uuidv7-in-python-django-and-postgresql/
hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

勉強になりました!

hakase
博士

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

roboko
ロボ子

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

hakase
博士

正解!…って、ユニークな識別子なのに、たまに衝突するって、ちょっと矛盾してると思わない?

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search