私は過去に多くのデータベース システムに取り組んできましたが、すべてのデータベース キーがGUID / UUID値であれば、データベース間でエントリを移動するのはずっと簡単でした。私は何度かこの道をたどることを検討しましたが、特にパフォーマンスや電話で読み上げられない URL に関しては、常に多少の不確実性があります。
データベースで GUID を広範囲に使用したことのある人はいますか? そのようにすることで、どのような利点が得られますか? また、起こりうる落とし穴は何ですか?
私は過去に多くのデータベース システムに取り組んできましたが、すべてのデータベース キーがGUID / UUID値であれば、データベース間でエントリを移動するのはずっと簡単でした。私は何度かこの道をたどることを検討しましたが、特にパフォーマンスや電話で読み上げられない URL に関しては、常に多少の不確実性があります。
データベースで GUID を広範囲に使用したことのある人はいますか? そのようにすることで、どのような利点が得られますか? また、起こりうる落とし穴は何ですか?
利点:
短所:
個人的には、まともなサイズのシステムのほとんどの PK にそれらを使用していますが、あちこちに複製されたシステムで「訓練」されたので、それらを持たなければなりませんでした。YMMV。
重複データはゴミだと思います-どのようにしても重複データを取得できます。代理キーは、私がこれまで働いてきた場所では通常、眉をひそめています。ただし、WordPress のようなシステムを使用しています。
更新: したがって、これは多くの場合 +1 されるので、GUID PK の大きな欠点であるクラスター化インデックスを指摘する必要があると考えました。
多数のレコードがあり、GUID にクラスター化されたインデックスがある場合、アイテムのリストのランダムな場所に挿入されるため (これがポイントです)、挿入のパフォーマンスは低下します (これは迅速です)。
したがって、挿入のパフォーマンスが必要な場合は、auto-inc INT を使用し、GUID を他の人と共有したい (つまり、URL でユーザーに表示する) 場合は、GUID を生成します。
なぜ誰もパフォーマンスについて言及しないのですか?複数の参加がある場合、すべてこれらの厄介なGUIDに基づいて、パフォーマンスがフロアを通過します:(
主な利点は、データベースに接続せずに一意の ID を作成できることです。また、ID はグローバルに一意であるため、異なるデータベースのデータを簡単に組み合わせることができます。これらは小さな利点のように思えますが、過去に多くの作業を節約してきました。
主な欠点は、もう少し多くのストレージが必要であること (最新のシステムでは問題ではありません) と、ID が実際には人間が判読できないことです。これは、デバッグ時に問題になる可能性があります。
インデックスの断片化など、パフォーマンスの問題がいくつかあります。しかし、それらは簡単に解決できます (jimmy nillson による櫛ガイド: http://www.informit.com/articles/article.aspx?p=25862 )
編集は、この質問に対する私の2つの回答をマージしました
@Matt Sheppard 彼は、主キーとして異なる GUID を持つ行を複製できることを意味していると思います。これは、GUID だけでなく、あらゆる種類の代理キーの問題です。そして、彼が言ったように、意味のある一意の制約を非キー列に追加することで簡単に解決できます。別の方法は自然キーを使用することであり、それらには実際の問題があります..
@マットシェパード:
顧客のテーブルがあるとします。確かに、顧客がテーブルに複数存在することは望ましくありません。そうしないと、販売部門と物流部門全体で多くの混乱が発生します (特に、顧客に関する複数の行に異なる情報が含まれている場合)。
したがって、顧客を一意に識別する顧客識別子があり、顧客と顧客サービス担当者が通信する必要がある場合に備えて、その識別子が (請求書で) 顧客に知られていることを確認します。顧客レコードが重複しないことを保証するには、顧客 ID の主キーまたは顧客 ID 列の NOT NULL + UNIQUE 制約を使用して、一意性制約をテーブルに追加します。
次に、何らかの理由 (私には思いつきません) で、顧客テーブルに GUID 列を追加し、それを主キーにするよう求められます。GUID が常に一意であるため、顧客 ID 列が一意性の保証なしで残されている場合、組織全体で将来の問題が発生する可能性があります。
一部の「アーキテクト」は、「ああ、しかし、実際の顧客の一意性制約はアプリ層で処理しています!」と言うかもしれません。右。その汎用プログラミング言語と (特に) 中間層フレームワークに関するファッションは常に変化しており、通常、データベースが存続することはありません。また、ある時点で、現在のアプリケーションを介さずにデータベースにアクセスする必要が生じる可能性が非常に高くなります。==トラブル。(しかし、幸いなことに、あなたと「アーキテクト」は長い間いなくなっているので、混乱を一掃するためにそこにいることはありません。) 言い換えれば、データベース内 (および他の層でも同様に、明らかな制約を維持してください。時間)。
言い換えれば、テーブルに GUID 列を追加する正当な理由があるかもしれませんが、実際の(==非 GUID) 情報内での一貫性に対する野心を下げる誘惑に陥らないでください。
GUID が "uniqifiers" として使用され、重複したデータがテーブルに取り込まれると、将来、多くの問題が発生する可能性があります。GUID を使用する場合は、他の列で UNIQUE 制約を引き続き維持することを検討してください。
その列をクラスター化インデックスとしても使用している場合に、GUIDSを主キーとして使用する際に考慮すべきもう1つの小さな問題(比較的一般的な方法)。GUIDの性質上、挿入はヒットしません。これは、GUIDがシーケンシャルで開始されないため、挿入時にページ分割などになります。システムのIOが高くなるかどうかを検討するだけです...
主キーとしての GUID のコスト(SQL Server 2000)
神話、GUID と自動インクリメント(MySQL 5)
これは本当にあなたが望むものです。
UUIDの長所
GUID 短所
利点: