Wie sortiere ich Datensätze in einer Datenbanktabelle?

8

Ich erstelle eine Datenbanktabelle, die Menüverknüpfungen speichert, die letztendlich auf einer Webseite angezeigt werden.

Mein Problem ist, dass ich die Reihenfolge der Menüelemente steuern möchte. Ich könnte ein Feld namens order haben, aber jedes Mal, wenn ich einen neuen Menülink habe, müsste ich die Reihenfolge einfügen und alle Datensätze mit höherer Ordnung auf +1 setzen.

Nehmen wir zum Beispiel an, ich möchte die Links (in dieser Reihenfolge):

%Vor%

Ich könnte eine Tabelle namens MenuLinks mit den Spalten Name, Order

haben

meine Daten würden wie folgt aussehen:

%Vor%

Aber wenn ich jetzt einen neuen Link namens ContactUs hinzufügen wollte, wollte ich direkt unter zu Hause erscheinen.

kann jemand einen besseren Weg vorstellen, eine Liste zu speichern, die eine Bestellung in einer Datenbanktabelle ohne diesen mühsamen Wartungsaufwand erfordert.

    
leora 06.11.2010, 20:39
quelle

3 Antworten

6

Ich denke, das hängt mit dem allgemeinen Problem zusammen, ein Array gegen eine verknüpfte Liste zu verwenden. Wie wäre es mit einem Fremdschlüssel, der auf den nächsten Datensatz in derselben Tabelle verweist? Dies ist die verknüpfte Liste wie Ansatz.

Für Ihr Beispiel gibt es nicht zu viele Registerkarten, so dass ein Array-basierter Ansatz gut funktionieren sollte. Aber für jemanden mit Hunderten von Datensätzen kann es nützlich sein, einen selbstreferentiellen Fremdschlüssel zu verwenden.

%Vor%

Das Hinzufügen und Löschen von Zeilen ähnelt dem Einfügen und Löschen von verknüpften Listen.

Aktualisierung: Geänderte Tabelle

%Vor%

Die Bestellung wird 1 & gt; 5 & ​​gt; 2 & gt; 3 & gt; 4 wie durch die nächste Spalte bestimmt. Sie können auch eine vorherige Spalte verwenden, die sie einer doppelt verknüpften Liste ähnlich macht.

    
Rohit Banga 01.02.2013, 05:12
quelle
5

Ohne ORDER BY können Sie die Reihenfolge der Daten nicht garantieren - normalerweise wird ohne ORDER BY der Anzeigenauftrag verwendet.

Leider gibt es keine Konvention, die für eine anpassbare Sortierreihenfolge des Benutzers gut funktioniert.
Man könnte mit der Verwendung von Analyse- / Fenster- / Ranking-Funktionen wie ROW_NUMBER durchkommen, aber es hängt von der Daten- und Datenbankunterstützung ab (MySQL unterstützt keine analytischen Funktionen, Oracle 9i + / PostgreSQL 8.4 + / SQL Server 2005+). Aber analytische Funktionen helfen nicht, wenn ein Eintrag, der mit "B" beginnt, vor "A" / etc.

erscheint

Sie können entweder zwei Anweisungen verwenden, um einen einzelnen Datensatz einzufügen:

%Vor%

... oder löschen Sie die vorhandenen Datensätze und fügen Sie die Liste in der neuen Reihenfolge erneut ein.

    
OMG Ponies 06.11.2010 20:59
quelle
2

sollten Sie bedenken, dass Sie bei der Verwendung einer verketteten Liste, wenn Sie eine der Positionen neu anordnen möchten, auch andere Datensätze aktualisieren müssen und dies in einer Transaktion erfolgen muss, die überhaupt nicht schnell ist brauche eine Transaktion, weil alle Updates komplett durchgeführt werden müssen oder keiner von ihnen aktualisiert werden muss.
Es gibt eine andere Lösung für dieses Problem, die auf kleinen Listen funktioniert.
Um diese Methode zu verwenden, geben Sie jedem Ihrer Datensätze eine Nummer. zum Beispiel:

%Vor%

Zeilen mit kleinerer Nummer befinden sich am Anfang der Liste und die Zeile mit der größten Nummer ist der letzte Eintrag Ihrer Liste Hier ist der Trick, wenn Sie die Zeile Produkte neu anordnen und zwischen Startseite und Über einfügen möchten Ändern Sie das Feld Nummer Ihres Produkts so, dass es der Zahl zwischen Startseite und Info Nummer
entspricht Die Zahl ist 5 und die Zahl Über ist 10, sodass das Feld Nummer von Produkt (5 + 10) / 2 = 7,5 %Vor%

und jetzt können Sie die endgültige Liste basierend auf dem Feld Nummer sortieren

    
Salar 11.05.2015 08:44
quelle