0

this questionと似ていますが、これらの回答はどれも理想的ではありません。データベーステーブルの並べ替え順序列を使用する代わりに

class Parent(models.Model): 
    id = models.AutoField(primary_key=True) 

class Child(models.Model): 
    id = models.AutoField(primary_key=True) 
    parent = models.ForeignKey(Parent) 

SQLで(私は右のこのコードを持って願っています):

CREATE TABLE parent (
    id integer PRIMARY KEY 
); 

CREATE TABLE child (
    id integer PRIMARY KEY 
    parent_id integer REFERENCES parent 
); 

Childオブジェクトが特定に属するようにすることを行うことができますか

のPostgreSQLで使用されるこのDjangoのモデルを考えてみましょうParentは並べ替えることができますか?ドラッグドロップUIを使用すると、ユーザーはChildをドラッグして更新した注文を保存することができます。 Childの作成、更新、削除は1回の操作で済みます。つまり、Parentで更新する必要はありません。

私は、各アイデアは理想的ではない理由をいくつか不完全なアイデアを持っている:ユーザによって提供varchar型をアルファベット順に

  1. ソートChild - これは、特定の文字で始まる名前を考えるようにユーザーを強制的に正当な理由がなければ、創造性のストレスのある量を必要とします。 Parent

  2. Childオブジェクトの主キーに対応する整数の配列を格納するが - 作成および削除するための複数の操作を必要とし、Parentの配列は、たびに更新される必要があるであろう。データベースによるデータの完全性の保証はありません。

  3. 整数列で並べ替えます。Childを作成するときは、次の整数を見つけるために追加の読み取りが必要です。もう一つの問題は、整数間のギャップがなくなったときに、挿入されたオブジェクトの背後にあるオブジェクトを押し戻さなければならないということです。この状況は、最後のオブジェクトを繰り返し取得し、最初に置くことによって人為的に強制される可能性があります。

  4. Childには、次の/前の番号を参照する整数IDを格納します。これは、3からのハッキーな問題のいくつかを解決しますが、それは不合理に非効率的で、物流上の課題です。 (さらに参加伴うかjsonbを有する第2のテーブルを交換しないでください)この要件のいずれかの雄弁なソリューションが

ありますか?

+1

を使用してください。説明した問題は本当ですが、親あたりの子供の数が非常に多い場合を除き、おそらく重要ではありません。 –

答えて

0

並べ替え順の列として浮動小数点数を使用する方法について説明します。項目の間に挿入/移動するときは、sortorderを(previus-item.sortorter + next-item.sortorder)/ 2に設定します。 これは無限に実行されませんが、システムによっては現実世界の問題に遭遇しないようにしてください。また、夜間に子供のソート順のギャップをリセットするサービスタスクを持つこともできます。

+0

夜間のサービスタスクが必要ない場合、最終的にフロートの精度が低下し、黙って注文を維持できなくなります。整数と同じ問題ですが、浮動小数点数は使い易いだけですが、「空きがなくなる」ときにはあいまいです。 – dtgq

関連する問題