1

私が持っているのは要素のあるテーブルです。各要素には、shortと呼ばれる一意のIDと一意の短いIDがあります。たとえば、次のようになります。

id=>short
1 => 1
9 => 9
10=> a
37=> B

など。短いIDはphp関数を介して生成されます。

私が今やりたいのは、ユーザーが自分のカスタムを短く設定できるようにすることです。38番目のユーザーが自分のショートパンツを「foobar」にしたいとします。簡単な解決策は次のとおりです。

10=> a
37=> B
38=> foobar
39=> D

しかし、そうすれば私はCを失うことになります。また、多くのユーザーがカスタムの短いIDを使用することを決定した場合、多くの短いIDが失われることになります。

したがって、カスタムショートが発生するたびに、IDが「先に進みすぎ」ます。この問題を修正する方法はありますか?mysqlまたはphpのいずれか。

完璧なのは:

10=> a
37=> B
38=> foobar
39=> C
40=> FUBAR
41=> D

更新:(可能な3列アプローチ)

「使用済み」の行は、短いIDが生成され、カスタムメイドではない場合にのみ増加します。このようにして、短いIDは常に「使用済み」行を使用して生成できます。例:

id  |  short  |  used
10  |  a      |  10
37  |  B      |  37
38  |  foobar |  37
39  |  C      |  38
40  |  FUBAR  |  38
41  |  D      |  39
4

1 に答える 1

1

十分に単純でなければなりません。

  1. リサイクルされた短い ID を使用して新しいテーブルを作成する

  2. 短い ID の生成に使用された最後の ID を保持する別の (シーケンス) テーブルを作成します。

  3. 短い ID がカスタム ID に置き換えられたら、ごみ箱に入れます

  4. 新しい短縮 ID を作成する必要がある場合は、最初にごみ箱を調べてください。

    を。アイテムが見つかった場合は、それを新しい短い ID として使用します (後で削除します)。

    b. ビンが空の場合、シーケンスを 1 つ増やし、そこから新しい短い ID を生成します。

アップデート

これは、シーケンス テーブルを作成して使用する簡単な方法です。

CREATE TABLE seqname (id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY) ENGINE=MyISAM SELECT 0 AS id;

UPDATE seqname SET id=LAST_INSERT_ID(id+1);
于 2012-08-29T03:22:53.673 に答える