2012-02-21 4 views
1

私はdbテーブルに格納しているオブジェクトのリスト( "Phases")を持っています。値のテーブルのシーケンスをモデル化する良い方法は何ですか?

リスト内のフェーズの順序を維持する必要があります。私はこれをモデル化するための良い方法が何かと思っていますか?

私はフェーズオブジェクトに順序を指示する "int sequence"属性を与え、テーブルに永続化されているので、それらを順番に読み戻すことができます。私が見る唯一の問題は、シーケンスの順序を変更するときに、リスト内のすべてのフェーズのすべてのシーケンス値を再計算する必要があるということです。たとえば、#2と#3の位置を入れ替えると、#3の後にあるすべてのもの(#1000まで)がDB内で更新される必要があります。

私が考えていないこれをモデル化する簡単な方法はありますか?

+0

小数点以下の桁数を使用できないのはなぜですか? –

+0

リンクリストのようにすることができます。序数を持つのではなく、 'next_phase_id'があります。それがより簡単になるかどうかはわかりません。 – Russell

+0

あなたの例でも#2と#3を入れ替えても、他のものを更新する必要はありません。 * * 2または#3を削除すると、それらのすべてを更新する必要があります。 – Russell

答えて

1

私はそれをあなたが説明した方法でやっています。

はいあなたは新しい値を挿入したい場合は、連続したランク値を使用した場合、その後、あなたは既存の値をバンプする必要があり、

UPDATE table SET rank = rank + 1 WHERE rank >= ? 

を言うあなたが通常のランク列を作ることができないということになります

データベースにプログラムでアクセスする場合、不連続なランク値を許可する可能性があるため、既存のランクがない場合にのみランク付けする必要があります番号付けシーケンスのギャップ。

また、行/ページベースのデータベースを使用している場合は、メインレコードのIDとランク値を持つ別のテーブルにランク付けすることもできます。次に、ランキングを大量に更新する必要がある場合は、メインレコード全体を読み書きする必要はなく、2つの整数を含むちょっとしたレコードです。

1

他のレコードに影響を与えずにソート位置を入れ替える方法。

UPDATE 
    phases 
SET 
    sort_pos = CASE WHEN sort_pos = 2 THEN 3 ELSE 2 END 
WHERE 
    sort_pos IN (2, 3) 


あなたはソート順で新しい位置に一つのレコードを移動するときに「カスケード」効果のようなものを持っているだけです。

これは、sort_posをフロートとして保存することで処理できます。レコードをソート位置2.5にプッシュできます。ここでの唯一の欠点は、ソート順9または8.5、または実際にはのいずれかである可能性があるので、「9番目のアイテムを手に入れる」というクエリを書くことができないということです。

関連する問題