Rückblick auf andere Antworten
Hier ist eine kurze Zusammenfassung dessen, was andere hier zuvor gesagt haben.
Pro Unternehmenspolitik:
- Ermöglicht das Verfolgen von Abhängigkeiten zwischen Datenbankobjekten und die Übersicht darüber, wie sich geplante Änderungen auf das Schema auswirken.
- Das DBA-Team kann die Zugriffsrechte für Anwendungen überprüfen und steuern.
- Das DBA-Team kann die Auswirkungen von Änderungen auf die Leistung vorhersagen.
- Entkoppelt Datenbank vom Anwendungscode;
- Theorie des zerbrochenen Fensters ... das heißt, auf diese Weise organisieren sie ihren Code, und wenn die Konsistenz gebrochen wird, ist die Infrastruktur für Neuankömmlinge schwerer zu erfassen, wodurch sie weniger Respekt haben und weniger nach Qualität streben.
- Sie erhalten Ihren Gehaltsscheck, um das zu tun, worum Sie gebeten wurden. Dies ist eine Unternehmensrichtlinie, und Sie sind derzeit nicht befugt, diese zu ändern. Leben Sie also besser damit.
Gegen Unternehmenspolitik:
- Diese Unternehmensphilosophie ist sehr starr und dogmatisch, und die Richtlinien machen die Arbeit der Entwickler unnötig umständlich. Siehe leider den letzten Punkt im Abschnitt "Profis".
- Da back2dos darauf verweist, indem es sagt: "Für jede Abfrage an die Datenbank müssen Sie die gespeicherte Prozedur nachschlagen " , führt eine Nur-Sprocs-Richtlinie häufig zu einer Codeduplizierung, da verschiedene Entwickler keine Ahnung haben, welche Sprocs für ihre wiederverwendet werden könnten Problem zur Hand;
- Ironischerweise verursacht das Gegenteil zum vorherigen Fall auch Probleme, wenn eine Anwendung einen Sproc besitzt, eine andere ihn wiederverwendet und die erste ihn aktualisiert, ohne zu wissen, wer sich sonst darauf verlassen hat. DBAs verfolgen die Abhängigkeiten nicht weiter als bis zu den Wänden des DB-Serverraums. Erwarten Sie also nicht, dass es ihnen egal ist, welche App von was außerhalb davon abhängt. Wenn die Anwendungsteams es nicht untereinander verfolgen, was ihr Problem ist, werden die Datenbankadministratoren abgedeckt.
DIESE 2 CENT
Erstens verwenden viele Antworten hier das Wort Standard . Die Praxis, direkte Abfragen zu verbieten und nur Sprocs zuzulassen, wird nicht als Standard bezeichnet. Es ist eine Politik (siehe die Antwort von jzd ).
Zweitens, spezifisch für Ihr Problem: Mein Hauptgegenargument gegen eine solche restriktive Richtlinie, ausschließlich gespeicherte Prozeduren zu verwenden, wäre die SQL-Sprache selbst und nicht unbedingt die zentralisierte Repository-Infrastruktur für Geschäftslogik, die sie fördert (obwohl dies auch Gegenargumente hat). .
SQL ist eine ziemlich starre und nicht zusammensetzbare Sprache mit sehr begrenzter Ausdruckskraft . Dies bedeutet, dass Sie in Bezug auf die Wiederverwendbarkeit von Code sehr früh in eine Sackgasse geraten . Einer der Gründe für diese Starrheit ist, dass es keine Möglichkeit gibt, erstklassige Funktionen in irgendeiner Weise zu übergeben (wie bei OOP-Sprachen, die Polymorphismus verwenden), was die Kompositionsfähigkeit erheblich einschränkt . Das, was Sie an Ausdruckskraft am nächsten bringen können, ist das Schreiben dynamischer SQL-Abfragen, die mithilfe der Zeichenfolgenverkettung erstellt wurden. Keine nette Sache. Dynamische Abfragen beseitigen einige der Punkte im Abschnitt "Profis", wie z. B. die Tracking-Abhängigkeiten zwischen DB-Objekten, und weisen normalerweise eine schlechtere Leistung auf, sind fehleranfällig, schwer zu debuggen und erhöhen dieRisiko von SQL-Injection-Angriffen . Leider werden Sie mit SQL feststellen, dass Sie mit dem Extrahieren gemeinsamer wiederverwendbarer Logik zwischen Sprocs nicht weit kommen können, ohne die Wand zu treffen und gezwungen zu sein, auf dynamisch ausgeführte Abfragen zurückzugreifen.
UPDATE: Eine weitere große Einschränkung gespeicherter Prozeduren neben der erstklassigen Funktion ist das Übergeben und Zurückgeben von zusammengesetzten Datentypen als Argumente, unabhängig davon, ob es sich um Listen, Mengen, Datensätze oder Schlüssel-Wert-Paare handelt. Dies schadet der Kompositionsfähigkeit ebenfalls sehr.
Schließlich stimme ich nicht unbedingt einem der oben genannten Pro- Punkte zu, der "Entkopplung der DB von der Anwendung" von Jorge : Das Hauptprinzip, das meiner Meinung nach hier gilt, besteht darin, primitive Datenstrukturen mit einer großen Anzahl gemeinsamer wiederverwendbarer und zusammensetzbarer Operationen zu bevorzugen. anstatt mit benutzerdefinierten APIs zu arbeiten . Sprocs sind hier solche benutzerdefinierten APIs , die zwischen dem Benutzer und den primitiven relationalen Daten stehen, um sie unter Verwendung allgemeiner Grundelemente für die Manipulation zusammensetzbarer Daten abzufragen ( auswählen, verbinden, wo, gruppieren nach, usw). Jetzt ist SQL selbst aufgrund der oben genannten Starrheit nicht die ideale Wahl, um DSL für zusammensetzbare Datenmanipulationsprimitive zu sein, aber mit einer vernünftigeren Sprachwahl (wie .NET Linq ... oder Lisp / Clojure!) Könnten Sie Ihre ausführen Logik gegen eine einfache Liste genauso wie gegen ein DB ResultSet. Das macht es natürlich leicht testbar, was eine gute Sache ist. Ich sage, bevorzugen Sie, dass Ihr Datenspeicher einfach und primitiv dumm ist, so dass er mit einfachen CSVs gestoppt werden kann. Wie Sie sehen, entkoppelt dieses Modell auch DB von der Anwendung, nur zeichnet es die Linie auf einer niedrigeren Abstraktionsebene.
WAS MACHT MAN ALS NÄCHSTES?
Es hat etwas nichts mit der Frage zu tun , aber ich empfehle Ihnen, einen Blick auf Datomic zu werfen , das einen interessant neuartigen Ansatz zum Speichern und Abfragen von Daten gemäß einigen der obigen Beobachtungen bietet. (Natürlich, ich meinen Blick auf mich streng außerhalb der Arbeitsumgebung zuerst ... auf jeden Fall tue NICHT gehen in das Büro des CTO am nächsten Tag und sagen : „Hey Jungs , die ich einige Ihrer sprocs in Datomic neu geschrieben und es auf diesem glänzenden prod Server über im Einsatz dort ist es wirklich cool, schau mal! " Sie werden die sonst völlig verständliche Aufregung vielleicht nicht zu schätzen wissen;)