質問

タスクを含むテーブルがあり、タスクの優先順位に基づいて明示的な順序を付けたいと考えています。これを行う唯一の方法は、 個性的 タスクが優先度の観点からどこにあるかをインデックスする int 列 (つまり、1 は上位 1000 位が低いです)。

問題は、タスクを更新してその優先度を低い値に設定したいとすると、現在の値と新しい値の間で他のすべての行を更新する必要があることです。

これを実装するより良い方法を誰かが提案できますか?

役に立ちましたか?

解決

優先順位として実数値を使用します。次のようなものを使用すると、いつでも 2 つの既存の値の間で値をスライドインできます。 newPri = task1Pri + (task2Pri - task1Pri)/2 ここで、Task1 の優先順位の数値は低くなります (おそらく、優先順位はこれの方が高いでしょう)。

Corin 氏は、優先順位リストの先頭または末尾に挿入されたタスクの最小優先順位と最大優先順位を計算する必要があると指摘しています。

そして、ジョエルハルディは私たちに次のことを思い出させます。 並べ替える 時々テーブルをクリーンアップすることをお勧めします。

他のヒント

あなたが言ったように番号付きの列を作成する代わりに、親のようなものと呼ばれるフィールドを作成します。各行には、その親アイテムの pk が含まれます。項目を 1 つ下に移動したい場合は、その親 pk を新しいものに変更し、親 pk 内でその項目を参照している項目を変更するだけです。単一リンクリストを考えてみましょう。

私は Kevin の答えが一番好きですが、手っ取り早い解決策が必要な場合は、すでに説明した方法で実行してください。ただし、1 ずつ増分する代わりに、10 または 100 ずつ増分します。そうすれば、優先順位を再設定する必要がある場合に、タスク間で多少の余裕が生まれます。

少数の値 (1..10) だけを割り当ててから、ORDER BY Priority DESC、DateCreated ASC を割り当てます。各タスクに異なる優先度を設定する必要がある場合は、あなたが言ったように、UPDATE WHERE Priority > xxx する必要があります。

2 つのタスクに同じ優先順位を設定できない場合は、そうする必要があると思います。ただし、優先順位の重複を許可する場合は、優先順位と datemodified 列を用意し、両方で並べ替えるだけで、優先順位と最終更新に基づいて正しい順序を取得できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top