データベースの設計を決定する必要があります。要件は、1つのデータベーステーブルにidと呼ばれるAUTO_INCREMENTPRIMARYKEYフィールドがあることです。デフォルトでは、各行は(Webで)ユーザーに表示され、IDの昇順で並べ替えられます。たとえば、テーブルに4つのレコードがある場合。UIには、0、1、2、3の順序で行が表示されます。
現在、ユーザーがUIで行をドラッグアンドドロップして、順序を変更できる必要があります。たとえば、ユーザーがrom 3をドラッグし、 0の下にドロップすると、表示シーケンスは3、0、1、2になります。このシーケンスはデータベースに永続的である必要があります。
これを永続的かつスケーラブルにするためにデータベーステーブルを設計する方法を考えています。私の最初の考えは、各行には表示シーケンスを示す「シーケンス」フィールドがあるということです。デフォルトでは、値はidと同じである必要があります。表示するデータベースからデータを選択すると、行はidではなく昇順で並べ替えられます。
シーケンスが変更されると、新しい値に更新されます。その結果、他の行に多くの変更が含まれる可能性があります。上記の例をとると、元々テーブルは次のようになります。
|id | sequence |
|0 | 0 |
|1 | 1 |
|2 | 2 |
|3 | 3 |
ここで、ID3の行を最初にドラッグした後。そのシーケンスは0に更新されます。同時に、IDが0、1、2の行も更新する必要があります。
|id | sequence |
|0 | 1 |
|1 | 2 |
|2 | 3 |
|3 | 0 |
このアプローチでは、再シーケンスのコストが多くのリソースになり、スケーラブルではなくなるのではないかと心配しています。したがって、idにK(たとえば、10)を掛けることで、シーケンスを初期化できると思います。これにより、挿入のシーケンス値の間にギャップが残ります。ただし、K + 1行をこのギャップに移動すると、ギャップが消費される可能性があります。
|id | sequence |
|0 | 0 |
|1 | 10 |
|2 | 20 |
|3 | 30 |
これは、データベース設計に共通の問題のようです。誰かがこれを達成するためのより良いアイデアを持っていますか?