Ich bin mir sicher, dass ich nicht der einzige bin, der frustriert ist, wenn er eine Seite mit Code sieht, der mit SQL-Abfragen übersät ist. Das ActiveRecord-Muster und andere ORM-Muster tragen dazu bei, die in einem Projekt verwendete SQL-Menge zu verringern. In vielen Fällen komplexer Abfragen scheint die Verwendung von SQL jedoch unvermeidlich zu sein.
Ich bin auf der Suche nach Meinungen darüber, wie SQL-Abfragen mit dem Rest des Codes (oder extern dazu) organisiert werden sollten, um zu verhindern, dass er über den gesamten Bereich verteilt wird. Eine naheliegende Idee ist die Verwendung von Ansichten, aber häufig können Ansichten bei der Verarbeitung mehrerer großer indizierter Tabellen usw. zu Leistungsproblemen führen.
EDIT 1 - Ich gehe davon aus, dass Sie es bereits in die Modellebene getrennt haben
quelle
Antworten:
Für mich ist SQL ein grundlegender Teil (in vielen Fällen die Mehrheit) des Geschäftslogikcodes. Wenn Sie versuchen, den Code von dem Code zu trennen, der für die zurückgegebenen Daten verwendet wird, besteht die Gefahr, dass die Verständlichkeit und Wartbarkeit des Codes beeinträchtigt wird.
Wenn ich es mir anschaue, wie Daten gelesen, verarbeitet, geschrieben oder durchsucht werden, handelt es sich um ähnliche Vorgänge, die sich am besten am selben Ort befinden.
Wenn Sie feststellen, dass Abfragen doppelt ausgeführt werden, benötigen Sie möglicherweise eine Datenbankansicht oder ein Objekt, das diesen Aspekt des Datenbankzugriffs kapselt.
Ein weiterer Tipp ist eine gute Datenbankabfragemethode. In der Software, die ich schreibe (PostgreSQL, MySQL, SQL Server), habe ich sichergestellt, dass der Großteil meiner Abfrageoperationen als einzelne Code-Anweisung ausgeführt werden kann.
Dies sind (ungefähr) die Hauptfunktionsaufrufe, die ich als Teil meines "Verbindungsobjekts" sicherstelle. Es hängt von der Sprache ab, was Sie tatsächlich implementieren, aber es geht mir darum, es wirklich, wirklich einfach und schmerzlos zu halten.
Zusammenfassend lässt sich sagen, dass SQL ein nativer Bestandteil der Programmierung ist und nicht der Abstraktion zuliebe abstrahiert wird.
quelle
Im Allgemeinen ist eine separate Modellebene der beste Ansatz. Es gibt eine Reihe von Enterprise-Design-Mustern , mit denen dies möglich ist.
quelle
Es könnte eine gute Idee sein, die Modellebene in drei Unterebenen zu unterteilen: "Entities", "Repositories" und "Services". Auf diese Weise können Sie Bedenken voneinander trennen und SQL aus Ihrer Geschäftslogik heraus an einem Ort sammeln.
In diesem Szenario befindet sich der gesamte Datenabrufcode, einschließlich komplexer SQL-Anweisungen, in Repositorys. Ziel von repository ist es also, komplexe SQL-Anweisungen hinter selbsterklärenden Methoden wie zu verstecken
getUsersWithActiveSubscription()
.Entität abstrahiert echte DB-Tabellenfeldnamen mit Gettern und Setzern und bietet möglicherweise eine Datenkonvertierung zwischen DB-Feldtypen und Typen, die in Ihrer Anwendung / Programmiersprache verfügbar sind. Wenn Ihr ORM dies unterstützt, können Entitäten mit Assoziationen umgehen.
Die Serviceschicht ist der Ort für die Geschäftslogik. Der Dienst ruft Entitäten mithilfe von Repositorys ab, verarbeitet sie und speichert sie zurück.
quelle