リクエストに一意な識別子のためのユーザー
-
25-09-2019 - |
質問
している場合はテーブルのユーザーに通常かを設置するだけでよいので、自動的にユーザidカラムとしてその有効なタイプを利用します。が突如として万人のユーザーまたは5万人のユーザーがそれが本当に難しいので使いたいと思ってい始めて配布する場合は自動的に主キーが無用として各ノードの作成の鍵となります。
するこの利用自然主キー?私は実在する時に思考の自然主キームのユーザー問題はいるのですが、いずれも若い人はいない国の保険番号その他の識別子でいことだと思います。私のようなマルチカラム主キーがあった微の重複することができました。
なんだろうけど、日本人ソリューション?
感謝
解決
私は時間のために、ユーザーIDの自動インクリメントを維持していると言うでしょう。
あなたは何百万ものユーザーの突然の突進を持っている場合は、は、その後、あなたはそれを変更することについて考えることができます。
あなたはそれを持っているとき、言い換えれば、問題を解決します。 「時期尚早の最適化は諸悪の根源である。」ます。
疑問に答えるために - あなたは異なるノード上の異なる自動増分を得ることができるので、いくつかの自動増分は、あなたが自動インクリメントをシードすることができますが。まだ自動インクリメントの使用を可能にしながらこれは、問題を回避します。
他のヒント
ここでの標準液は、GUIDを使用することです。けれども彼らは、インデックス化の面でも同様に実行されません。
のGUID良好であるが、(稀ではあるが)衝突の対象となっている。
これは、非標準の解決策になるかもしれませんが、私はそこにそれを投げるつもりです
あなたは将来の分布に応じて自動インクリメントの数字が、偏析numberspaceを使用することができます。
それでは、あなたは3台のサーバを持っているとしましょう。次のようにIDを記録します:
サーバー1:0 - 9,999,999
サーバー2:10,000,000 - 19999999
サーバー3:20,000,000 - 29999999
でも32ビットintの制約の中で、それが膨張空間の多くを残す必要があります(あなたが心配している場合でも、100,000,000のギャップを使用することができます)、そしてそれは、本質的にシステム全体で一意性を保証します。
は、主キーの複合体を作ります
NodeID int --unique for each node 2 or 4 byte
UserID int --auto increment 8 byte, repeats for each node
方法良好GUID(小さく、より少ないメモリを使用し、より速くなるでしょう。)より
あなたが悪いパフォーマンスと悪いデータの可能性を使用する場合に限り、自然主キーを使用しないでください。特に時間をかけて変更されることNTO名で非常に少数の自然なキーがあります。自然キーが変更された場合、その後、関連するすべての子レコードも変更する必要があります。これは明らかに悪いです。
あなたは、GUIDを使用することができます。が、5万人がデータの点では何もない、おそらく変更を必要としません。我々は、我々のシステムでは10,000,000以上の異なる人々を持っていると我々は唯一partioningまたはGUIDの必要性がないと中規模のデータベースを持っています。
A GUIDは、簡単な方法ですが...
どのように分布し、それはする必要がありますか。それはデータベースの限られた数がある場合は、各データベースに使用する番号の範囲を与えることができます。だから、例えば、第1のデータベース自動1999999 0 1,000,000次の使用999,999までの範囲の番号を生成します。彼らはそれぞれお互いに衝突せずにユーザーIDを生成することができますこの方法。データベースはそれをidentifing一意の番号を含む場合、範囲は、この番号から自動的に生成することができる。
私はあなたがこれを行うには自動インクリメントのカラムを使用することができるとは思わないけど、ストアドプロシージャは、このように数字を生成することができます。
特別な技術を必要とゴミとする場合の鍵のペアをクラスタリングしました。の場合-集積んだクラスタ化されたインデックスで他のカラムです。
使用する整数型キーおよび各 new
ノード/トサイト
- 増加(10.として追加すノードでは、無料でご利用いただけでは、2、3、など
- 使用範囲例えば、1->1000000,1000000->1999999など
- とを忘れない-veます。例えば、できるアイデンティティ(-1,-1)のための第2ノード
が発見された場合にはノードサイトのその後の第二欄SiteIDます。
あなたはMSSQLを使用している場合、あなたは)UNIQUEIDENTIFIERとしてあなたのテーブルのPKを作成し、デフォルト値またはNEWID(への結合を設定することができます。
思いません考える特別な技術を必要とつの理由は、現在、私は困っていれば単位百万ユーザーを必要とする場合もありま大きな程度の並行処理、特別な技術を必要とす遺跡ごとの暮らしを充実させながら、挿入、削除できはインデックスとデフォルトではクラスタ化されたインデックスということはできたらクラスタ化されたインデックス毎の挿入や削除の移動の物理的、また特別な技術を必要としない連続できるチャンスをゼロにしている各課金の自動継続購読機能を利用しに来て下 先頭のページです。全体の挿入や削除の操作るのにとても費用のかかる場合は削除を指し選択な損害が大きくなる可能性がある。
特が複数ある場合にはテーブルと関係がありますといいかどうか尋ねてみましょう考える特別な技術を必要としてその有効なタイプを利用します。
は以下のようなものがあります二つの溶液のものをお勧めします.
だけではもったいない複合キーにする完璧ない場合は、その銀行のソフトウェアそのもbranchId,transactionIdの主キーがbranchIdはのアイデンティティのノードを挿入し、記録及びtransactionIdは自動numでの支店で取得します独自性でよく知られるようになった
ができるものではありませんどのような考えを利用することができることとして独自の提出が追加オート増分値としてprimary keyすことが大事だと申し上げました削減、全体のコストがクライアント(ノード)に送信データを用いたwebサービス)RPCを挿入すの記録をサーバーのデータベースそのautonumber、フラストレーションがこのautonumberの中で使用できる将来の選択、削除又は更新をクライアントかを知るこautonumber
理解している第二ソリューションは混乱や複雑なものよりよいよ特別な技術を必要としてPKです。だ液1適です。
いいコストその処理時間がロックを待など、安全に廃棄物のおquad coreサーバができるようになることで、よりロックの平均のデッドロックなので私の友人は絶対に使用を特別な技術を必要と.
について Mubashar