Es gibt immer eine Debatte über das Thema - "Ob die Geschäftslogik in eine gespeicherte Prozedur gestellt werden soll oder nicht?". Wenn wir uns entscheiden, das ORM-Tool nicht zu verwenden und die Geschäftslogik nicht in die gespeicherte Prozedur aufzunehmen, wo würden wir dann die Geschäftslogik ablegen?
In meinen vorherigen Anwendungen habe ich es immer vorgezogen, die gesamte Geschäftslogik nur in gespeicherten Prozeduren zu speichern. Dann rufe ich aus .NET-Code diese gespeicherten Prozeduren mit Datenzugriffsanwendungsblöcken auf. SQLHelper usw. Dies kann jedoch nicht immer der Fall sein. Also habe ich ein bisschen gegoogelt, war aber verwirrt .......
Irgendwelche Vorschläge ...?
Antworten:
Ich würde einen pragmatischen Ansatz verfolgen - historisch gesehen ist der Hauptvorteil der Beibehaltung der Geschäftslogik in gespeicherten Prozessen aus Leistungsgründen (2,5-Ebenen-Architektur), wohingegen die Trennung der Geschäftslogik in eine BLL-Ebene (3 / N-Ebene) im Allgemeinen sauberer ist als eine Wartungsperspektive und einfacher zu testen (Mock / Stub den Datenzugriff aus).
Angesichts der Tatsache, dass LINQ-fähige .NET-ORMS wie LINQ2SQL, EF und NHibernate jetzt parametrisierte SQL-Abfragen erstellen, in denen Abfragepläne zwischengespeichert werden können, für SQL Injection usw. maskiert werden, würde ich davon ausgehen, dass der Übergang zur 3 / N-Schichtenarchitektur erfolgt überzeugender denn je, und die meisten SPROCs (insbesondere abfrageorientierte) können vollständig vermieden werden. Repository-Muster in .NET machen häufig IQueryable / accept-Ausdrucksbaumparameter verfügbar und ermöglichen einen typsicheren und dennoch flexiblen Zugriff auf Ihre Tabellen. (Persönlich würde ich in SOA-Architekturen IQueryable nicht über die BLL hinaus verfügbar machen, dh Ihre Service- und Präsentationsebenen sollten mit genau definierten Methoden arbeiten. Der Grund dafür ist, dass Sie Ihr System ansonsten niemals vollständig testen können, und Sie haben gewonnen. '
In einem System mit angemessener Größe wird es jedoch immer einige Ausnahmen geben, in denen aus Leistungsgründen möglicherweise noch ein wirklich datenintensiver Code als gespeicherter Prozess geschrieben werden muss. In diesen Fällen würde ich den SPROC beibehalten und den SPROC über den ORM verfügbar machen, aber dennoch die Funktion als Passthrough-Methode für Ihre BLL verfügbar machen.
quelle
Als Java-Entwickler zog ich es vor, Geschäftslogik in die BLL zu integrieren (nette und einfache Quellcodeverwaltung, Vertrautheit usw. usw. usw.).
Nach der Arbeit in einem großen Unternehmen mit vielen verteilten Anwendungen, die verschiedene Technologien verwenden (C #, Java, Pick (nicht fragen)), zeigte sich jedoch ein wesentlicher Vorteil der Verwendung gespeicherter Prozeduren:
Gespeicherte Prozeduren können von verschiedenen Anwendungen gemeinsam genutzt werden .
quelle
Unser Team hat hier eine weiche Regel. Manchmal ist es besser, die Geschäftslogik in T-SQL zu lösen, manchmal ist es einfacher, dies in c # (Business Layer) zu tun.
Wir haben also eine pragmatische Lösung: Platzieren, wo es besser passt. Ich weiß, dass die Theorie manchmal sehr streng ist ... aber das ist die Theorie :-)
quelle
Beides hat meiner Meinung nach Vor- und Nachteile:
Gespeicherte Prozeduren können zu einem Albtraum werden, wenn Sie keine SQL-Quellcodeverwaltung verwenden (was an vielen Orten nicht der Fall ist) und mehrere Entwickler daran arbeiten. Jemand kann eine gespeicherte Prozedur ändern und vergessen, den Code zu aktualisieren, der diese Prozedur aufruft, und bevor Sie wissen, dass Sie gerade eine Site erstellt und bereitgestellt haben, die unbehandelte Ausnahmen auslöst (Parameteranzahl stimmt nicht überein usw.).
Auf der anderen Seite ermöglichen gespeicherte Prozeduren in bestimmten Situationen schnellere Fehlerkorrekturen. Wenn es einen Fehler mit einer gespeicherten Prozedur gibt, beheben Sie ihn einfach und fertig. Eine Fehlerbehebung in einem ORM erfordert eine Neuerstellung. Abhängig von Ihrem Build-Prozess kann dies langwierig / ärgerlich sein.
quelle
Wir legen unsere Geschäftslogik immer in der Geschäftslogikebene ab. Wenn Sie es in die gespeicherte Prozedur einfügen, geht es verloren, sobald Sie Ihr RDBMS ändern.
quelle
"Geschäftslogik" ist ein etwas vager Begriff. Ich meine, es gibt keine einzige Definition. Als Faustregel gilt, die Kommunikation zwischen den Ebenen so gering wie möglich zu halten. Sie müssen also keinen leeren Kundennamen an den Server senden, um ihn vor dem Einfügen einer Zeile zu überprüfen.
Es gibt Fälle, in denen eine Regel auf einem Datenbanklesevorgang basiert. Angenommen, Sie möchten Geld von Konto 1 auf Konto 2 überweisen. Sie müssen beide Konten lesen, sicherstellen, dass sie in gutem Zustand sind und der Betrag auf Konto 1 ausreicht. In diesem Fall ist der Server ein besserer Kandidat für diese Regel, da der Client (der hier der BL ist) keine drei Aufrufe an die Datenbankschicht für diesen Prozess ausgeben muss.
Wenn Sie eine datenbankunabhängige Lösung benötigen, können Sie gespeicherte Prozeduren nur für CRUD erstellen (falls überhaupt verwendet).
quelle
Logik sollte immer in der BLL sein, weil:
Ich glaube, es sollte ein Gesetz geben, das besagt, dass ein SP, der länger als X Zeilen ist, nicht wie beabsichtigt funktioniert.
quelle
Wir erstellen eine Serviceschicht, die alle unsere in der ausgewählten Sprache implementierten Geschäftslogiken enthält und verwenden die Datenbank nur für Abfragen. Dieser Ansatz wird von uns beauftragt, da unser Ziel darin besteht, COTS-Lösungen für die Bereitstellung von Anwendungen mit verschiedenen Datenbankimplementierungen zu erstellen. Der Ruhezustand hat sich unter diesen Umständen als Lebensretter für uns erwiesen.
Ich denke, der größte Vorteil dieses Ansatzes, abgesehen von der Portabilität der Datenbank, ist, dass Sie alle Ihre Antworten in einer Suche finden können.
Außerdem habe ich trotz einiger Antworten auf ein Forum einen Freund, der für eine Fortune-100-Versicherungsgesellschaft arbeitet, die in drei Jahren zwei Datenbankkonvertierungen durchgeführt hat, weil sich die Datenbank der Wahl für das Unternehmen geändert hat.
quelle
Aufgrund meiner begrenzten Erfahrung ziehe ich es vor, die Datenintegrität mit gespeicherten Prozeduren und anderen Datenbankfunktionen aufrechtzuerhalten. Wenn ich beispielsweise eine Überweisung zwischen zwei Konten implementieren würde, würde ich eine gespeicherte Prozedur schreiben. Ich finde es wertvoll, mehrere Anwendungssprachen verwenden zu können.
quelle