2012-03-11 12 views
7

私は現在、登録システムプロトタイプを開発中です。これは非常に単純化されており、本質的にMongoDBに書き込まれる.NETフォームです。私がこだわっている何データベースエントリの効率的なユニークなキー生成

は、各ユーザーの一意のID /キーを生成するための効率的な方法です。これらのIDは人間にやさしいものでなければならないため、7文字の英数字の文字列のようなものでなければなりません。 A1B2C3X。

私は今のところだけ、ランダムな文字列を生成する簡単な関数を使用して、(あなたがユニークであるものを見つける刚性繰り返し、そうでない場合は)それが一意であるかどうかを確認するためにデータベースをチェック見てきたソリューションを提供しています。もちろん、これは、データベースエントリの数が増えるにつれ、ますます計算機的に高価になります。

私の考えは、固有のIDセットを事前に計算し、別のデータベースにそれを格納することです。次に、ユーザーデータベースに新しいエントリを追加する必要があるとき、IDデータベースからIDを(一定の時間内に)「ポップ」して、それを検索する必要なくユーザーデータベースに存在しないことを知ることができます。

誰かが前にこのようなことをしているに違いないと確信しています。より良い方法がありますか?なぜ私はこれでこれほど苦労しているのか分かりません。あなたのご意見は非常に高く評価されています。

+2

MongoDBドライバが提供するObjectIdは、あなたのユースケースではあまりにも人間的ではありませんか? –

+0

私は@EkinKocが提案したことを提案しようとしていました(もしあなたが40文字で大丈夫なら、それは行く方法です)。しかし、正確に7文字が必要な場合は、あなたが概要を示す方法は、値をポップするために別のdbキーストアを持つよりも、コストがかからず、簡単で、エラーが起こりにくいはずです。ランダムな7文字の英数字列に衝突する可能性はほとんどありません。あなたが最適化すべきではないまれなケースです。 (とにかくユーザーの作成はまれですが、dbの一意性チェックは比較的まれなプロセスのために十分高速です)。 –

+0

@BenLee:スケールで衝突の確率が変化します:) –

答えて

11

アプリケーション内のランダムな文字列を生成し、それがユニークだかどうかをチェックすることは悪いソリューションではありません。非効率であることを心配しないでください。そうではありません。確かにdb.user.count()を実行するか、事前に計算されたIDを持つ別のテーブルを保持するよりも速くなります。あなたはそれを正しく行う必要があります。

まず、新しいユーザーを作成する頻度はどれくらいですか?たぶん他のものと比較してあまり頻繁ではないでしょうから、本当に全体効率の議論は駄目です。第二に、7文字のA〜Z、0〜9は36〜7または約780億の範囲です。あなたが衝突を見るのをやめようとする前に、しばらくするでしょう。

あなたはこのようにそれを行う場合(極めてまれである)衝突がありますしない限り、それはどんなパフォーマンスの低下が発生しません。

  • は使用して、ユーザーオブジェクトを挿入し、固有のユーザーID
  • を生成します重複キーエラー(これを行うにはどのように言語とドライバに依存するが、​​コマンドを実行している伴うかもしれない)のための_id
  • チェックの値としてユーザーID。重複キーエラーで
  • は衝突の際に余分な仕事があるだろう新しいユーザーID

この方法を生成することで、最初からやり直す(と私は本当に、本当にどのように信じられないほどそう強調したいという意志)。

一意のユーザーIDを生成する別の方法があります。現在のUNIXタイムスタンプ(2番目まで)を取得し、ホスト名のハッシュを追加し、次にプロセスID、最後にカウンタの現在の値を追加します。これは、モンゴのObjectIdは(、モンゴで3バイトであるので、1600万)を生成し、そして、あなたのカウンタの最大値として、プロセスあたり毎秒として多くのオブジェクトを生成できることを保証する方法を、実際にあります。 http://www.mongodb.org/display/DOCS/Object+IDs

ユーザーIDが作成順に自然にソートされますが、長さは12バイトなので、7文字よりも少し長くなるというプロパティがあります。詳細については、ObjectIdのドキュメントを参照してください。残念ながら。同じ方法を使用してhostname/pidをスキップして、カウンター(必要な場合は乱数にすることもできます)を2バイトに短縮すると、6バイトになります。これはおそらく約9に絞られますchars AZ、0-9。

+0

お返事ありがとうございました。あなたのソリューションは、最も単純なように聞こえる。 _idを使用して挿入して、コピソンを手動で(アプリケーション内で)チェックしてから挿入するのではなく、重複キーのエラーをチェックするのが理にかなっています。私は、この微妙な違いは、ソリューションの効率性について懸念を抱かせていたことだと思います。ソリューションの効率性については、正しければ正当な理由がないと指摘しています。再度、感謝します。 –