Normalerweise werde ich ein int oder smallint Spalt mit dem Namen etwas wie ‚Ordinal‘ oder ‚PositionOrdinal‘ hinzufügen, wie Sie vorschlagen, und mit dem genauen Vorbehalt erwähnen Sie — die Notwendigkeit, eine potenziell bedeutende Anzahl von Aufzeichnungen eines einzelnen jedes Mal zu aktualisieren Datensatz wird neu geordnet.
Der Vorteil ist, dass ein Schlüssel für eine bestimmte Aufgabe gegeben und eine neue Position für diese Aufgabe, der Code ein Element ist nur zwei Aussagen zu bewegen:
UPDATE `Tasks` SET Ordinal= Ordinal+1 WHERE Ordinal>[email protected]
UPDATE `Tasks` SET Ordinal= @NewPosition WHERE TaskID= @TaskID
Es gibt noch andere Vorschläge für eine doppelt verknüpfte Liste oder lexikalische Reihenfolge. Beide können schneller sein, aber auf Kosten von viel komplizierterem Code, und die Leistung spielt nur dann eine Rolle, wenn Sie eine Menge von Artikeln in derselben Gruppe haben.
Ob Leistung oder Code-Komplexität wichtiger ist, hängt von Ihrer Situation ab. Wenn Sie Millionen von Datensätzen haben, könnte sich die zusätzliche Komplexität lohnen.Normalerweise bevorzuge ich jedoch den einfacheren Code, da Benutzer normalerweise nur kleine Listen per Hand bestellen. Wenn es nicht so viele Elemente in der Liste gibt, spielen die zusätzlichen Aktualisierungen keine Rolle. Dies kann in der Regel Tausende von Datensätzen ohne spürbare Auswirkungen auf die Leistung behandeln.
Die einzige Sache, die Sie bei Ihrem aktualisierten Beispiel beachten sollten, ist, dass die Spalte nur zum Sortieren verwendet wird und ansonsten nicht direkt dem Benutzer angezeigt wird. Wenn Sie also ein Objekt von oben nach unten ziehen, müssen Sie nur diesen einen Datensatz ändern. Es spielt keine Rolle, dass Sie die erste Position leer lassen. Dies bedeutet, dass es ein geringes Potenzial gibt, Ihre Integer-Sortierung mit ausreichender Nachbestellung zu überfließen, aber lassen Sie mich noch einmal sagen: Benutzer bestellen normalerweise nur kleine Listen von Hand. Ich habe noch nie von diesem Risiko gehört, das tatsächlich ein Problem verursacht hat.
In diesem Beispiel müssten Sie nicht alle Positionen aktualisieren. Wenn Sie die Aufzeichnung 1 auf Position 6 setzen, sind Sie gut. Ein besseres Beispiel könnte sein, den unteren Rekord an die Spitze zu ziehen. –