Diese Frage ist eigentlich eine Reihe von Problemen mit Ihrem Datenmodell, die in einem zusammengefasst sind. Sie müssen sie nacheinander entwirren. Natürlichere, intuitivere Lösungen fallen heraus, wenn Sie versuchen, jedes Teil des Puzzles zu vereinfachen.
Problem 1: Sie können sich nicht auf DB Order verlassen
Ihre Beschreibungen zum Sortieren Ihrer Daten sind nicht eindeutig.
- Das größte potenzielle Problem besteht darin, dass Sie in Ihrer Datenbank keine explizite Sortierung über eine
ORDER BY
Klausel angeben. Wenn dies nicht der Fall ist, weil es zu teuer erscheint, hat Ihr Programm einen Fehler . Datenbanken können Ergebnisse in beliebiger Reihenfolge zurückgeben, wenn Sie keine angeben. Sie können sich nicht darauf verlassen, dass zufällig Daten in der Reihenfolge zurückgegeben werden, nur weil Sie die Abfrage einige Male ausgeführt haben und es so aussieht. Die Reihenfolge kann sich ändern, weil Zeilen auf der Festplatte neu angeordnet werden oder einige gelöscht werden und neue an ihre Stelle treten oder ein Index hinzugefügt wird. Sie müssen eine ORDER BY
Klausel angeben . Geschwindigkeit ist wertlos ohne Richtigkeit.
- Es ist auch nicht klar, was Sie unter Einfügereihenfolge verstehen. Wenn Sie über die Datenbank selbst sprechen, müssen Sie eine Spalte haben, die dies tatsächlich verfolgt, und sie muss in Ihrer
ORDER BY
Klausel enthalten sein. Ansonsten hast du Bugs. Wenn eine solche Spalte noch nicht existiert, müssen Sie eine hinzufügen. Typische Optionen für Spalten wie diese wären eine Einfügezeitstempelspalte oder ein automatisch inkrementierender Schlüssel. Der automatische Inkrementierungsschlüssel ist zuverlässiger.
Problem 2: Effizientes Sortieren im Speicher
Sobald Sie es sicherstellen , dass garantierte Daten in der Reihenfolge zurückkehren Sie erwarten, können Sie diese Tatsache nutzen , in Erinnerung zu machen Sorten viel effizienter. Fügen Sie der Ergebnismenge Ihrer Abfrage einfach eine row_number()
oderdense_rank()
-Spalte (oder das Äquivalent Ihrer Datenbank) hinzu. Jetzt hat jede Zeile einen Index , der Ihnen einen direkten Hinweis darauf gibt, wie die Reihenfolge lauten soll, und Sie können trivial danach sortieren. Stellen Sie einfach sicher, dass Sie dem Index einen aussagekräftigen Namen geben (wie sortedBySomethingIndex
).
Viola. Jetzt müssen Sie nicht mehr auf die Reihenfolge der Datenbank-Ergebnismenge angewiesen sein.
Problem 3: Müssen Sie diese Verarbeitung überhaupt in Code ausführen?
SQL ist eigentlich sehr mächtig. Es ist eine erstaunliche deklarative Sprache, mit der Sie viele Transformationen und Aggregationen Ihrer Daten durchführen können. Die meisten DBs unterstützen heutzutage sogar zeilenübergreifende Operationen. Sie werden Fenster- oder Analysefunktionen genannt:
Haben Sie selbst müssen Ihre Daten in den Speicher so ziehen? Oder können Sie die gesamte Arbeit in der SQL-Abfrage mithilfe von Fensterfunktionen ausführen? Wenn Sie alle (oder nur einen wesentlichen Teil) der Arbeit in der DB erledigen können, fantastisch! Ihr Code-Problem verschwindet (oder wird viel einfacher)!
Problem 4: Was machst du damit data
?
Angenommen, Sie können nicht alles in der DB erledigen, lassen Sie mich das klarstellen. Sie nehmen die Daten als Map (die von Dingen codiert wird, nach denen Sie nicht sortieren möchten), iterieren dann in der Einfügereihenfolge darüber und ändern die Map an Ort und Stelle, indem Sie den Wert einiger Keys ersetzen und hinzufügen neue?
Es tut mir leid, aber was zum Teufel?
Anrufer sollten sich darüber keine Sorgen machen müssen . Das von Ihnen erstellte System ist äußerst instabil. Es braucht nur einen blöden Fehler (vielleicht sogar von Ihnen selbst gemacht, wie wir es alle getan haben), um eine kleine falsche Änderung vorzunehmen, und das Ganze bricht zusammen wie ein Kartenspiel.
Hier ist vielleicht eine bessere Idee:
- Lassen Sie Ihre Funktion a akzeptieren
List
.
- Es gibt verschiedene Möglichkeiten, um das Bestellproblem zu lösen.
- Übernehmen Schnell fehlschlagen. Wirf einen Fehler, wenn die Liste nicht in der Reihenfolge ist, die die Funktion erfordert. (Hinweis: Anhand des Sortierindex aus Problem 2 können Sie feststellen, ob dies der Fall ist.)
- Erstellen Sie selbst eine sortierte Kopie (wieder mit dem Index aus Aufgabe 2).
- Finden Sie eine Möglichkeit, die Karte selbst in der richtigen Reihenfolge aufzubauen.
- Erstellen Sie die Map, die Sie benötigen, intern für die Funktion, damit sich der Anrufer nicht darum kümmern muss.
- Nun iterieren Sie über alles, was Sie in der Auftragsdarstellung haben, und tun, was Sie tun müssen.
- Geben Sie die Karte zurück oder wandeln Sie sie in einen geeigneten Rückgabewert um
Eine mögliche Variante könnte darin bestehen, eine sortierte Darstellung zu erstellen und dann eine Zuordnung der Schlüssel zum Index zu erstellen . Auf diese Weise können Sie Ihre sortierte Kopie ändern, ohne versehentlich Duplikate zu erstellen.
Oder vielleicht ist dies sinnvoller: Befreien Sie sich von dem data
Parameter und lassen Sie processData
seine eigenen Daten abrufen. Sie können dann dokumentieren, dass Sie dies tun, da es sehr spezielle Anforderungen an die Art und Weise gibt, in der die Daten abgerufen werden. Mit anderen Worten, machen Sie die Funktion zum Eigentümer des gesamten Prozesses, nicht nur eines Teils davon. Die gegenseitigen Abhängigkeiten sind zu stark, um die Logik in kleinere Abschnitte aufzuteilen. (Ändern Sie den Namen der Funktion im Prozess.)
Möglicherweise arbeiten diese nicht für Ihre Situation. Ich weiß es nicht ohne vollständige Details des Problems. Aber ich kenne ein fragiles und verwirrendes Design, wenn ich eines höre.
Zusammenfassung
Ich denke, das Problem hier ist letztendlich, dass der Teufel im Detail steckt. Wenn ich auf diese Weise auf Probleme stoße, habe ich normalerweise eine unangemessene Darstellung meiner Daten für das Problem, das ich tatsächlich zu lösen versuche. Die beste Lösung ist , eine bessere Darstellung zu finden , und dann wird mein Problem einfach (vielleicht nicht einfach, aber unkompliziert) zu lösen.
Finden Sie jemanden, der diesen Punkt versteht: Ihre Aufgabe ist es, Ihr Problem auf eine Reihe einfacher, unkomplizierter zu reduzieren. Dann können Sie robusten, intuitiven Code erstellen. Rede mit ihnen. Guter Code und gutes Design lassen Sie denken, dass jeder Idiot sie sich ausgedacht haben könnte, weil sie einfach und unkompliziert sind. Vielleicht gibt es einen erfahrenen Entwickler, mit dem Sie sich austauschen können.