9

近年、私は MSSQL データベースを使用していましたが、テーブル内のすべての一意のレコードの ID 列の型は bigint (long) です。これは自動インクリメントであり、通常は正常に動作します。

現在、人々がレコードの ID に GUID を使用することを好むことを観察しています。

一意のレコード ID のために bigint を guid に交換することは理にかなっていますか?

bigintの生成とソートは常にguidよりも高速であるため、意味がないと思いますが...アプリケーションとデータベースの2つ(またはそれ以上)に分離されたインスタンスを使用して同期を保つと、いくつかの問題が発生するため、 SQL サーバー間で ID プールを管理する必要があります (たとえば、sql1 は 100 から 200 までの ID を使用し、sql2 は 201 から 300 までの ID を使用します) - これは薄い氷です。guid id を使用すると、id プールは気にしません。

私のミラー化されたアプリケーション (およびデータベース) に対するアドバイスは何ですか? 従来の ID を使用するか、GUID に移行するか?

お返事ありがとうございます!

4

5 に答える 5

8

ガイドには

利点:

  • 衝突を心配することなく、データベースからオフラインで作成できること。
  • あなたはそれらを使い果たすことはありません

短所:

  • 順次挿入のパフォーマンスが低下する可能性があります (特にクラスター化インデックスの場合)。
  • 行ごとにより多くのスペースを取る
  • きれいに作成するのは安くはありません
    • しかし、クライアントがそれらを生成している場合、これは実際には問題ありません

誰かが手動で GUID を提供し、偶発的または故意に一意性に違反することを止めるものは何もないため、列には一意の制約 (PK として、または他の関係の一部である場合は別の制約として) が必要です。

スペースが気にならなければ、パフォーマンスに大きな影響がなければ、多くの問題が解消されます。この決定は、必然的にアプリケーションの個々のニーズに固有のものになります。

于 2009-02-15T23:06:08.050 に答える
3

レプリケーションまたはクライアント側の ID 生成を含むシナリオでは、GUID を使用します。どちらの状況でも、GUID を使用して ID を管理する方がはるかに簡単です。

データベースと直接通信する Web アプリケーションのような 2 層のシナリオ、またはレプリケートする必要のないサーバー (または、一方向の pub/sub スタイルでのみレプリケートする必要がある) の場合、自動インクリメント ID 列を考えます。大丈夫です。

autoincs にとどまるか、GUID に移行するかについては、これらすべての決定を前もって行うことができるグリーン フィールド アプリケーションで GUID を推奨することは 1 つの方法です。誰かに既存のデータベースを移行するようにアドバイスするのは別の話です。価値以上の痛みかもしれません。

于 2009-02-15T23:03:05.047 に答える
2

ページ分割が発生した場合、GUID にはパフォーマンスと同時実行性の問題があります。INT は 100% でページ フィルを実行できます。一方の端にのみ追加され、GUIDS はどこにでも追加されるため、おそらくより低いフィルを実行する必要があります。これにより、インデックス全体のスペースが無駄になります。

アプリケーションで GUIDS を割り当てることができるため、アプリケーションは、作成されるレコードの ID を知ることができます。これは便利です。ただし、技術的には、重複する GUID が生成される可能性があります (可能性は高いですが、少なくとも GUID 列に一意のインデックスを配置します)。

データベースのマージが簡単になることに同意します。しかし、私にとっては、まっすぐな INT の方が優れており、実際に必要な場合に DB をマージする方法を整理する手間がかかります。

于 2009-02-15T23:03:08.697 に答える
1

データが頻繁に移動する場合、テーブルのキーには GUID が最適です。パフォーマンスを本当に気にするなら、int または bigint に固執してください

上記の両方を活用したい場合は、テーブルのキーとして int または bigint を使用し、各行に rowguid 列を設定して、整合性を失うことなくデータを簡単に移動できるようにします。

于 2009-02-15T23:03:18.120 に答える
0

ID がクエリ文字列に表示される場合は Guid を使用し、それ以外の場合は原則として long を使用します。

于 2009-02-15T23:58:29.267 に答える