Geschäftslogik in gespeichertem Prozess gegen mittlere Schicht (c #)

7

Dies ist eher eine Architekturfrage. Ich habe einmal bei einem Finanzunternehmen gearbeitet, das eine Webanwendung hatte.

Front-End-Javascript.
Die mittlere Schicht war WebAPI für den Zugriff auf den Backend-SQL Server.
Back-End-SQL Server-Datenbank.

Das Unternehmen hat seine gesamte Geschäftslogik in gespeicherte Prozeduren gesteckt. Nachdem ich mit anderen Unternehmen gesprochen hatte, hörte ich, dass die meisten ihre Geschäftslogik in die mittlere Ebene stellten.

Ich habe einmal jemanden bei der Finanzfirma gefragt, warum es so viele gespeicherte Prozesse gibt, aber keine gute Antwort bekommen. Kürzlich fragten sie bei einem Vorstellungsgespräch, welche Vor- und Nachteile es habe, die gesamte Geschäftslogik in der Datenbank gegenüber der mittleren Ebene abzulegen. Ich hatte keine gute Antwort.

Kann jemand einige Gedanken darüber machen, warum dies eine gute Idee ist oder nicht?

Nanonerd
quelle

Antworten:

16

A) Skalieren Die mittlere Ebene kann einfach skaliert werden - daher das Webfarm-Konzept. Das Skalieren der DB-Ebene ist viel schwieriger. Während einige Produkte können dies tun , ist es noch nicht trivial und Mainstream.

B) Kosten In der Regel handelt es sich bei Webservern um Common-or-Garden-Boxen. DB-Server sind jedoch tendenziell größer, komplexer und belastbarer. Dies alles bedeutet "teuer". Ein kürzlich veröffentlichter Arbeitgeber schätzte, dass ein CPU-Tick in der Datenbank zehnmal teurer war als einer auf einem Anwendungsserver.

C) Die in einer gespeicherten Prozedur enthaltene Wiederverwendungslogik kann nicht einfach mit einer eigenständigen mobilen App verknüpft werden. Das Ändern des SP wirkt sich auf jede Anwendung aus, die diese Datenbank verwendet, unabhängig davon, ob diese Anwendung für die Änderung bereit ist oder nicht.

D) Die in einer gespeicherten Prozedur enthaltene Wiederverwendungslogik ist allen Anwendungen gemeinsam, die die Datenbank verwenden. Programmierer können die Regeln nicht aus einer Laune heraus umgehen. Das Ändern des SP wirkt sich auf jede Anwendung aus, die diese Datenbank verwendet, und stellt die Konsistenz im gesamten Unternehmen sicher.

E) Tools In der Anwendungsebene stehen mehr und ausgefeiltere Sprachen, Tools und Techniken für die Entwicklung zur Verfügung als in der Datenbank (aus Kommentaren, danke).

F) Netzwerkverkehr Normalerweise erfordert eine Geschäftsfunktion viele Lese- und / oder Schreibvorgänge. Oft ist die Ausgabe einer Anweisung die Eingabe einer folgenden Anweisung. Wenn SQL-Anweisungen in der Anwendung enthalten sind, erfordert jede einen Netzwerk-Roundtrip zum Server. Wenn die SQL in einer gespeicherten Prozedur gespeichert ist, erfolgt eine einzelne Netzwerkreise, bei der die Parameter gesendet und nur das Endergebnis zurückgesendet werden. Die Netzwerkkosten der Zwischenergebnisse werden vermieden.

Michael Green
quelle
1
Gute Argumente. Es ist auch einfacher, die Quellcode-Versionierung zu verwenden, z. B. Git auf der mittleren Ebene als auf dem SP.
Topher
1
Ich würde hinzufügen, dass es viel einfacher ist, etwas in der Anwendungsschicht zu debuggen, als einen gespeicherten Prozess in der Datenbankschicht.
Nick
Neben dem, was @nick über das Debuggen gesagt hat, möchte ich auch hinzufügen, dass Logik in SQL sehr unhandlich wird. Es ist schwieriger, die Logik in kleinere Funktionen zu unterteilen und diese entsprechend zu erweitern. Außerdem ist Ihre einzige reale Datenstruktur eine Tabelle, die einschränkend sein kann.
Kris Harper
@topher Ich wäre neutral in Bezug auf den Quellcodeverwaltungspunkt. Meine Teams hatten immer ausführbare Dateien (SP, Funktionen, Trigger) in der Quellcodeverwaltung und stellten sie wie jeden anderen Code bereit. Natürlich kann jeder mit Zugriff einen SP außerhalb des Freigabeprozesses ändern, aber das gilt auch für den Anwendungscode.
Michael Green
@ Nick True. Während SQL Server Management Studio über einen schrittweisen Debugger verfügt, sind prozedurale Sprachanweisungen viel detaillierter als SQL, sodass es einfacher ist, einzelne problematische Werte zu isolieren. Auf der anderen Seite müssen viel mehr prozedurale Aussagen durchlaufen werden, um die entsprechende Funktionalität abzudecken, damit mehr Verwirrung oder Nebenwirkungen entstehen.
Michael Green