2009-05-22 23 views
4

可能性の重複:
Advantages and disadvantages of GUID/UUID database keysGUIDを主キーとしていつ使用しますか?

SQL Server 2005/8 DBの主キーとしてGUIDを使用することが不可欠であるどのような状況があります。たとえば、MS Sync Frameworkを使用すると、これが強制的に実行されるのか、データの複製が行われますか?

+0

申し訳ありません、これはhttp://stackoverflow.com/questions/45399/advantages-and-disadvantages-of-guid-uuid-dataの複製ですベースキー。 今すぐ閉じましょう! –

答えて

16

レプリケーションによって複数のデータベースを同期させる必要がある場合は、キーとしてGUIDを使用します。

GUIDを使用するもう1つの理由は、あなたがこれを行う場合は

私は強くお勧めしますが、WinFormsのアプリケーション例えば、いくつかのリモートクライアント上の行を作成し、Webサービスなどを介してサーバにそれらを提出したい場合であるあなたのこと一意ではない自動インクリメントintに基づいて独自のクラスタード・インデックスを指定するようにしてください。これは、クラスタ化されたインデックスがGUIDであるテーブルに行を挿入するかなりのオーバーヘッドになります。

アップデート:ここでは、このようなテーブルを設定する方法の例です:

CREATE TABLE [dbo].[myTable](
[intId] [int] IDENTITY(1,1) NOT NULL, 
[realGuidId] [uniqueidentifier] NOT NULL, 
[someData] [varchar](50) NULL, 
    CONSTRAINT [PK_myTable] UNIQUE NONCLUSTERED 
    (
    [realGuidId] ASC 
    ) 
) 

CREATE CLUSTERED INDEX [IX_myTable] ON [dbo].[myTable] 
(
[intId] ASC 
) 

あなたは、通常の例として表に挿入します:

INSERT INTO myTable VALUES(NEWID(), 'Some useful data goes here') 

更新:私は耳を傾けこれについて話している、本当に良いdotnetrocksのエピソードは、聞く価値がある - Show #447

+0

私はPKを分散/レプリケーションのためのGUID(必要なもの)として残しますが、(レプリケーション後に)複数の同一のエントリが含まれている新しい一意でないクラスタードインデックスを導入します。このインデックスを、PKではなく挿入するときにSQL Serverに使用させるにはどうすればよいですか、それとも自動ですか? –

+1

+1は別のクラスタ化インデックスです。 GUIDをクラスタード・インデックスとして使用してはいけません。パフォーマンスはあまり変わりません。 –

+0

ちょうどコメントでは、クラスタードインデックスに使用できるGUIDを順次増加させる新しいnewsequentialid()関数(Sql Serverを前提とする)を使用できます。ランダムな場所でデータが異なるハードドライブに書き込まれるようなパーティションを使用すると、ランダムに分散したデータ(newid()のクラスタードインデックス)がパフォーマンスを向上させる可能性があります。 – sisve

2

データベースが集中化されていない場合や、コレクションの一部がリモートで実行されている場合。

3

分散データベースを持つアプリケーションを構築するときに複合主キーを必要とせず、すべての分散データベースのデータと同期する1つの中央データベースを持つため、GUIDを主キーとして使用しています。 GUIDを使用すると、すべてのDBから中央のデータにデータをプルする際に競合(制約違反)は発生しません(ほぼ*)。

* 2つの異なる場所で同じGUIDを生成することはほとんどありませんが、不可能ではありません。

+1

GUIDの衝突の危険性は、私が取るつもりである;) –

+0

はい私を間違って取得しないでください。この事態の発生確率は0ではありませんが、GUIDはその種の使用に非常に適しています。 :-) – Petros

+0

GUIDをSQL ServerのCLUSTEREDインデックスとして使用していないことを確認してください。このように恐ろしいことです。 INT(IDENTITY)などを使用してください。これははるかに優れています。 –