Ich habe eine Sammlung von Objekten in einer Datenbank. Bilder in einer Fotogalerie, Produkte in einem Katalog, Kapitel in einem Buch usw. Jedes Objekt wird als eine Reihe dargestellt. Ich möchte in der Lage sein, diese Bilder beliebig zu ordnen und diese Reihenfolge in der Datenbank zu speichern. Wenn ich die Objekte zeige, sind sie in der richtigen Reihenfolge.Reihenfolge in einer relationalen Datenbank darstellen
Nehmen wir zum Beispiel an, ich schreibe ein Buch, und jedes Kapitel ist ein Objekt. Ich schreibe mein Buch und legte die Kapitel in der folgenden Reihenfolge:
Einführung, Zugänglichkeit, Form vs. Funktion, Fehler, Konsistenz, Schlussfolgerung, Index
Es geht an den Editor, und kommt zurück mit der folgenden empfohlenen Reihenfolge:
Einführung, Form, Funktion, Zugänglichkeit, Konsistenz, Fehler, Schlussfolgerung, Index
Wie kann ich diese Bestellung robust und effizient in der Datenbank speichern?
Ich habe folgende Ideen hat, aber ich bin nicht begeistert, mit einem von ihnen:
Array. Jede Zeile hat eine Bestell-ID. Wenn die Bestellung geändert wird (über eine Entnahme gefolgt von einer Einfügung), werden die Bestell-IDs aktualisiert. Dies macht die Suche einfach, da es nur
ORDER BY
ist, aber es scheint einfach zu brechen.// REMOVAL
UPDATE ... SET orderingID=NULL WHERE orderingID=removedID
UPDATE ... SET orderingID=orderingID-1 WHERE orderingID > removedID
// INSERTION
UPDATE ... SET orderingID=orderingID+1 WHERE orderingID > insertionID
UPDATE ... SET orderID=insertionID WHERE ID=addedID
verlinkte Liste. Jede Zeile hat eine Spalte für die ID der nächsten Zeile in der Reihenfolge. Traversal scheint hier kostspielig zu sein, obwohl es irgendwie möglich sein kann,
ORDER BY
zu verwenden, an die ich nicht denke.Platzierte Anordnung. Legen Sie die orderID (wie in # 1 verwendet) als groß fest, also ist das erste Objekt 100, das zweite ist 200 usw. Wenn eine Insertion stattfindet, platzieren Sie sie einfach unter
(objectBefore + objectAfter)/2
. Natürlich müsste dies gelegentlich neu ausbalanciert werden, so dass Sie nicht zu nahe beieinander sind (selbst mit Floats würden Sie eventuell zu Rundungsfehlern kommen).
Keines von diesen scheint mir besonders elegant. Hat jemand einen besseren Weg, es zu tun?
+1 für die Angabe der spärlichen Nummerierung. Ich habe dafür in der Vergangenheit den Edelstein [ranked-model] (https://github.com/mixonic/ranked-model) verwendet. –