0

このシナリオでは、何人かのマネージャー (約 150 人) がいます。彼らの日常業務の 1 つは、ID とともにデータベースに格納される 50 個の (一定の) 認証コード (6 ~ 8 桁の数字) を生成することです。認証コードが使用されている場合、そのコードは使用済みとしてマークされ、トリガーは、それらが 15 日経過して使用されたときにそれらを削除します。

私のテーブルでは、認証コードを一意のキーとして設定しました。乱数を生成し、存在する場合はデータベースにクエリを実行し、別の乱数を生成するか、保存します。

db 内の番号の存在をチェックする私のロジックを除いて、すべて問題ありません。現在、1090083 を超える保留中の承認コードがあるため、この往復 + チェックにより大幅な遅延が発生しています。これらの認証コードは流通しているため、取り消すことはできません。現在の負荷では、新しい番号を見つけるのに時間がかかっています。

使用された乱数の数に関係なく、実行速度が遅くなる別のロジックで実装する必要があります。

私のテーブルは次のように設計されています

slno(認証増分) || auth_code (ランダムコード) || auth_by (作成者) || 使用済み (1=使用済み/0=未使用)

4

3 に答える 3

0

データベースが一意の ID の作成をサポートしていない場合:
- すべての乱数を値でソートし、そのサイズを格納して使用できるテーブルを設定します。

  • このテーブルの要素をランダムに選択します。
  • 後続要素を取得します。後続要素が要素の隣接要素である場合は、次の後続要素を取ります。最後の要素に到達した場合は、手順 2 の要素からやり直して、先行要素を取得します。
  • element-next element でランダムな範囲を選択し、乱数を取得します。
  • 準備 !

例: すべての ID を並べ替えられたテーブルに保存しました。これが例えば
{890、1045、2345、2346、4087}であると仮定しましょう

最初のステップ: そのうちの 1 つをランダムに選択します。たとえば、C#でそれを取得します

Random random = new Random();  
int indexOfNumber = random.Next(0, myTableSize);

2 番目のステップ: インデックスを取得しました。これを 2 と仮定します。インデックス 3 で次の番号を取得しています。これは 2346 です。残念ながら、これは直接の隣人であるため、引き続きインデックス 4 を作成します。これは 4087 です。

3 番目のステップ: によって番号を作成します。

int myRandomNumber = previousElement + random.Next(1,nextElement-previousElement);

この場合:

int myRandomNumber = 2346 + random.Next(1, 4087-2346);

新しい乱数を格納します。これにより、データベースのサイズに関係なく、データベースからほとんど2 つの要素 (おそらくそれ以上)を読み取ることができます。2 つの乱数を作成することは重要ではありません。インデックスが最後にある場合は、エッジ ケースのみに注意する必要があります (単純に検索方向を逆にします)。

于 2013-07-04T12:16:09.983 に答える
0

このことを考慮。ランダムが一意であり、何らかの(code_id, code, other_data)テーブルの方法でベースに格納されている場合は、ベースに別のテーブルを追加するだけで済みます。フィールドにインデックスを付けて(code, code_id)code優れた対数検索を許可します。

ただし、これを考えると、代わりに最初のテーブルに追加のキーを作成することもできます。一意であるとすぐに、codeうまく機能します。

于 2013-07-04T14:18:14.207 に答える