13

私は非常に単純な問題を抱えています。順序付きリストの要素を表すモデルを作成する必要があります。このモデルは次のように実装できます。

class Item(models.Model):
    data = models.TextField()
    order = models.IntegerField()

またはこのように:

class Item(models.Model):
    data = models.TextField()
    next = models.ForeignKey('self')

どのような方法が好ましいですか?それぞれのソリューションにはどのような欠点がありますか?

4

3 に答える 3

21

基本的に、提案する 2 番目のソリューションはリンク リストです。データベース レベルで実装されたリンク リストは、通常はお勧めできません。要素のリストを取得するには、データベースにアクセスnする必要がありnます (または複雑なクエリを使用します)。パフォーマンスに関しては、O(n) でリストを取得することは非常に効率的ではありません。

通常のコードでは、リンクされたリストを使用して、配列と比較して挿入のパフォーマンスを向上させます (すべての要素を移動する必要はありません)。データベースでは、すべての要素を更新することは、2 つのクエリだけでそれほど複雑ではありません。

UPDATE item.order = item.order + 1 FROM item WHERE order > 3
INSERT INTO item (order, ...) VALUES (3, ...)

これらすべてと優れた管理インターフェイスを実装した再利用可能なアプリを見たのを覚えていますが、今は見つけられません...

要約すると、非常に正当な理由がない限り、解決策 1 を使用し、解決策 2 には近づかないでください。

于 2009-01-09T14:17:26.753 に答える
6

それはあなたが何をしたいかによって異なります。

最初のものは、データベースで単一のクエリを作成し、すべてのデータを正しい順序で取得する方が良いようです

2番目のものは、2つの既存の要素の間に要素を挿入する方が良いようです(最初のものでは、番号が連続している場合、多くの項目を変更する必要があるため)

最初のものを使用します。これは、django がフードの背後にモデル データを格納する方法であるデータベース テーブルにより適しているように思われるためです。

于 2009-01-09T14:12:35.327 に答える
-6

別の解決策があります。

class Item(models.Model):
    data = models.TextField()

Python リストをデータ フィールドにピクルまたはマーシャリングしてロードするだけです。これは更新と読み取りには適していますが、特定のアイテムを含むすべてのリストを取得するなどの検索には適していません。

于 2009-01-09T15:22:38.040 に答える