可能性のある複製:
主キーはどうですか?
GUIDを使用する利点と、データベースでPKとしてINTを使用する利点を知っています。 GUIDは本質的に128ビットINTであり、通常のINTは32ビットであると考えると、INTはスペースセーバーです(ただし、この点は通常、ほとんどの最新システムでは問題になりません)。
最後に、INTをPKとGUIDのどちらとして使用していると思いますか。
Kimberley Tripp(SQLSkills.com)は、GUIDを主キーとして使用することについて 記事 を持っています。不必要なオーバーヘッドがあるため、彼女はそれに対してアドバイスします。
複数のデータベースインスタンスを同期する必要がある場合の不適切な選択とは別に、INTには、言及したことのない欠点が1つあります。挿入は常にインデックスツリーの一方の端で発生します。これにより、移動の多いテーブルがある場合にロックの競合が増加します(GUIDがインデックス全体に挿入されるのに対して、同じインデックスページを同時挿入で変更する必要があるため)。 B *ツリーまたは同様のデータ構造が使用されている場合は、インデックスをより頻繁に再調整する必要がある場合もあります。
もちろん、手動でクエリを実行してレポートを作成する場合、intの方が簡単であり、FKの使用によりスペースの消費量が増える可能性があります。
どれだけうまく測定されているかを知りたいです。 SQL Serverは、実際にはIDENTITY PKを使用して挿入の多いテーブルを処理します。
あなたの質問に答えるために:結局のところ、あなたはINTをPK対GUIDとしてどのような状況で使用していると思いますか?
私はGUIDを使用します。私のシステムにオフラインバージョン内にデータを保存できるオンライン/オフラインバージョンがある場合、そのデータは同期中に1日サーバーに転送されます。 、データベース内で同じキーを2回持つことはありません。
iNTはスペースセーバーです(ただし、この点は、ほとんどの最新システムでは一般的に重要ではありません)。
そうではありません。一見するとそのように見えるかもしれませんが、各テーブルの主キーは、データベース全体でインデックス内で複数回繰り返され、他のテーブルでは外部キーとして繰り返されることに注意してください。そして、それはそのテーブルを含むほぼすべてのクエリに関与します-そしてそれが結合に使用される外部キーである場合は非常に集中的になります。
さらに、最近のCPUは非常に高速ですが、RAM=速度は維持されていません。そのため、キャッシュの動作はますます重要になっています。そして、適切なキャッシュ動作を実現する最良の方法は、データを小さくすることです。したがって、4バイトと16バイトの間の見たところ無関係な違いは、速度の顕著な違いをもたらす可能性があります。必ずしもそうであるとは限りませんが、考慮する必要があります。
非常に複雑なエンタープライズソフトウェアには、至る所にガイドがあります。スムーズに動作します。
GUIDは意味的に識別子として機能するのに適していると思います。また、その問題に直面するまで、パフォーマンスについて不必要に心配する意味はありません。時期尚早の最適化に注意してください。
あらゆる種類のデータベース移行には利点もあります。 GUIDを使用すると、衝突は発生しません。 IDにIDが使用されている複数のDBをマージしようとする場合、それらの値を置き換える必要があります。これらの古い値がURLで使用されていた場合、SEOヒット後に異なる値になります。
主キーと外部キーの関係などの値を比較する場合、INTはより高速になります。テーブルに適切なインデックスが付けられていて、テーブルが小さい場合は、速度が低下することはあまりないかもしれませんが、確認する必要があります。 INTも読みやすく、他の人とコミュニケーションがとれます。 「レコード1234を見ることができますか?」と言う方がずっと簡単です。 「レコード031E9502-E283-4F87-9049-CE0E5C76B658を見ることができますか?」の代わりに
一部のOSでは、固有のハードウェア機能(CPUID、MAC)に基づいてGUIDを生成しなくなりました。これにより、ユーザーの追跡が容易になります(プライバシーの懸念)。つまり、GUID一意性は、多くの人が考えるほど普遍的ではなくなっていることがよくあります。
データベースのauto-id関数を使用する場合、データベースは理論的には重複がないことを確実に確認できます。
データが単一のデータベースに存在する場合(一般に作成するアプリケーションのほとんどのデータと同様)、IDENTITY
を使用します。使い方は簡単で、クラスター化インデックスを断片化せず、十分以上です。 20億の一部のレコード(負の値を使用する場合は約40億)で領域が不足しますが、1つのテーブルにその数のレコードがあり、データウェアハウジングの問題がある場合は、とにかく乾杯します。
データが複数の独立したデータベースに存在する場合、またはサードパーティのサービスとインターフェースする場合は、すでに生成されている可能性が高いGUID
を使用します。 Active Directoryのユーザープロファイルに、Active Directoryが割り当てたobjectGUID
を介してアプリケーションのユーザープロファイルにマッピングするデータベースのUserProfilesテーブルが良い例です。
ある段階でデータベースをマージすることを計画している場合、つまり、マルチサイトレプリケーションタイプのセットアップの場合、Guidを使用すると多くの苦痛を軽減できます。しかし、それ以外はIntの方が簡単だと思います。
PKは可能な限り数値である必要があります。 GUIDをPKとして持つことを忘れないでください。GUIDは他のテーブルでも外部キーとして使用されるため、ページングやインデックスなどが大きくなります。
データベースも重要だと思います。 MySQLの観点から-一般に、データ型が小さいほど、パフォーマンスは速くなります。
Int vs GUID too- http://kccoder.com/mysql/uuid-vs-int-insert-performance/ にも当てはまるようです
私はGUIDをこのキーが同様の値にバインドされている場合にのみPKとして使用します。たとえば、ユーザーID(WinNTのユーザーはGUIDで説明されます)、またはユーザーグループID。別の1つの例。ドキュメント管理のための分散システムを開発し、世界中のさまざまな場所にあるシステムのさまざまな部分でいくつかのドキュメントを作成できます。そのような場合、分散システムのさまざまな部分で作成された2つのドキュメントが同じIDを持たないことが保証されるため、GUIDを使用します。 。
INTは確かにデバッグ時に読みやすく、はるかに小さいです。
ただし、GUIDまたは同様の製品のライセンスキーとして使用します。一意であることがわかっており、順次ではないことがわかっています。