エンターテイメント!!

遊戯王好きのJavaエンジニアのブログ。バーニングソウルを会得する特訓中。

【翻訳+意訳・要約】SQLデータベースの主キーにUUIDを使ってはいけない理由

※本記事は、Bardによる意訳+翻訳を活用し、レイアウト調整したものです。
※感想は、オリジナルです。

原文

Why you should never use an UUID as the primary key in SQL Databases - DEV Community

意訳+要約

SQLデータベースの主キーにUUIDを使ってはいけない理由

この記事は、SQLデータベースでUUIDをプライマリキーとして使用することの利点と欠点について論じています。UUIDはユニークな識別子であるため、プライマリキーとして適しているように思われるかもしれませんが、実際にはいくつかの問題があります。

重要な点は次のとおりです。

  • UUIDは32ビットの整数を必要とする一般的な主キーよりもはるかに大きいため、ストレージとパフォーマンスに悪影響を及ぼす可能性があります。
  • UUIDは人間にとって読みやすいものではないため、デバッグやデータベースの検査が難しくなります。
  • UUIDは順序付けられていないため、特定の種類のクエリ、特に範囲検索に関わるクエリのパフォーマンスに悪影響を及ぼす可能性があります。

結論として、UUIDはユニークな識別子であるため魅力的ですが、SQLデータベースのプライマリキーとしては最適ではありません。パフォーマンス、読みやすさ、デバッグ容易さ、ストレージコスト、アプリケーション複雑さなどの問題があるため、他の選択肢を検討することをお勧めします。

具体的には、次の代替手段を検討できます。

  • 整数または文字列のシーケンス
  • データベースのバージョン番号
  • データベースの作成日時
  • データベースの作成者

これらの代替手段は、UUIDの欠点を回避しながら、ユニークな識別子を提供します。

Bardさんに聞いてみた

Q:問題と言われている箇所が、適用されない場合は、主キーに使ってもいいという理解でいいでしょうか?

はい、そのとおりです。問題と言われている箇所は、次のとおりです。

  • ストレージとパフォーマンスへの影響
  • デバッグやデータベースの検査の難しさ
  • 特定の種類のクエリのパフォーマンスへの影響

これらの問題が適用されない場合は、UUIDを主キーとして使用しても問題ありません。

たとえば、以下の状況では、UUIDを主キーとして使用しても問題ないと考えられます。

  • データベースのサイズが小さく、ストレージやパフォーマンスが重要な問題ではない
  • データベースの構造がシンプルで、デバッグやデータベースの検査が容易である
  • 範囲検索などの特定の種類のクエリが使用されない

ただし、これらの問題が適用される可能性がある場合は、UUIDを主キーとして使用することは避けるべきです。

具体的には、以下の状況では、UUIDを主キーとして使用しないことをお勧めします。

  • データベースのサイズが大きく、ストレージやパフォーマンスが重要な問題である
  • データベースの構造が複雑で、デバッグやデータベースの検査が困難である
  • 範囲検索などの特定の種類のクエリが頻繁に使用される

このように、UUIDを主キーとして使用するかどうかは、アプリケーションの具体的な状況に応じて判断する必要があります。

感想+雑記

元記事だと、結構強い口調で否定していたが、場合によりけりでは?って思う。
強い口調を使ったせいで、結構コメントで反論されてた。。。

あとは、読んでて気になったのは、UUIDは重複する可能性があるからダメだというもの。
それは、UUID使わなくても重複するのでは?って思ったが、反論に反論してきた人の中では違うらしい。確立からいうと、ほぼほぼ0に近いが。
コメント欄がかなりヒートアップしてた。

ソフトウェアの設計次第だな。
個人的には、使ってもいいと思う。
実際、個人開発で、UUIDを主キーにしてるからな。
デバックがやりにくいということも無いので、あんまり使っちゃダメっていう認識はないな。