タスクを含むテーブルがあり、タスクの優先度に基づいてこれらに明示的な順序を付けたいと思います。これを行うために私が考えることができる唯一の方法は、タスクが優先度の観点からどこにあるかをインデックス付けする一意のint列を使用することです(つまり、1が上位1000が低い)。
問題は、タスクを更新してその優先度を低い値に設定したい場合、現在の値と新しい値の間の他のすべての行を更新する必要があるということです。
誰かがこれを実装するためのより良い方法を提案できますか?
タスクを含むテーブルがあり、タスクの優先度に基づいてこれらに明示的な順序を付けたいと思います。これを行うために私が考えることができる唯一の方法は、タスクが優先度の観点からどこにあるかをインデックス付けする一意のint列を使用することです(つまり、1が上位1000が低い)。
問題は、タスクを更新してその優先度を低い値に設定したい場合、現在の値と新しい値の間の他のすべての行を更新する必要があるということです。
誰かがこれを実装するためのより良い方法を提案できますか?
優先順位として実数値を使用します。newPri = task1Pri + (task2Pri - task1Pri)/2
タスク 1 の優先度が低い数値 (おそらく優先度が高い) のように、2 つの既存の値の間で値をスライドさせることができます。
Corin は、優先度リストの一番上または一番下に挿入されたタスクの最小優先度と最大優先度を計算する必要があると指摘しています。
また、joelhardi は、時々テーブルをクリーンアップするための再注文プロセスが良い考えであることを思い出させてくれます。
あなたが言ったように番号付きの列を作成する代わりに、親のようなものと呼ばれるフィールドを作成します。各行には、その親アイテムの pk が含まれています。1 つのアイテムを下に移動する場合は、その親 pk を新しいものに変更し、親 pk でそれを参照するアイテムを変更します。単独でリンクされたリストを考えてください。
私はケビンの答えが一番好きですが、手っ取り早い解決策が必要な場合は、すでに説明した方法でそれを行いますが、1ずつ増やすのではなく、10または100ずつ増やしてください...優先順位を付け直すと、タスク間に多少の余裕があります。
少数の値 (1..10) のみを割り当ててから、ORDER BY Priority DESC、DateCreated ASC を割り当てます。タスクごとに異なる優先度が必要な場合は、あなたが言ったようにUPDATE WHERE Priority > xxxが必要です。
2 つのタスクが同じ優先度を持つことができない場合は、それがあなたがしなければならないことだと思います。ただし、優先順位と日付変更された列を使用して、優先順位の複製を許可する場合は、優先順位と最終更新に基づいて正しい順序を取得するために両方で並べ替えることができます。