Ob die Geschäftslogik in die gespeicherte Prozedur eingefügt werden soll oder nicht?


21

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 ...?


Ich bin voreingenommen -> Gespeicherte Procs immer. Aber dann bin ich voreingenommen. Vergessen Sie agiles Programmieren, die traurige Realität ist, dass Änderungen in der Geschäftswelt immer ad-hoc stattfinden und "sofort" durchgeführt werden müssen. Gespeicherte Prozeduren erlauben das. Es ist ein Lebensretter. Der Versuch, solche Änderungen über die Codebasis vorzunehmen, wäre nicht machbar.
Darknight

4
@ Darknight, hängt stark von Ihrer Plattform und Architektur ab, um eine solche Aussage zu treffen. Ich verstehe nicht, warum das Bereitstellen einer gespeicherten Prozedur in einer Datenbank viel weniger Zeit kostet als beispielsweise das Ausführen eines Erstellungs- und Bereitstellungsskripts, um eine neue WAR-Datei zu erstellen, bereitzustellen und den App-Server neu zu starten.
maple_shaft

7
Gespeicherte Prozeduren - die Klärgrube der Informatik.
Mongus Pong

1
Gespeicherte Prozeduren - ein weiteres Tool wie jedes andere.
Sam yi

Antworten:


15

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.


1
+1 für einfacheres Schreiben von Komponententests auf Anwendungsebene, jedoch haben automatisierte Frameworks für DB-Komponententests einen langen Weg zurückgelegt.
maple_shaft

14

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 .


Sehr guter Punkt
NoChance

1
Dies ist sehr richtig, und wir nutzen es, um unsere Umwelt positiv zu beeinflussen. Das Teilen von Code mithilfe der Datenschicht erschien mir jedoch immer etwas gefährlich. Wenn Sie mehrere Konsumenten einer bestimmten Logik / Dateneinheit haben, dann würde ich lieber einen Dienst davor stellen, als mehrere Konsumenten derselben Datenbank zu haben.
RationalGeek

2
Wenn Sie Ihre Datenverwaltung in Bibliotheken aufteilen, können diese Bibliotheken theoretisch auch für verschiedene Anwendungen freigegeben werden ...
glenatron 10.10.11

2
Ich stimme teilweise zu. Alle diese Technologien greifen direkt auf die Datenbank zu. Sie verwenden also gespeicherte Prozeduren, um gemeinsamen Code zwischen ihnen zu teilen. Sie könnten das gleiche Problem genauso gut lösen, indem Sie eine mittlere Ebene haben und die heterogenen Lösungen auf Ihre mittlere Ebene anstatt auf Ihre Datenbank zugreifen, und diese mittlere Ebene teilt sich diesen Code.
Ekevoo

1
Zu Ihrer Information, diese Antwort ist Quatsch, 6 Jahre später - nur Daten werden in der Datenbank gespeichert. Wenn Sie Logik einbauen, haben Sie eine Menge Ärger auf der ganzen Linie. Erstellen Sie einfach einen Microservice in der Sprache Ihrer Wahl, der auf die Datenbank zugreift.
NimChimpsky

6

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 :-)


2
Sicher ist das die schlechteste Lösung von allen? Woher weiß ein Entwickler, in dem die Logik gespeichert ist? Ich würde mir vorstellen, dass es sich manchmal auch in die Anwendungsschicht hineinschleicht, oder noch schlimmer, in die Benutzeroberfläche?
Paul T Davies

2
Nee. Es geht immer um Business Layer oder T-SQL. Herauszufinden, wo die Logik gespeichert ist, ist wahrscheinlich das kleinste Problem bei der Wartung.
gsharp

Was passiert, wenn jemand dem Team beitritt und Sie ihm diese Regel mitteilen? Woher sollen sie wissen, wo etwas "besser passt"? Dies scheint mir fast eine Nicht-Regel zu sein. Sehr subjektiv bezogen auf den Einzelnen.
RationalGeek

3
Komm schon Jungs, mein Ernst? Wir beschäftigen Menschen mit Denkvermögen und Erfahrung. Dann haben sie einen Mund, um zu fragen und sich zu unterhalten. Ich kann sagen, dass unsere Software sehr wartungsarm ist und dass neue Funktionen von fast jedem in unserem Team problemlos implementiert werden können. kann nicht so falsch sein, was wir tun.
gsharp

4
Ich sehe wirklich keinen Sinn darin, c # für Dinge zu missbrauchen, die SQLServer so viel besser kann, und umgekehrt.
gsharp

3

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.


+1 für die Notwendigkeit der Quellcodeverwaltung mit gespeicherten Prozessen, wenn Sie sie stark verwenden werden. Viele Datenbankadministratoren, mit denen ich gearbeitet habe, sind gegen diese Idee sehr resistent.
RationalGeek

2

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.


16
Das Letzte, was sich ändert, ist das RDBMS ;-)
gsharp

Bedeutet dies, dass Sie die gespeicherte Prozedur auf das Abrufen, Aktualisieren und Einfügen der Daten beschränken?
Pravin Patil

1
In Wirklichkeit ist jedes große System, das ich gesehen habe, die Datenbank das System. Programmiersprachen werden an dieser Stelle fast irrelevant, da sie nur das "Front-End" sind.
Darknight,

2
@gsharp, das stimmt nicht immer. Sie möchten möglicherweise ein anderes RDBMS wie Oracle hinzufügen oder das vorhandene vollständig ersetzen. In einigen Fällen möchten Sie auch echte Daten durch Dummy-Daten ersetzen.
Sljaker

2
@ šljaker das stimmt natürlich nicht immer. Es ist jedoch wahrscheinlicher, dass sich das Programm ändert (Neugestaltung der Software, neue Programmiersprachen usw.) als die DB.
gsharp

2

"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).


1

Logik sollte immer in der BLL sein, weil:

  • Es kann richtig getestet werden
  • Wenn SQL 20XX veraltet ist und Sie auf die neueste Version wechseln müssen, müssen Sie Ihren Code nicht neu schreiben.
  • Die Menschen sind nicht versucht, spontan Änderungen vorzunehmen (was als Argument für SPs angeführt zu werden scheint).
  • SPs sind meiner Erfahrung nach die größte Fehlerquelle für Entwickler, insbesondere nach einigen Generationen von Wartung / Änderungen.

Ich glaube, es sollte ein Gesetz geben, das besagt, dass ein SP, der länger als X Zeilen ist, nicht wie beabsichtigt funktioniert.


Was ist los mit Änderungen im laufenden Betrieb? Wenn eine gespeicherte Prozedur einen Fehler enthält und dieser leicht zu beheben ist, beheben Sie ihn. Es ist positiv, weil es bedeutet, dass Sie keine Neuveröffentlichung für etwas Triviales durchführen müssen. Solange die Leute nicht anfangen, Fehler im Code zu maskieren, indem sie gespeicherte Prozeduren ändern, sehe ich kein Problem.
AndrewC

Mit Änderungen im laufenden Betrieb meine ich Dinge, die nicht getestet wurden und die keinem formellen Freigabeverfahren folgen. Und ja, sp-Änderungen an Masken-Code-Bugs habe ich einiges gesehen.
Paul T Davies

0

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.


0

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.