Ich versuche mir den besten Weg zu überlegen, um Folgendes zu tun:
Ich habe eine Liste von Aufgaben in der Datenbank gespeichert. Einer Aufgabe ist eine Priorität zugewiesen. Sie können die Priorität einer Aufgabe ändern, um die Reihenfolge zu ändern, in der sie ausgeführt werden soll.
Ich denke an etwas sehr Ähnliches wie Pivotal Tracker.
Stellen Sie sich vor, wir hätten Folgendes:
1 Task A
2 Task B
3 Task C
4 Task D
5 Task E
Wir entscheiden, dass E jetzt die wichtigste Aufgabe ist
1 Task E
2 Task A
3 Task B
4 Task C
5 Task D
Ich muss alle 5 Aufgaben aktualisieren, um ihnen eine neue Priorität zu geben.
Wenn Aufgabe B dann wichtiger wird als KI, hätte ich sie
1 Task E
2 Task B
3 Task A
4 Task C
5 Task D
Ich muss nur Aufgabe B und A aktualisieren.
Wie würde dies in einer DB strukturiert werden? Ich stelle mir vor, dass Sie verschiedene Projekte in derselben Tabelle haben würden, die ihr eigenes Gewicht hätten.
Wäre es besser, auf eine Aufgabe zu verweisen, die danach stattfindet (ein bisschen wie eine Linkliste).
Dies ist wirklich nur ein Brain Dump. Ich habe mich nur gefragt, wie Sie so etwas implementieren würden.
Wir haben genau das getan, wovon Sie sprechen. Wir haben dazu eine gespeicherte Prozedur verwendet, mit der die Liste der Elemente neu angeordnet wurde. Jeder Artikel in der Liste hatte eine eindeutige ID und eine Sortierreihenfolge.
Zum Beispiel:
Die gespeicherte Prozedur, die die Elemente neu anordnet, benötigt zwei Eingabeparameter:
Wir haben eine temporäre Tabelle verwendet, um die Artikel in der neuen Reihenfolge zu speichern:
Wir haben drei select-Anweisungen verwendet, um sie in die neue Reihenfolge zu bringen:
Anschließend haben wir die Basistabelle (tblTasks) mit der neuen Sortierreihenfolge aktualisiert, die eigentlich die RowId- Identitätsspalte der temporären Tabelle ist:
Dies funktioniert jedes Mal wie ein Champion.
quelle
Ich habe das noch nicht durchdacht ..... Aber warum nicht einfach Dezimalstellen zulassen, damit Sie Dinge zwischen andere stopfen können, ohne alles zu aktualisieren?
Sie könnten etwas zwischen 1 und 2 mit dem Wert 1,5 zerquetschen.
Ich würde auch Min- und Max-Werte vermeiden. Lassen Sie Zahlen in die Negative rollen, wenn ihre Priorität vor der aktuellen 0 liegt.
Sie können in Betracht ziehen, eine "menschliche Anzeige" -Priorität von den internen "Ordnungs" -Prioritäten zu trennen, um zu vermeiden, dass seltsame Dezimalstellen und negative Werte angezeigt werden.
quelle
Es ist sehr vernünftig, eine verknüpfte Liste und ihre Operationen in einem RDBMS zu implementieren. Ersetzen Sie einfach Array- und Referenzmanipulationen durch SQL-Abfragen. Ich bin mir jedoch nicht sicher, ob dies wirklich der effizienteste Weg ist, da für einige einfache Vorgänge viele SQL-Abfragen erforderlich sind
Für die Aufgabentabelle fügen Sie der ID-Spalte derselben Tabelle eine Spalte "next_task" und "prev_task" hinzu, die Fremdschlüssel sind (vorausgesetzt, ein "-1" entspricht NULL).
Geben Sie die Aufgabe mit der höchsten_priority () : SQL-Abfrage zurück, die die Aufgabe mit prev_task = -1 zurückgibt
E ist die wichtigste Aufgabe : SQL-Abfrage, die die next_task von E in die ID der Aufgabe mit der höchsten Priorität ändert. Und ändert prev_task von E in -1 ...
Diese und andere Vorgänge wie das Setzen von E vor A oder das Drucken einer geordneten Liste von Aufgaben erfordern viel mehr SQL-Abfragen, die alle atomar sein sollten (es sei denn, Sie können optimieren). Es ist eine gute Übung, aber vielleicht nicht die effizienteste.
quelle
Ein anderer Ansatz für das Prioritätsproblem wäre die Angabe, welcher Artikel wichtiger ist als der Artikel. In einer HR-Anwendung wäre dies so, als würde man sagen, wer der Manager eines Mitarbeiters ist.
Lesen Sie dann diese http://blog.sqlauthority.com/2012/04/24/sql-server-introduction-to-hierarchical-query-using-a-recursive-cte-a-primer/ , um eine Abfrage mit Priorität durchzuführen Ebenen.
Ich denke, dies ist eine einfachere Benutzererfahrung beim Festlegen von Prioritäten, aber es ermöglicht mehrere Prioritäten auf derselben Ebene.
quelle
Ein einfacher Weg wäre, mit so etwas zu beginnen:
Um dann "Aufgabe E" zwischen Aufgabe A und Aufgabe B zu verschieben, setzen Sie beispielsweise die Priorität von "Aufgabe E" auf einen halben Weg zwischen Aufgabe A und Aufgabe B (in diesem Fall "150").
Wenn Sie die Prioritäten ständig neu anordnen, stoßen Sie natürlich irgendwann auf ein Problem, bei dem zwei benachbarte Aufgaben keine "Lücke" zum Einfügen neuer Einträge haben. In diesem Fall können Sie einfach alle Prioritäten auf einmal auf 100, 200, 300 usw. zurücksetzen.
quelle
Ich bin kein Datenbank-Guru, daher habe ich dies so logisch wie möglich in Access 2010 gelöst. Ich habe ein Feld "Priorität", das ein numerisches Feld ist. Dann habe ich eine Veranstaltung für dieses Feld.
Das Ereignis ist ein Ereignis nach der Aktualisierung für das Feld "Priorität", das eine Aktualisierungsabfrage "qryPriority" auslöst, um 1 zur Prioritätsnummer aller anderen Datensätze hinzuzufügen, deren Priorität größer oder gleich der gerade eingegebenen Prioritätsnummer ist.
Hier ist der Ereignis-VB-Code und Update Query SQL:
Ereignis "Priorität" VB-Code:
"qryPriority" Update Query SQL:
quelle