Ich versuche zu verstehen, wie man bestellte Informationen in einer relationalen Datenbank richtig speichert.
Ein Beispiel:
Angenommen, ich habe eine Wiedergabeliste, die aus Songs besteht. In meiner relationalen Datenbank habe ich eine Tabelle Playlists
mit einigen Metadaten (Name, Ersteller usw.). Ich habe auch eine Tabelle mit der Bezeichnung " Songs
the" playlist_id
sowie songspezifische Informationen (Name, Künstler, Dauer usw.).
Wenn ein neuer Song zu einer Wiedergabeliste hinzugefügt wird, wird er standardmäßig an das Ende angehängt. Bei Bestellung auf Song-ID (aufsteigend) gilt die Reihenfolge der Hinzufügung. Was aber, wenn ein Benutzer in der Lage sein sollte, Songs in der Wiedergabeliste neu zu ordnen?
Ich hatte ein paar Ideen, jede mit ihren Vor- und Nachteilen:
- Eine aufgerufene Spalte
order
, die eine Ganzzahl ist . Wenn ein Song verschoben wird, wird die Reihenfolge aller Songs zwischen der alten und der neuen Position geändert, um die Änderung widerzuspiegeln. Dies hat den Nachteil, dass jedes Mal, wenn ein Song verschoben wird, viele Abfragen durchgeführt werden müssen und der Algorithmus für das Verschieben nicht so einfach ist wie bei den anderen Optionen. - Eine Spalte genannt
order
, die eine ist dezimal (NUMERIC
). Wenn ein Song verschoben wird, wird ihm der Gleitkommawert zwischen den beiden benachbarten Zahlen zugewiesen. Nachteil: Dezimalfelder nehmen mehr Platz in Anspruch und es kann vorkommen, dass die Genauigkeit abnimmt, es sei denn, es wird darauf geachtet, dass der Bereich nach einigen Änderungen neu verteilt wird. - Eine andere Möglichkeit wäre, ein
previous
und einnext
Feld zu haben, das auf andere Songs verweist. (oder sind NULL im Fall des ersten bzw. letzten Songs in der Wiedergabeliste; im Grunde erstellen Sie eine verknüpfte Liste ). Nachteil: Abfragen wie 'finde den X. Song in der Liste' sind nicht mehr zeitlich konstant, sondern zeitlich linear.
Welches dieser Verfahren wird in der Praxis am häufigsten angewendet? Welches dieser Verfahren ist bei mittleren bis großen Datenbanken am schnellsten? Gibt es noch andere Möglichkeiten, dies zu erreichen?
EDIT: Der Einfachheit halber gehört in diesem Beispiel ein Song nur zu einer Playlist (eine Beziehung von vielen zu eins). Natürlich könnte man auch eine Junction-Tabelle verwenden, sodass die Song-Playlist eine Beziehung von vielen zu vielen ist (und eine der oben genannten Strategien auf diese Tabelle anwenden).
update songorder set order = order - 1 where order >= 12 & order <= 42; update songorder set order = 42 where id = 123;
- das sind zwei Updates - nicht dreißig. Drei, wenn Sie eine eindeutige Einschränkung für die Bestellung festlegen möchten.
Queries like 'find the Xth Song in the list' are no longer constant-time
Dies gilt auch für Option 2.