Ich habe eine folgende SQL-Tabelle mit Daten
%Vor%Die Anzeigereihenfolge ist sehr unbeständig, sie wird sich häufig ändern, Benutzer fügen hinzu oder entfernen Objekte und ordnen die Elemente neu an.
Wie soll ich mit dieser Situation umgehen, ohne mehrere Datensätze zu aktualisieren? Beispiel: Wenn ein Benutzer ein neues Produkt zwischen 1 und 2 Auftrag eingibt, möchte ich nicht die Reihenfolge aller Datensätze unter 2 aktualisieren und wenn jemand Auftrag 3 zu 4 wechselt, möchte ich nicht jeden Datensatz unter 3 aktualisieren.
Verwende den 'alten Trick', der von alten BASIC-Codierern berühmt gemacht wurde (?) - setze deine Bestellungen auf 100, 200, 300, 400 usw. und dann kannst du dir 'dazwischen' eine Bestellung aussuchen. Dies könnte unordentlich werden - und wenn Sie eine Menge Neuordnung erwarten, dann würde ich empfehlen, dass Sie eine geplante Aufgabe haben, um die Bestellwerte hin und wieder für die gesamte Tabelle neu zu ordnen.
Sie haben zwei Möglichkeiten:
Es gibt keine SQL-Funktionalität, um dies zu vereinfachen, und keine echte Option, die einfach ist.
Eine zweite Antwort auf die gleiche Frage:
Verwenden Sie ein DOUBLE-Feld zum Sortieren und teilen Sie die Differenz zwischen den beiden Werten, zwischen denen Sie einfügen möchten. In jeder Standard-Geschäftsanwendung bezweifle ich sehr, sehr, ob Sie jemals die Anzahl der Einfügungen erreichen werden, über die Sie die Sortierreihenfolgedifferenz nicht auflösen können.
Fügen Sie eine DATETIME-Spalte namens OrderDateTime hinzu. Verwenden Sie diese Spalte (in absteigender Reihenfolge), um "Bindungen" in der Reihenfolge aufzulösen, und aktualisieren Sie sie nur, wenn ein Bestellvorgang stattfindet.
Nehmen Sie in Ihrem Beispiel beispielsweise an, dass alle Zeilen einen OrderDateTime-Wert von gestern haben.
Um nun ein Element zwischen 1 und 2 einzufügen, würden Sie den Order-Wert auf 2 und den Wert von OrderDateTime auf jetzt setzen. Wenn Sie SELECT * FROM ProductList ORDER BY Auftrag ASC, OrderDateTime DESC auswählen, wird das neue Element Nummer 2 vor dem vorhandenen sortiert.
Ähnlich, um Gegenstände 4 und 5 zu tauschen, würdest du Gegenstand 5 aktualisieren, um eine Bestellung von 4 und eine Bestelldatumszeit von jetzt zu haben. Es würde ein aktueller 4 Artikel werden und früher erscheinen.
Sie müssen aufpassen, wenn Sie versuchen, ein Element zwischen zwei anderen Elementen einzufügen, die bereits den gleichen Order-Wert haben, und die OrderDateTime-Wertdifferenz aufteilen.
Sie können stattdessen eine verknüpfte Liste für die Bestellung verwenden (mit einer speziellen Möglichkeit, den Kopf zu identifizieren).
Einfügungen sind ein INSERT und ein UPDATE. Löschungen sind ein DELETE und ein UPDATE. Ein Umzug ist drei UPDATEs. (Verwenden Sie Transaktionen, um sicherzustellen, dass die verknüpfte Liste nicht unterbrochen wird.)
In meinem Fall erlaube ich Benutzern, die Schritte in ihrer Tour neu zu ordnen. Ich habe eine Spalte namens STEP, die sie ändern können, und ich habe eine Spalte namens STEP2 erstellt. Die Spalte STEP2 wird automatisch auf den gleichen Wert wie Schritt aktualisiert. Aber wenn ein Benutzer STEP ändert, ordne ich die vorgeschlagene Änderung und die ursprüngliche Reihenfolge (STEP2) DESC. Nachdem der Benutzer STEP auf den neuen Wert aktualisiert hat, speichere ich in der Datenbank. Dann führe ich einen Prozess aus, um die Schritte neu zu ordnen.
Der Proc ist:
%Vor%StackTable ist ein UDT mit zwei Spalten: Id und Position. Position ist eine IDENTITY-Spalte. Jedes Mal, wenn es erstellt wird, beginnt es mit 1 und wird für jede hinzugefügte Zeile um 1 erhöht.
Basierend auf Larry Lustigs Vorschlag, ein Double zu verwenden, habe ich mir das ausgedacht. Er läuft gegen einen Tisch mit 10K-Reihen und läuft ziemlich schnell. Vorschläge zur Verbesserung der Effizienz sind sicherlich willkommen!
%Vor%Tags und Links sql database-design