13 Stimmen

Geordnete Listen in django

Ich habe ein sehr einfaches Problem. Ich muss ein Modell erstellen, das ein Element einer geordneten Liste darstellt. Dieses Modell kann wie folgt implementiert werden:

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

oder so:

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

Welcher Weg ist vorzuziehen? Welche Nachteile hat jede Lösung?

21voto

Guillaume Punkte 17737

Die zweite Lösung, die Sie vorschlagen, ist im Wesentlichen eine verknüpfte Liste. Verknüpfte Listen, die auf Datenbankebene implementiert werden, sind normalerweise keine gute Idee. Zum Abrufen einer Liste von n Elemente, benötigen Sie n Datenbankzugriff (oder komplizierte Abfragen). In Bezug auf die Leistung ist das Abrufen einer Liste in O(n) furchtbar ineffizient.

In normalem Code werden verknüpfte Listen verwendet, um eine bessere Einfügeleistung im Vergleich zu Arrays zu erzielen (keine Notwendigkeit, alle Elemente zu verschieben). In Ihrer Datenbank ist das Aktualisieren aller Elemente mit nur 2 Abfragen nicht so kompliziert:

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

Ich erinnere mich, eine wiederverwendbare App gesehen zu haben, die all das und eine nette Verwaltungsschnittstelle implementiert hat, aber ich kann sie gerade nicht finden ...

Zusammenfassend lässt sich sagen, dass Sie auf jeden Fall Lösung Nr. 1 verwenden und von Lösung Nr. 2 Abstand nehmen sollten, es sei denn, Sie haben einen sehr guten Grund, dies nicht zu tun!

6voto

nosklo Punkte 204121

Das hängt davon ab, was Sie tun wollen.

Die erste Möglichkeit scheint besser zu sein, um eine einzige Abfrage in der Datenbank zu machen und alle Daten in der richtigen Reihenfolge zu erhalten

Die zweite Variante scheint besser geeignet zu sein, um ein Element zwischen zwei bestehenden Elementen einzufügen (denn bei der ersten Variante müssten Sie viele Elemente ändern, wenn die Nummern fortlaufend sind)

Ich würde die erste verwenden, weil sie besser zu einer Datenbanktabelle zu passen scheint, wie Django Modelldaten hinter der Haube speichert.

-6voto

Seb Punkte 15918

Es gibt eine andere Lösung.

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

Sie können einfach eine Python-Liste in das Datenfeld einfügen und dann laden. Dies ist gut zum Aktualisieren und Lesen, aber nicht zum Suchen, z. B. zum Abrufen aller Listen, die ein bestimmtes Element enthalten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X