3


1

マルチマスターレプリケーションで使用できる整数主キーの選択肢を検討しています。 (私はGUIDの代わりに整数キーを使うことでかなり売れています)

私が思い付くことができる最も良いのは最初に最も重要なデータを持っていて、そして最後にサーバー番号を持っていることです: サーバー1の請求書1 = 101サーバー2の請求書1 = 102ここで、サーバー以外の部分(invoiceno)はdb番号ジェネレータから取得されます。

アルゴリズム的に:gen_id(INVOICENO_GEN、1)* 100 servernoそして、あなたは値を見ることと数学的の両方によってサーバー番号を得ることができます。

これは99台のサーバー用のスペースを残していますが、まだ短くて読みやすく、衝突しません。 この方式と通常の整数サイズの列を使用すると、最大行数(21 474 836)になるか、bigintが使用されると数十億になります。

たとえば、請求書テーブルのキーは次のようになります。

サーバー1 101 201 301 301 401

サーバー2 102 202 202 302 402

*私の質問は、私が見落としてきた批判や欠陥です。

データベースはFirebirdです。

2 Answer


2


複合主キーを作成するだけではどうでしょうか。

各サーバーに設定する "ServerID"を定義します。 1、2、3、4など INTとして。 次に、InvoiceテーブルにINTとして "InvoiceID"を入れます。

主キーを(ServerID、InvoiceID)になるように作成します。

そうすれば、99台を超えるサーバーを収容する余地があり、IDやそれに類するものを操作/計算する必要がなくなります。

もちろん、Invoiceテーブルを参照するテーブルも外部キーとして(ServerID、InvoiceID)を使用する必要があります。ただし、それらのテーブルを複製する必要がある場合は、ServerIDをテーブル内のどこに置いても問題になりませんまた。

マーク


2


一般に、数値ではないものには数値型を使用しないでください。 数字を特別な意味で処理すると、数字は厳密に数値にはなりません。 通常、文字列は、環境固有のデータを追加したい(通常は複製用)このようなシナリオに適しています。