web-dev-qa-db-ja.com

UUIDまたはGUIDを主キーとして使用することの欠点は何ですか?

分散システムを構築したい。データベースにデータを保存する必要があります [〜#〜] uuid [〜#〜] または [〜#〜] guid [〜#〜]を使用すると便利です 一部のテーブルの主キーとして。 UUID/GUIDは非常に大きく、ランダムであるので、この設計の欠点だと思います。代替方法は、自動インクリメントされたINTまたはLONG​​を使用することです。

テーブルの主キーとしてUUIDまたはGUIDを使用する場合の欠点は何ですか?

おそらく、DBMSとしてDerby/JavaDB(クライアント上)とPostgreSQL(サーバー上)を使用します。

62
Jonas

それはあなたの生成関数とファイナルテーブルのサイズに依存します

GUIDは、グローバルに一意な識別子になることを目的としています。 Postgres 8.3ドキュメント で説明されているように、これらの識別子を生成するのに普遍的に適切な方法論はありませんが、postgreSQLにはいくつかの有用な候補が同梱されています。

あなたの問題の範囲から、そしてoffline書き込みの必要性から、GUID以外のものの使用をかなりきちんと囲んでいるので、他のものの代償的な利点はありませんスキーム。

機能の観点から見ると、キーの長さは、読み取りの数とテーブルのサイズに応じて、どの種類の最新システムでも問題にはなりません。別の方法として、オフラインクライアントは、主レコードなしで新しいレコードをバッチ処理し、再接続時にそれらを単に挿入することができます。 postgreSQLは「シリアル」データ型を提供するため、クライアントがデータベースへの単純な書き込みを実行できる場合は、IDを決定する必要はありません。

29

もう1つのアドバイス-クラスタ化インデックスの一部としてGUIDを使用しないでください。 GUIDは連続的ではないため、クラスター化インデックスの一部である場合、新しいレコードを挿入するたびに、データベースはすべてのメモリページを再配置して、挿入する適切な場所を見つける必要があります(int(bigint)自動インクリメントの場合)最後のページになります。

ここで、いくつかのdbの実現を見てみましょう。1。)MySQL-動作を変更するオプションのない主キーがクラスター化されています-推奨事項は、ここでGUIDをまったく使用しないことです。2)Postgres、MS-SQL-GUIDはクラスター化されていない主キーとして使用し、別のフィールドをクラスター化インデックスとして使用します(例:autoincrement int)。

22
Ross Ivantsiv

場合によります。

真剣に、あなたがこれまでに与えたすべてで、これはあなたができる限り遠くにあります。

UUIDを使用すると便利なのはなぜですか?なぜINTを使用しないのですか?なぜ、後でUUIDだけでインデックスを作成できないのですか? UUIDのキーでソートされたリストを作成し、数百万行の後にランダム(非順次)UUIDを挿入することの意味を理解していますか?

これはどのプラットフォームで動作しますか?何枚のディスク?ユーザー数は?レコードはいくつありますか?

3
jcolebrand