複数のSQLサーバー間の一意のID

私は、全国の複数のインスタンスで使用されるいくつかのソフトウェアを開発しています。ログインを使用する多くのソフトウェアと同様に、私は各ユーザーに固有のIDが必要です。ソフトウェアの各インスタンスは完全に独立して動作する必要がありますが、最終的にはデータベースのいくつかを組み合わせる可能性が高くなります。この場合、各ユーザーのIDをすべてのサーバーで一意にすることをお勧めします。

サーバー間の通信がなくても(LANにしか対応していない)、ミリ秒単位の正確なタイムスタンプからIDを生成することができます。数千万ではなく数千のユーザープールで、別のサーバー上の別のユーザーと同じミリ秒で作成されるユーザーの確率はかなり低いです。

本当にすべてのサーバー間で通信することなく一意のIDを保証する方法はありますか?

2
追加された 著者 Brian Roach,

4 答え

16バイトの uniqueidentifier データ型を使用する

一例があります

SELECT NEWID()
GO
-- This will return a new random uniqueidentifier e.g.
E75B92A3-3299-4407-A913-C5CA196B3CAB

このGuidを変数で選択するには

--assign uniqueidentifier in a variable
DECLARE @EmployeeID uniqueidentifier
SET @EmployeeID = NEWID()
You can directly use this with INSERT statement to insert new row in table.

- Employeesテーブルにデータを挿入する。

INSERT INTO Employees
(EmployeeID, Name, Phone)
VALUES
(NEWID(), 'John Kris', '99-99999')

詳細が必要な場合は、こちらからの例があります

5
追加された
あなたは16バイトを意味する....? UUIDは16ビットより大きい。
追加された 著者 BG100,
偉大なリンクと例をありがとう!
追加された 著者 Indigenuity,

はい、あなたはあなたが持っているサーバーの数の倍数で増加するが、異なる番号から始まる自動増分IDを使用することで、これを非常に簡単に行うことができます。

たとえば、3つのデータベースがあるとします。

Server 1: IDs increment by 3 starting from 1 E.g. 1, 4, 7, 10
Server 2: IDs increment by 3 starting from 2 E.g. 2, 5, 8, 11
Server 3: IDs increment by 3 starting from 3 E.g. 3, 6, 9, 12
4
追加された
@Doozer:はい、しかし、あなたは20のような十分に高い乗数を選ぶことができます。これは20台までのサーバーを可能にします...すべてのIDを使う必要はありません。
追加された 著者 BG100,
@ブライアン:はい、私はUUIDがおそらくほとんどの状況で最高であることに同意しますが、単純な整数IDが望ましい理由があります。 OPのデータベースについてもっと詳しく知ることなく、どの方法が最も効果的かを知ることは難しいです。
追加された 著者 BG100,
私はおそらくUUIDを使用して終了しますが、私は同意する、簡単なIDは非常にいいだろう。私が持っていたもう一つの考えは、ソフトウェアをインストールしてから(場所のような)いくつかの変数を使用して、それを各サーバーの増分値の末尾に追加することでした。アイデアありがとう!
追加された 著者 Indigenuity,
@ BG100 - もしUUIDのようなことがなければ、これはメリットがあります。そうであるように、これを行うための実用的な理由はなく、道に沿って自分自身を塗装することも可能です。
追加された 著者 Brian Roach,
@onedaywhen - よく見ると、「20」を選んでから3年後に21台目のサーバーを追加する必要がある場合、私はそのコーナーにかなり向いています。私は単にUUIDを使用するだけでは問題はありません。
追加された 著者 Brian Roach,
+1は面白いアイデアだからですが、実装数が極端に制限されているため-1です
追加された 著者 JNK,
異なる、しかし巧妙なアイデア。あなたはあなたが3つを記入するためにインストールしたインスタンスの数を知っていなければならないでしょう。
追加された 著者 Doozer Blake,
@ BG100うん、私はそれを得る。ある時点で、規模の問題に遭遇する可能性があります。 OPが何を意味するかは、複数のインスタンスが何を意味するかによって異なります。
追加された 著者 Doozer Blake,
このアプローチはうまくいかず、3つのシーケンスのみに制限されているので推奨できません。たとえば、4を使用する場合はシーケンスが4,7,10となります。 1のシーケンスはすでに1,4、7,10です。このアプローチは、1,2,3で始まるシーケンスでのみ機能します。最大値の数はInt32/3になります。
追加された 著者 Parmenion,
@BrianRoach:「道路の隅に自分自身を塗る」 - それを描くのが難しいです;)
追加された 著者 onedaywhen,
@BrianRoach:しかし、この20年の間に道路を再浮上させる必要があります。とにかくペイントがちょうどシェブロンならどうでしょうか?
追加された 著者 onedaywhen,

uniqueidentifier (GUID)フィールドタイプを試しましたか?

4
追加された
+1あなたは数秒で私を倒す...
追加された 著者 Adrian Carneiro,

UUID(GUID)はあなたの場合に最適です

2
追加された