2011-07-18 13 views
0

大部分のテーブルにint主キー(自動インクリメント)がある既存のデータベースがあります。私たちは今で接続し、同期データ(アップロード/ダウンロードデータ)の主キーを持つInt主キーとGUIDの自動インクリメントの列

が自動インクリメントされることに、他のクライアントを中央ストアとして、このDBを使用してできるようにする必要のある位置に今ある

キー私は主キーの衝突の問題があることを知っている。

私は、GUIDなどのグローバルテーブルを同期テーブルに追加できると考えていました。その後、

と、このGUIDを検索する論理カスタムシンクを作成/クライアント

を比較すると、右のアイデアのように、この音をしていますか?中央データベースでほとんど変更できない(プライマリキーが変更されない)同期フレームワークを実装するためのその他の提案

+0

一般に、自動インクリメントキーは衝突しません。実際、(SQLのほとんどの定義に 'Unique'という制約が含まれているので)どうすればそれが起こるのかよく分かりません。ただし、重複したキーのエラーが発生する可能性があります。なぜ、外部ベンダーにあなたの内部鍵が何であるかを指示させるのですか?完成したレコードを受け取り、自分でキーを生成します。キーが不足している場合は、列のサイズを長くしてください。あなたは新しいGUID列を生成することができますが、とにかくGUIDをまだ生成している可能性が高いので、違いは何ですか? –

+0

それは、データのサブセットのコピーとレコードを追加する機能を備えたモバイルデバイスなどの接続されていない環境にあるためです。レコードを追加または更新する場合は、レコードを照合する手段が必要です。マッチングと同期のプロセスにGUIDを使用することを考える理由 – TheTiger

+0

私はまだどこかで一致したプロセスを必要としていますが、「彼らからの完了したレコードを受け入れてください」というところを見ます。つまり、クライアントにレコードの何かを返す必要があります。私は1,000人の潜在的なクライアントがすべて自分のサブセットに挿入し、中央のDBにサイクリングしています(同時に中央データベースにも直接挿入が行われています) – TheTiger

答えて

-1

一般に、自動インクリメントキーは衝突しません。実際、SQLのほとんどの定義には一意の制約が含まれているため、どうすればそれを実現するのかはわかりません。ただし、duplicate keyのエラーが発生する可能性があります。なぜ、外部ベンダーにあなたの内部鍵が何であるかを指示させるのですか?完成したレコードを受け取り、自分でキーを生成します。キーが不足している場合は、列のサイズを長くしてください。あなたは新しいGUID列を生成することができますが、とにかくGUIDをまだ生成している可能性が高いので、違いは何ですか?

多くの場合、データベース内のほとんどのテーブルには、複数の「固有の」キーがあります。これらは「固有の」キーです。これは、固有のデータセットを構成する実際の列です。残念ながら、これはテーブルの全幅になる可能性があります(そのため、idカラムが使用されます)。また、奇妙なユースケースがある場合を除いて、サーバーにクライアントIDを知らせないでください。クライアントにサーバーIDを知らせ、クライアント上の別の列に(必要に応じて)追跡してください。次に、アップロード前に使用する独自の内部IDを持つことができます。これは、返すキーとは無関係で、サーバーとは決して共有しません。

サーバIDが何であるかは重要ではありませんが(intベースまたはGUID)、お持ちであれば何でもお勧めします。クライアントがサーバーを置く行を与えるたびに、生成されたIDをサーバーに戻します。これにより、クライアントはすでに使用中のIDと関連する問題を挿入しようとしません(他のデバイスによって生成されてはならないIDをどのように知っていますか)。私は、クライアントがサーバー上の内部IDを決定するために取得しないと言うでしょう


EDIT:

複製にいくつかの簡単な研究に照らして(HLGEMに応答して)、そして元の質問を再読み込み。私は当初、クライアントが内部プライマリキー(これはまだ悪い)を指定させ、そして/またはintプライマリキーをGUIDに置き換えることについて質問しました。あなたの正確なニーズはそれを必要としないかもしれませんが、クライアントが実装できる余分なGUID列を追加すると動作します。いくつかの推奨事項:
1)ビジネス例外ではなく、システムの例外として、GUID列で一意の違反(偶然または悪意のある)を処理します。おそらく、クライアントにGUIDを再生成して(黙って)再送信するように指示することをお勧めします。 2)クライアントは決してで、データベースのacutal主キー列の値を指示します。実際、GUID列を使用する場合、クライアントはそれらについて知る必要がないこともあります。

+0

私は彼らがOPによって与えられたシナリオで衝突すると信じています。 – HLGEM

+0

...私は特に、クライアントがサーバのIDを指定してコリジョンを避けるべきではないと明言しました。彼らがユニークな自然キーを再利用しようとしているのであれば、それは*システム*問題ではなく、*システム*問題であり、そのように説明されるべきです。 –

+0

私はMicrosoft Sync Frameworkで作業し、既存のauto int主キーとともに列テーブルを追加しました。 - guid上のクライアントの同期が同期している間、同期しています。これは本当にうまくいっています - 同期フレームワークはGUIDに基づいてオブジェクトマッチングを行いますが、既存のdbコードは引き続き自動インクリメントキーを持っています – TheTiger

1

複製を確認する必要があります。私はそれがあなたの場合に役立つかどうかわからない。しかし、レプリケーションは一般的にGUIDで設定されます。

関連する問題