Warum werden Datenbankfunktionen ignoriert und stattdessen in der mittleren Ebene neu erfunden?


83

Was sind die Hauptgründe ( abgesehen von der "Datenbankunabhängigkeit" ), dass die meisten IT-Projekte heutzutage die Fülle an Funktionen zu ignorieren scheinen, die in modernen Datenbank-Engines wie Oracle 11g und SQL Server 2008 vorhanden sind?

Oder aus dem Blog der Helsinki-Erklärung zu leihen, in dem es so heißt:

In den letzten zwanzig Jahren haben wir festgestellt, dass die Funktionalität (Features), die uns im DBMS zur Verfügung steht, exponentiell gewachsen ist. Mit diesen Funktionen konnten wir Datenbankanwendungen erstellen. Und genau das haben wir alle in den boomenden Neunzigern begonnen.

Aber dann, zu Beginn des neuen Jahrtausends, passierte etwas. Und dass etwas auf mysteriöse Weise dazu führte, dass die Rolle des DBMS in einem Datenbankanwendungsprojekt unbedeutend wurde. (...) Ab dem neuen Jahrtausend verschieben wir die gesamte Anwendungslogik aus dem DBMS auf Server der mittleren Ebene. Die Funktionalität von Dingen, die außerhalb des DBMS implementiert sind, ist explodiert, und das funktionsreiche DBMS wird kaum für etwas anderes als Zeilenspeicherung verwendet.

Wir reden über Sachen wie

  • Gespeicherte Prozeduren, die als Daten-APIs verwendet werden (zur Sicherheit und zur Vermeidung übermäßigen Netzwerkverkehrs)
  • Materialisierte Ansichten
  • Statt-Auslöser
  • Hierarchische Abfragen (verbinden durch)
  • Geographie (räumliche Datentypen)
  • Analytics (Lead, Lag, Rollup, Cube usw.)
  • Virtuelle private Datenbank (VPD)
  • Prüfung auf Datenbankebene
  • Rückblende-Abfragen
  • XML-Generierung und XSL-Transformation in der Datenbank
  • HTTP-Callouts aus der Datenbank
  • Hintergrund Job Scheduler

Warum werden diese Funktionen nicht verwendet? Warum halten die meisten Java-, .NET- und PHP-Entwickler am Ansatz "SELECT * FROM mytable" fest?


13
+1 netter Gesprächsrahmen.
Dan Rosenstark

Könnten Sie dies als Beispielfrage für den Outer Join-Vorschlag posten : area51.stackexchange.com/proposals/4260/outer-join (Ich würde es tun und eine Zuordnung vornehmen , aber ich bin bereits an meinem Limit von 5 Fragen)
Joe

Antworten:


55

Weil gespeicherte Prozeduren:

  • Hinzufügen einer weiteren Entwicklungssprache, wodurch die Komplexität und der potenziell redundante Code erhöht werden (in beiden Sprachen geschriebene Logik);
  • haben im Allgemeinen schlechtere Tooling-, Überwachungs- und Debugging-Funktionen als PHP, C #, Java, Python usw.;
  • sind im Allgemeinen weniger fähig als die meisten mittelständischen Sprachen;
  • Sie haben nur einen Vorteil bei der Datentransformation mit hohem Datenvolumen (bei der Sie den Server-Roundtrip vermeiden), die in der Regel nur ein Minimum der tatsächlichen Nutzung darstellt.

Dies ist jedoch eine gängige Methode für C # ASP.NET-Anwendungen.

Wie Jeff Atwood es ausdrückte, sind gespeicherte Prozeduren die Assemblersprache von Datenbanken, und Benutzer tendieren nicht dazu, in Assemblersprache zu codieren, es sei denn, dies ist erforderlich.

Ich habe häufig materialisierte Ansichten und manchmal CONNECT BY in Oracle verwendet, von denen ich glaube, dass sie in MySQL nicht existieren.

Ich neige nicht dazu, XML / XSLT in der Datenbank zu verwenden, da dies bedeutet, dass ich XML und XSLT verwende.

Der Grund für geografische oder räumliche Datenstrukturen liegt wahrscheinlich darin, dass sie nur schwer "erfasst" werden können. Es ist ein ziemlich spezialisiertes Gebiet. Ich habe das MySQL-Handbuch zu Geodatenstrukturen gelesen und bin mir sicher, dass es für jemanden mit umfassender GIS-Erfahrung sinnvoll ist, aber für mich und meine begrenzten Bedürfnisse (die dazu neigen, den Breiten- / Längengrad eines Punkts zu markieren) ist dies einfach nicht der Fall Es scheint die Zeitinvestition nicht wert zu sein, es herauszufinden.

Ein weiteres Problem ist, dass Sie sich, wenn Sie über ANSI SQL (viel) hinausgehen, nur ein wenig an einen bestimmten Datenbankanbieter und möglicherweise an eine bestimmte Version gebunden haben. Aus diesem Grund werden Anwendungsentwickler häufig feststellen, dass ihre Datenbanken auf dem kleinsten gemeinsamen Nenner behandelt werden, was bedeutet, dass sie als Speicherplatz für relationale Daten behandelt werden.


34
Ich möchte die Tatsache hinzufügen, dass gespeicherte Prozeduren selten unter Quellcodeverwaltung gestellt werden.
MusiGenesis

19
Nun, das mag wahr sein, aber es gibt keinen Grund, warum sie nicht unter die Quellcodeverwaltung gestellt werden könnten .
Cletus

4
Alle unsere SPs sind unter Quellcodeverwaltung, das ist eine Ausrede, kein Grund
HLGEM

5
@Aric TenEyck: Sind Ihre ausführbaren Dateien unter Quellcodeverwaltung? Nicht irgendeine zufällige Textdatei, die (hoffentlich) den neuesten Quellcode für sie enthält, aber die tatsächlich kompilierten Programme sind unter Quellcodeverwaltung? Der Punkt ist, solange Sie einen guten Quellcodeverwaltungs- und Bereitstellungsprozess haben, ist es völlig ausreichend, SQL-Dateien in der Quellcodeverwaltung zu halten. Wie bei jedem Prozess bedeutet dies natürlich, dass Entwickler mit dem Programm arbeiten müssen, aber das ist kein spezifisches Problem für Datenbanken oder SQL-Code.
Daniel Pryden

8
Ich bin damit einverstanden, dass SPs "einen Vorteil bei der Datentransformation mit hohem Datenvolumen haben (bei der Sie den Server-Roundtrip vermeiden)". Dann sagen Sie jedoch, dass "in der Regel nur ein Minimum der tatsächlichen Nutzung ist". Ich denke, das ist der Kern der Debatte: Wenn Sie eine Anwendung haben, bei der die Datentransformation mit hohem Datenvolumen ein Minimum an Nutzung ist, lohnt es sich nicht, viele Datenbankfunktionen hinzuzufügen. Wenn Sie jedoch mehr als eine Milliarde Datensätze in einer Tabelle haben und in 8 Sekunden 24 gleitende 8-Stunden-Durchschnittswerte auswählen müssen, ist die Datenbank eine viel bessere Lösung. Die richtige Antwort hängt wirklich von Ihrer Bewerbung ab.
Daniel Pryden

36

Weil Entwickler nichts über SQL wissen. Sie basieren auf DDL und DML, die von Tools wie Hibernate und Konstrukten auf Sprachebene wie JPA-Annotationen generiert werden. Entwicklern ist es egal, ob diese schrecklich ineffizient sind, weil sie von normalen Protokollstufen gnädigerweise verborgen werden und weil Datenbankadministratoren nicht Teil von Entwicklungsteams sind.

Deshalb mag ich Werkzeuge iBATIS . Sie ermöglichen Ihnen das Schreiben und Verstehen von SQL, einschließlich DBMS-spezifischer Funktionen.


Also habe ich mir deinen Link angesehen. . . Ist iBATIS kein ORM? Nur eine, die Sie definieren müssen, anstatt dass ein Tool dies für Sie erledigt?
AndrewWinn

4
Nein, iBATIS ist kein ORM, sondern ein Abfrage- Mapper. Es werden keine Objekte in Tabellen zugeordnet, sondern Abfragen in einer beliebigen Sprachstruktur, einem Objekt oder nicht.

Sie sagen also, welche Objekte (Abfrageergebnisse und was nicht), anstatt es für Sie tun zu lassen?
AndrewWinn

3
+1 für "weil Entwickler nichts über SQL wissen" und "weil Datenbankadministratoren nicht Teil der Entwicklungsteams sind". Wir haben einen DBA / Datenbank-Guru in unserem Team und verwenden definitiv viel mehr Datenbankfunktionen als die meisten anderen. Trotzdem habe ich noch nie von iBATIS gehört. Auf den ersten Blick sieht es nicht sehr beeindruckend aus, aber ich werde es einreichen, um es später zu untersuchen.
Daniel Pryden

3
@andrewWinn: Der springende Punkt ist, dass Sie die Datenbank für viel mehr als nur CRUD-Funktionen verwenden können.
Daniel Pryden

21

Ich denke, ein Grund ist die Angst vor dem Locker des Anbieters.

Dies wird nicht allzu oft gesagt, aber die Vorteile der Verwendung herstellerspezifischer Funktionen müssen gegen die Kosten abgewogen werden. Hauptsächlich die Kosten für das Umschreiben der Teile, die auf herstellerspezifischen Funktionen für jede Datenbank basieren, die Sie unterstützen möchten. Es gibt auch Leistungskosten, wenn Sie etwas allgemein implementieren, wenn der Anbieter einen besseren Weg bietet.

Ich werde dieses Beispiel ansprechen: Möglicherweise ist das "Lockin" von SQL Server akzeptabler, wenn man erkennt, was Analysis Services, Reporting Services usw. für Ihre Anwendung tun können. Bei großen kommerziellen Datenbanksystemen muss nicht "nur" das SQL-Datenbankmodul berücksichtigt werden.


7
Weit mehr Lieferantenbindung für ORMs als Datenbanken. Insbesondere für webbasierte Anwendungen müssen Datenbanken nur sehr selten geändert werden.
HLGEM

1
Ich bin nicht einverstanden. Ich war an mehreren Projekten beteiligt, bei denen wir mit MySQL weit weg waren. Dann erfuhren wir, dass der Client über ein unklares internes Protokoll verfügte, für das bestimmte kritische Daten in einer Oracle-Datenbank gespeichert werden mussten. Sie können argumentieren, dass dies in frühen Anforderungen hätte hervorgehoben werden sollen. Aber realistisch gesehen passiert dies und es kann eine enorme Belastung für ein Projekt sein.
Marco

5
@Marco: MySQL ist für Oracle wie eine Kinderspielzeugpistole für die gesamte US-Armee. Das heißt, der erste ist vollkommen zum Herumspielen geeignet und kostenlos, während der zweite Sie tatsächlich schützen kann, aber sehr teuer ist und viele andere Anforderungen mit sich bringt. Ich denke, dein Kommentar macht für mich einfach keinen Sinn. Wie weit hätten Sie mit MySQL gehen können? Welche Funktion haben Sie in MySQL verwendet , die Oracle nicht hatte?
Daniel Pryden

4
In meinem Kommentar ging es nicht unbedingt um Funktionen. Für eine bestimmte Funktion, die wir verwendet haben, funktioniert sie anders, auch wenn Oracle sie hat. In der Syntax, wenn nichts anderes (und normalerweise mehr als nur das). All das muss also portiert und erneut getestet werden. Das Argument hier bezieht sich auf den Migrationsaufwand, der erheblich ist, wie auch immer Sie ihn betrachten. Schlagen Sie vor, dass sich alle für Oracle einsetzen, nur damit alle ihre Grundlagen abgedeckt sind? <- Das ist kein Snark. Was haben Sie gegen eine einfache db für die Wahl , was sollte ein einfaches Projekt sein?
Marco

17

"Warum werden Datenbankfunktionen ignoriert?"

Da viele sogenannte Entwickler das Datenmanagement nicht kennen und was noch schlimmer ist, wissen sie auch nichts über ihre Unwissenheit. "Ungelernt und ahnungslos", für den dies eine Glocke läutet.


1
Ich kenne einige Entwickler, und ich bin nicht wirklich aktiv, ich arbeite hauptsächlich mit räumlichen Datenbanken (Modellierung / dba), aber das ist so wahr. Entwickler scheinen nicht zu wissen, dass das Erstellen und Verwalten einer einfach zu bedienenden Datenbank eine komplexe Aufgabe ist.
George Silva

12

Wenn Ihre Software auf der Hardware Ihres Clients ausgeführt wird, sind für Änderungen an der Datenbank (neue gespeicherte Prozeduren, aktualisierte Ansichten usw.) DB-Administratorrechte erforderlich. Dies ist fast immer ein Problem für Kunden. Das Einbeziehen der DB-Gruppe erschwert alle Aktualisierungen, die Sie durchführen müssen. Es gibt viele gute Gründe, die hier vorgestellt werden, aber dies ist der einzige, den ich vermeiden muss, um Code wie die Pest in die Datenbank aufzunehmen.


1
Ich habe bereits ein Projekt gesehen, bei dem dieses Problem zu spät erkannt wurde. Sobald der Antrag abgelehnt wurde, wird die Datenbank zu einer großen Belastung. Das Datenmodell zwischen der Datenbank und der Objektwelt beginnt auseinander zu brechen. Hässliche Problemumgehungen werden in die Produktion geworfen. Datenbankbezogene Fehler treten nacheinander auf. Ein riesiges Durcheinander türmt sich auf.
Theo Lenndorff

10

Ich denke, ein Grund ist die Angst vor dem Locker des Anbieters. Diese DBMS-Funktionen sind nicht standardisiert. Beispielsweise sind gespeicherte Prozeduren sehr DB-spezifisch. Wenn Sie Inhalte mithilfe gespeicherter Prozeduren implementiert haben (anstelle von beispielsweise Webdiensten, die über eine mittlere Ebene verfügbar gemacht werden), bleiben Sie für immer bei dem zuerst ausgewählten DBMS , (es sei denn, Sie sind bereit, Zeit / Geld für die erneute Implementierung in einem anderen DBMS aufzuwenden, wenn Sie das DBMS ändern möchten).


17
Ich war noch nie in einem Projekt, in dem das ausgewählte RDMS später geändert wurde.

2
Selbst ein Wechsel von einer Version zu einer anderen kann dazu führen, dass wichtige Änderungen vorgenommen werden.
AndrewWinn

1
@lutz: das liegt an dem, was andrewWinn sagt - selbst eine einzige Änderung könnte möglicherweise alten Code beschädigen. Der beste und sicherste Weg ist also, sich nicht zu ändern. Daher möchte niemand bereitwillig sein RDBMS ändern. Dies bedeutet jedoch, dass Sie sich nicht auf Ihr RDBMS verlassen müssen, denn wenn sich herausstellt, dass es fehlerhaft ist, müssen alle Ihre benutzerdefinierten gespeicherten Prozesse oder die darauf befindlichen Dienste erneut implementiert oder portiert werden. Daher ist mein Punkt - RDBMS bietet keine zuverlässige Möglichkeit, Dienste wie gespeicherte Prozesse abwärtskompatibel miteinander zu verbinden.
Chii

1
@lutz: Ich habe in einer Situation, wo sie DBs geändert. (Wir haben die maximale Tabellengröße in einer über 10 Jahre alten Oracle 8-Installation erreicht und mussten ohne Geld für ein Upgrade der Datenbank migrieren ... was bedeutete, dass alles neu implementiert wurde.) Wir haben wahrscheinlich mehr Arbeitsstunden aufgewendet als nötig Ich hätte Kosten für eine Oracle-Lizenz, aber diese waren budgetiert.
Joe

2
@lutz: amen. Der Aufbau eines Systems zur Bewältigung eines Datenbankmarkenwechsels in der Zukunft ist ein klassischer Fall von "Macht vor Willen setzen", außer es ist eher so, als würde "Macht vor Willen setzen".
MusiGenesis

8

MySQL.

Als Webanwendungen in den späten 1990ern und frühen 2000ern explodierten, war MySQL auf Version 3.3 oder 4.0 und unterstützte nichts über einfache SELECTs. Es war jedoch kostenlos und wurde mit den meisten Linux-Distributionen installiert. Infolgedessen hat eine Generation von Programmierern nichts über Datenbanken gelernt und weiß nicht, wie sie verwendet werden sollen.

Selbst jetzt, da MySQL auf 5.1 ist und die meisten Funktionen eines kommerziellen Systems unterstützt, werden beim Start eines neuen LAMP-Projekts dieselben groben alten Blogs und Artikel als Vorlagen verwendet, und MySQL wird mit MyISAM-Tabellen und Funktionen der 3.3-Ära bereitgestellt .


6
+1. MySQL hat mehr Schaden als Nutzen gebracht - sowohl für das Ansehen von Datenbanken im Allgemeinen als auch für die Programmierer, die es verwenden.
Daniel Pryden

Einverstanden - Ich habe dies tatsächlich getan, angefangen mit MySQL und erst später aufgefüllt, wie viel ein REAL-Datenbanksystem sonst noch tun könnte (Fremdschlüsselbeziehungen - kaskadierende Löschvorgänge - Auslöser - eindeutige Indizes - Einschränkungen).
Keith Williams

7

SQL schlägt aus demselben Grund fehl wie z. B. Haskell. Die Metrik, die den Spracherfolg bestimmt, ist nicht die Reinheit, nicht die einfache Interpretation durch Computer, sondern wie schwierig es ist, darin geschriebene Programme zu verwalten.

Bloße Sterbliche scheitern selbst mit der einfachsten Sprache. Vielleicht hat jeder zehnte Mensch die Fähigkeit, eine einfache Sprache wie C # zu verwenden. Aber von diesen 10% kann nur 1 von 10 oder 1% aller Menschen Sprachen wie SQL oder Haskell effektiv verwenden.

Jetzt ist SQL als Sprache unvollständig, da es nur sehr wenige Dinge gibt, die Sie nur mit SQL tun können. Sie benötigen immer eine andere Sprache. Welche Rolle bleibt das für SQL? Entwickler werden die ACID-Vorteile gegenüber dem Flat-File-Speicher verstehen, aber abgesehen davon haben Datenbanken wirklich nichts zu bieten.

Ein zweites Problem ist, dass SQL effektiv nicht sehr kompatibel mit der Quellversionierung ist. SQL scheint wirklich auf der Vorstellung aufgebaut zu sein, dass Sie es beim ersten Mal richtig machen. Es ist also nicht nur für Entwickler ungeeignet, sondern passt auch schlecht zum Entwicklungsprozess.


guter Punkt. Ich habe mich immer gefragt, warum diese SPs in der verdammten Datenbank nicht umwandelbar sind. Warum nicht in externen Textdateien, vielleicht mit der Option zum Zwischenspeichern? Auch wahr, wie hart SQL ist. SQL ist verrückt: Anstatt Interviewkandidaten nach äußeren und inneren Verknüpfungen zu fragen, frage ich lieber nach sinnvollen Dingen :)
Dan Rosenstark

13
Wow, genau falsch. SQL ist eine Größenordnung einfacher zu erlernen und zu verwenden (und gut zu verwenden) als C # oder irgendetwas, das .Net verwendet. Die meisten Programmierer versuchen es einfach nicht mehr.
RBarryYoung

12
SQL hat eine deklarative Syntax, COBOL ist prozedural, daher sind Ihre "Fakten" schwach. Ich habe über 30 verschiedene Sprachen gelernt und SQL war ohne Frage eine der am einfachsten zu erlernenden. Viele Studien zu der Zeit, als es erstellt wurde, belegen dies ebenfalls (und dass deklarative Sprachen im Allgemeinen leichter zu lernen sind als imperative). . Dass .net die Benutzerfreundlichkeit als Problem hatte, mindert nicht die Tatsache, dass es eine beträchtliche Zeit dauert, eine API mit mehr als 20.000 Einstiegspunkten zu erlernen und zu beherrschen.
RBarryYoung

1
RBarry Young, ich würde Ihren Kommentar millionenfach positiv bewerten, wenn ich könnte
HLGEM

1
LuckyLindy - Dies liegt hauptsächlich daran, dass neue Programmierer mehr Erfahrung mit C # als mit SQL haben. SQL ist häufig eine deklarative Sprache, die auf den Punkt gebracht wird. Dies hat klare Vorteile für das Schreiben und Verstehen von Code. Entwickler können sich auf das Geschäftsproblem konzentrieren, anstatt auf technische OOP- und Entwurfsmuster. Dies ist einer der Hauptgründe, warum wir Funktionen wie LINQ sehen, die diese Vorteile für zwingende Sprachen nutzen.
Jason Kresowaty

7

Es ist einfacher, die mittlere Schicht zu reparieren / erneut bereitzustellen als das DBMS.

Dies hängt wahrscheinlich von Ihrer Architektur ab, ist aber unser Grund. Verbinden Sie das mit der Tatsache, dass wir einen DBA haben, der geschäftiger ist und (wahrscheinlich) mehr bezahlt als unsere Entwickler. Alle Entwickler kennen sich mit SQL aus und einige von ihnen sind mit der prozeduralen Sprache bestens vertraut. Wenn ein wirklich haariges Produktionsproblem auftritt, ist es für die Entwickler einfacher und schneller, auf der mittleren Ebene als auf der Datenbank zu arbeiten, unabhängig davon, ob die Architektur auf die eine oder andere Weise besser wäre.


6

Ich habe einige Leute getroffen, die einfach nicht wussten, dass solche Funktionen existieren - sie haben sich in den frühen Tagen von mySQL die Zähne geschnitten, und sie haben nie wirklich etwas anderes verwendet, und sie haben nicht mitgehalten die Weiterentwicklung der neuen Speichertabellen in mySQL sogar. Oder sie haben in der Schule Datenbanken gelernt und sind nie zurückgegangen, um all die Dinge zu sehen, die sie verpasst haben.

Sie lernen das absolute Minimum an SQL, um damit auszukommen, und erkennen nicht alle unterschiedlichen Erweiterungen, die verschiedene RDBMS bieten.

Bei einem Projekt hätte ich gerne materialisierte Ansichten ... aber ich verwende Postgres. Ich würde gerne räumliche Datentypen für ein anderes Projekt verwenden, aber ich muss einen Hack durchführen oder Datenbanken ändern, um mit der Beharrlichkeit von mySQL umzugehen, dass sie nicht null sind. Ich musste sogar herausfinden, wie die Transaktionskonsistenz von Oracle deaktiviert werden kann, um lang laufende Abfragen auf einem OLTP zu verarbeiten, die in mySQL kein Problem gewesen wären.

Normalerweise kann ich die Mängel der Datenbank für ein bestimmtes Problem umgehen, aber ein Teil des Problems besteht darin, das richtige Tool für den Job auszuwählen. Bei einem aktuellen Projekt haben wir Mannmonate für die Datenreplikation verschwendet, weil wir es sind mit Postgres entschieden sie sich für Slony-1, bevor sie tatsächlich wussten, was wir replizieren würden.

... Ich betrachte diese Frage als "Warum verwenden nicht mehr Leute Feature x in Sprache y " - wenn sie kein Experte in Sprache y sind , wissen sie möglicherweise nicht, dass Feature x existiert.

(und nimm dies nicht als Unterstützung für die Erlangung der DBA-Zertifizierung ... Ich kenne einige Oracle-DBAs, die sich nicht aus einem nassen Sack heraus programmieren konnten; ich habe alle Kurse in den 8i Tagen belegt, aber weigerte sich, die Tests zu machen, da ich nicht mit dieser Gruppe zusammengewürfelt werden wollte)


2
PostgreSQL unterstützt räumliche Datentypen.
George Silva

PostGIS ( postgis.refractions.net ) ist ein Standardgrund für die Verwendung von PG, wenn Sie nicht bereits sind :)
Gregg Lind

5

Ich denke, der Hauptgrund, der den Rest überschattet, ist, dass relationale Datenbanksysteme dramatisch an Bedeutung gewinnen, wenn mehrere Anwendungen dieselben Daten gemeinsam nutzen. Codds berühmtes Papier trägt den Titel "Ein relationales Datenmodell für große gemeinsam genutzte Datenbanken" (Schwerpunkt Mine).

Die Leute neigen dazu zu glauben, dass die Bewerbung, die sie gerade schreiben, immer von ihrem Team kontrolliert wird. und dass es immer alle Bedürfnisse von Personen befriedigt, die an den von der Anwendung generierten Daten interessiert sind. Wenn ein neuer Bedarf entsteht, wird dies durch Hinzufügen einer neuen Funktion zu einer vorhandenen Anwendung und nicht durch Erstellen einer neuen Anwendung erfüllt.

Aber in vielen Fällen (natürlich nicht alle; jede Situation ist anders) funktioniert dieses Entwicklungsmodell auf lange Sicht nicht sehr gut. Da sich die von der Anwendung generierten Daten ansammeln und für das Unternehmen immer wichtiger werden, haben verschiedene Personen interessante Ideen zur Verwendung der Daten. Wenn dies passiert und Sie kein relationales Datenbankverwaltungssystem haben, stehen Sie vor einer großen Herausforderung.


Es wird Sie wahrscheinlich nicht überraschen zu erfahren, dass DDD-Entwickler "eine echte Datenbank" jetzt als Anti-Pattern betrachten. Der neueste Trend sind mehrere Datenbanken, die über Antikorruptionsschichten synchronisiert werden.
Daniel Auger

5

Skalierbarkeit. Je mehr Arbeit Sie dem Datenbankserver geben, desto größer wird der Engpass. Es ist skalierbarer, wenn eine ganze Farm von Anwendungsservern mit Lastenausgleich die Daten verarbeitet und die Datenbank nur als Persistenzspeicher verwendet.


4
Sie können also eine "ganze Farm von Anwendungsservern mit Lastenausgleich" verwenden, aber Sie können nicht einfach eine ganze Farm von Datenbankservern mit Lastenausgleich verwenden, weil ...? Weil du einfach nicht weißt wie? Dann müssen Sie wahrscheinlich etwas über Datenbankclustering und -replikation lernen. Weil es sicher möglich ist.
Daniel Pryden

Entschuldigung, ich hätte mich dafür qualifizieren sollen, dass ich nur Erfahrung mit SQL Server habe, die AFAIK nicht unterstützt, sondern nur ein Failover.
Christian Hayter

1
Ja, die Unterstützung von SQL Server für Cluster mit Lastenausgleich ist ziemlich schlecht. Es gibt jedoch verschiedene Möglichkeiten, wie Sie verteilte partitionierte Ansichten und datenabhängiges Routing verwenden können. Oracle verfügt über RAC, eine viel bessere Lösung für große, hochverfügbare Datenbanken mit Lastenausgleich. Seien Sie einfach bereit, dafür durch die Nase zu bezahlen.
Daniel Pryden

2
@ Daniel - App-Server mit Lastenausgleich sind VIEL einfacher als Datenbankserver mit Lastenausgleich. Außerdem ist es in der Regel viel billiger, einen zusätzlichen App-Server (dh nur einen O / S- und Standard-Multi-CPU-Server) anstelle eines zusätzlichen Datenbankservers (O / S + teure DB-Lizenz + Beefy DB-Server mit schnellen Laufwerken, Tonnen) zu kaufen des Gedächtnisses usw.).
Beep Beep

@ Daniel Pryden: Du beantwortest deine eigene rhetorische Frage. "Sie können nicht einfach eine ganze Farm von Datenbankservern mit Lastenausgleich verwenden, weil ..." Sie müssen bereit sein, dafür durch die Nase zu bezahlen.
Coxy

5

Ich war in zu vielen Situationen, in denen Unternehmenspolitik ("Wir haben keinen Zugriff auf den SQL Server zugelassen, also können wir ein weniger leistungsfähiges DBMS wie Access installieren, um Millionen von Zeilen zu verarbeiten und dieses mit Millionen von Zeilen in einer anderen Tabelle zu verknüpfen und diesen Import zu automatisieren .. ") oder sogar die technische Politik, die passieren kann (" Ich weiß, dass Access mit dieser Datenmenge umgehen kann, und selbst wenn dies nicht der Fall ist, können wir die MDB in mehrere MDBs aufteilen und auf sie verweisen ..... ")

PFUI. Unternehmenspolitik und technische Politik oder sogar Unwissenheit haben mich daran gehindert, viele Funktionen zu nutzen.

Ein weiteres Beispiel: Ich sehe keinen Grund, gespeicherte Prozeduren nicht in einem 100% Microsoft-Shop zu verwenden, in dem SQL Server das DBMS der Wahl ist. Aber weil der IT-Mitarbeiter, dem die Lösung schließlich gehören würde, SPs "leicht" machte, musste ich auf andere Maßnahmen zurückgreifen. Ich meine, es gibt ein perfektes Beispiel dafür, warum einige dieser "Funktionen" von ihnen in ihrem Geschäft ignoriert wurden.

Ich kenne einen anderen Shop, der immer noch DOS Foxpro 2 verwendet, weil sein einziger IT-Mitarbeiter das vorhandene System so geschrieben hat und auf diese Weise alle neuen Dinge entwickelt werden. Warum? Können wir nicht mit der Zeit gehen? Viele der Marketing-Leute dort haben mehrere DOS-Eingabeaufforderungen gleichzeitig geöffnet, in denen Foxpro-Jobs ausgeführt werden, um die hässlichsten Berichte zu erstellen, die ich je gesehen habe. Aber es funktioniert - das werde ich ihnen geben. Es funktioniert - sie haben 12 Millionen Zeilen in ihrer Haupttabelle und mehr als 50 andere Tabellen, die sie mit dieser Haupttabelle "verbinden" (offensichtlich nicht alle 50 auf einmal), aber Mann ... es ist weit nach 1991! Sie möchten nicht einmal einen Punkt aus der Aufzählungsliste diskutieren, die Sie in Ihrer Frage angegeben haben.

Sachen wie diese ist der Grund, warum ich denke.


4

Ich würde sagen, der größte Grund ist, dass die meisten Leute nichts über sie wissen. Sobald jemand eine Lösung für ein Problem gefunden hat, wird dies zur Standardlösung für ähnliche Probleme. SELECT * FROM table hat lange Zeit für viele Menschen funktioniert, sodass sie sich nicht die Mühe machen, nach neuen Ansätzen für alte Probleme zu suchen.

Der andere Grund ist, dass das Schreiben in Code manchmal viel einfacher ist als die Verwendung einer Datenbank. Es ist die gleiche Idee wie das Rollen Ihrer eigenen oder das Kaufen einer Standardkomponente. Die Verwendung einer vorab geschriebenen Funktion kann Ihre Probleme oft lösen, aber hin und wieder müssen Sie etwas tun, das außerhalb der Möglichkeiten der vorab geschriebenen Komponenten liegt.


4

Schöne Frage und gute Diskussion.

Ein anderer Ausdruck ist: "Warum haben sich Objekt-DBs nicht durchgesetzt?" Das ist die andere Seite der Medaille. DBs sind nach wie vor eine nervige Abstraktion, die immer noch in jede App eindringt, aber nicht mit der OO-Logik moderner Anwendungen kompatibel ist.

Es ist in der Tat ein seltsamer Zustand, dass wir die Funktionalität von DBs in ActiveRecord, Hibernate und anderen Middlewares verbergen und duplizieren. Dies ist jedoch das, was mit Paradigmen am Bruchpunkt geschieht (die "objektrelationale Impedanzfehlanpassung"). Werden wir jemals auf Datenbanktechnologien umsteigen, die unseren OO-Apps ähnlich sind (z. B. Objekt-DBs)?

Die Antwort lautet "nicht lange". Erwarten Sie in der Zwischenzeit, dass die Datenbank ignoriert und unterdrückt wird und in vielen Fällen nur für die Zeilenspeicherung verwendet wird, da die Funktionalität der mittleren Ebene zunimmt, um die Lücke zu schließen.

Eine andere Frage lautet: "Warum sollte ich das in der Datenbank tun, wenn die mittlere Ebene dies kann?" Die Mittelschicht ist vertraut und gewinnt ständig an Geschwindigkeit und Funktionalität. Auch hier verwenden wir die mittlere Schicht, um die OO-RDMS-Nichtübereinstimmung zu vermeiden.


4

Um weiter zu kommen, was Christian über Skalierbarkeit gesagt hat.

RDBMs werden einfach eher als reine Datenspeicher verwendet, während die Logik auf die Anwendungsserver migriert wurde. Die zusätzliche Ebene des AS bietet Entwicklern mehr Flexibilität als die Verwendung des RDBMS als Anwendungsserver.

Früher, in den klassischen Tagen von Fat Apps und Client Server, waren DB und Application Server im Grunde dasselbe. Sie hatten Anwendungslogik entweder in Ihren Fat Client-Code eingebettet oder Sie haben sie wieder in das RDBMS übertragen. Aber damals war die primäre Kommunikationsform SQL direkt mit der Datenbank.

Heutzutage sind andere Anwendungsprotokolle häufiger (CORBA, DCOM, Remote EJB und heutzutage immer häufiger XML / JSON / HTTP-RPC-Protokolle über HTTP). Die meisten Datenbanken reagieren nicht direkt auf diese Protokolle, daher wird eine Anwendungsschicht unterbrochen, um diese Aufrufe abzufangen, und diese Schicht ruft die Datenbank auf.

Aber wie wir gelernt haben, erhalten wir jetzt viel mehr Flexibilität, indem wir dieser Ebene Logik hinzufügen. Größere Auswahl an Tools, mehr Flexibilität beim Caching oder Failover oder sogar Datenbanktechnologie (RDMBS, OODBMS, Dokumentenspeicher wie CouchDB). Diese "neue" 3. Stufe bietet trotz der zusätzlichen Komplexität mehr Flexibilität und Leistung als die damit verbundene Komplexität.

Wenn Ihre App-Ebene ein sehr dünnes Furnier über gespeicherten Prozeduren ist, können Sie sich fragen, warum sie überhaupt vorhanden ist.

Die Nutzung der Datenbank und aller ihrer Funktionen ist auch heute noch eine gültige Anwendungsstrategie. SQL Server, Oracle usw. sind furchtbar leistungsfähige Software.

Selbst dann ist die dritte Stufe enorm hilfreich, um einem modernen System Flexibilität zu verleihen.


3

Für mich ist der Grund nicht nur, dass meine Anwendungen datenbankunabhängig sind, sondern dass eine Datenbank die grundlegenden CRUD-Funktionen am besten ausführt. Ja, Datenbanken sind stark optimiert und können möglicherweise ein HTTP-Callout erstellen. Aber warum sollten Sie dies tun? Ein Webservice / eine Webanwendung ist für HTTP-Aufrufe optimiert, keine Datenbank. Genau wie eine Anwendung nicht dafür ausgelegt ist, eine direkte Verbindung zu einer Datendatei herzustellen und die Daten abzurufen. Kann es gemacht werden? Ja aber warum? Das ist nicht das, was Ihre Anwendung auszeichnet.

Ich persönlich bin der Meinung, dass alles, was Sie außerhalb der gespeicherten Prozeduren erwähnt haben, in die Anwendung gehört. Wenn Sie wissen, dass Ihre Architektur X ist, nutzen Sie die Funktionen von X, laden Sie sie gegebenenfalls per Hand auf den DB-Server usw. Wenn es sich um X oder Y (oder Z) handeln könnte, sollte Ihre Anwendung agnostisch sein, es sei denn, Sie sind es Versuchen Sie, Arbeitsplatzsicherheit zu schaffen, indem Sie sicherstellen, dass Sie die Anwendung möglicherweise umgestalten müssen :). Ich denke, ein bisschen Faulheit, kombiniert mit Komfort, könnte etwas damit zu tun haben. Ich weiß, ich würde es lieber in C # als in SQL tun, wenn ich kann. . . Meine C # -Fähigkeiten sind einfach besser.


1
Der Punkt ist, dass Sie die Datenbank für viel mehr als CRUD-Funktionen verwenden können. Wenn Sie nur CRUD benötigen, verwenden Sie SQLite. Der Punkt ist, dass Datenbanken, wenn Sie Datenverarbeitung, insbesondere Statistiken, Durchschnittswerte oder Interpolationen, für große Datenmengen (mindestens mehr als eine Million Zeilen) durchführen, eine ganze Reihe anderer Funktionen haben, die in SQL einfacher zu üben sind als C #. Interessanterweise fügt LINQ viele ähnliche Funktionen hinzu und baut im Wesentlichen Datenbankfunktionen und SQL-ähnliche deklarative Syntax in C # ein. Der springende Punkt ist, dass Datenverarbeitung das ist, was Datenbanken auszeichnen !
Daniel Pryden

Ich verstehe Ihren Standpunkt und für mich sind Statistiken und was nicht Teil einer Lesefunktion. Ich sehe keinen Vorteil darin, dass eine Datenbank http-Aufrufe ausführt oder XML-Dokumente generiert. Dies bindet Ihre Anwendung explizit an bestimmte Funktionen einer Datenbank und verringert die Möglichkeit, die Anwendung auf einen anderen DB-Anbieter zu portieren, ohne dass ein größeres Umschreiben erforderlich ist. . . Sind Sie jemals von MySQL zu SQL Server gewechselt? Es gibt genug Unterschiede in der Syntax und was nicht, dass etwas, das einer komplexen Abfrage ähnelt, öfter als nicht neu geschrieben werden muss. Dies erhöht die Möglichkeit, neue Fehler einzuführen.
AndrewWinn

3

Zunächst einmal: Jeder Entwickler, der ein ORM verwendet, ist naiv, wenn er der Meinung ist, dass die Verwendung eines ORM die Notwendigkeit von SQL-Kenntnissen negiert. Die meisten ORMs, die SQL generieren, variieren die ausgegebene SQL abhängig von der Art und Weise, wie die Objektabfragen erstellt werden. Der Entwickler muss die SQL analysieren, um festzustellen, ob er eine der Objektabfragen ändern soll.

Kurze Antwort: Viele dieser Funktionen sind für die OO-Entwicklung nicht praktisch. Ich weiß, dass DBAs das nicht gerne hören, aber es ist die Wahrheit. Diese Funktionen eignen sich für Randfälle, und mit den meisten guten ORMs wie N / Hibernate können Sie SQL für diese Randfälle bereitstellen.

Wenn es darum geht, hauptsächlich an CRUD delegiert zu werden:

Lange Antwort: Ich denke, die RDBMS-Welt leidet unter reifen wachsenden Schmerzen und findet ihren Platz in der Welt. Wahrheit: OOP ist älter als RDBMS. OOP kommt gerade aus seinen wachsenden Schmerzen heraus und reift. Ich denke, SQL als Sprache ist sehr ausgereift, aber die Idee, wie ein RDBMS umgehen soll, wird gerade erst geklärt. Das RDBMS war der Inhaber der Geschäftslogik für die meisten Web-Apps, bis Java und C # auf den Markt kamen. Ich denke, wir fangen gerade erst an, diese Korrektur zu spüren.

Abgesehen davon glaube ich nicht, dass Ihnen ein ORM-Designer sagen wird, dass die Qualität der SQL-Anweisungen, die dem RDBMS zugeführt werden, keine Rolle spielt.

Wenn es um Nicht-CRUD geht, habe ich hier keine Antwort. Die meisten mir bekannten Geschäfte verwenden die DB immer noch für ETL / etc ...


"Idiot" ist so ein starkes Wort. Vielleicht wäre "naiv" , "faul" oder "unerfahren" ohne die Gemeinheit genauso genau. Gerade so.
Stu Thompson

Guter Punkt. Ich habe die Antwort bis zu einem gewissen Grad entkräftet. Ich ging mit naiv.
Daniel Auger

2

Es gibt nicht genug Entwickler, die all diese Funktionen auf einer Ebene kennen, die für einen normalen "Middle Tier" -Programmierer wirklich den Unterschied ausmachen würde, wenn es darum geht, dieselbe Logik in DB oder Middle Tier zu implementieren. Vielleicht sind die einzelnen Personen, die wirklich gründliche Kenntnisse über diese Funktionen haben, Datenbankadministratoren. Und diese konzentrieren sich auf andere Probleme als die Entwicklung. Es gibt mehr "normale" Entwickler als Datenbankadministratoren. Es wäre daher sehr schwierig und kostspielig, die richtigen Leute für Ihr Team zu finden.

Ein weiterer Punkt ist, dass Sie normalerweise nur das tiefgreifende Wissen über ein Datenbanksystem sammeln und nicht alle. Sie können also SQL Server-Experten oder Oracle-Experten haben, aber nicht beide. Dies führt (teilweise) zu engen Anwendungsfeldern, in denen eine hohe Spezialisierung zählt. Dann ist der Markt für solche Anwendungen nicht so groß, selbst wenn er da ist.


1

Ich denke, der Grund ist eine Kombination aus Lieferantenbindung und mangelndem Wissen der meisten RDBM-Benutzer. SQL ist eine Programmiersprache, und es ist viel schwieriger, sowohl die Sprache, aus der Sie SQL aufrufen, als auch SQL zu beherrschen, als die eine oder andere, insbesondere da SQL eine besonders einzigartige Sprache ist.

Ich denke, die Lösung besteht darin, Ihre Datenbankfunktionalität in eine Dienstprogrammklasse zu abstrahieren und einigen Benutzern, die wissen, was sie mit SQL tun, das Eigentum an der Klasse zu übertragen. Dies minimiert das Risiko einer Lieferantenbindung (wenn Sie den Lieferanten wechseln, wird nur die Klasse neu geschrieben). Dies gibt Entwicklern, die keine SQL-Experten sind, auch eine abstrahierte Oberfläche, sodass sie sich nicht direkt mit der Datenbank befassen müssen.


0

Ein Problem, das ich bei der Nutzung der erweiterten Datenbankfunktionalität gesehen habe, ist die Skalierung. Es scheint viel schwieriger zu sein, die Datenbanklast im Vergleich zur Web- / Anwendungsserverlast zu skalieren.

Ihre Optionen sind begrenzt, skalieren mit größerer, schnellerer Hardware (mit manchmal viel höheren Lizenzkosten) oder kompliziert, skalieren mit schreibgeschützten Kopien usw.

Wenn es Leistungsprobleme gibt, möchte ich, dass diese auf der Ebene der Webserveranwendung auftreten. Zumindest besteht eine meiner Optionen darin, einen weiteren Webserver hinzuzufügen und die Last zu verteilen.

Ich argumentiere nicht gegen Code auf Datenbankebene, um den zwischen dem Webserver und dem Datenbankserver gesendeten Netzwerkverkehr (Datensätze) zu minimieren. Ich argumentiere gegen andere Merkmale, z. Umfangreiche Geschäftslogikverarbeitung auf Datenbankebene.


0

In einigen Beiträgen wird darauf hingewiesen, dass die Skalierung auf der Anwendungsschicht billiger ist als auf der Datenbankschicht.

Eine weitere Überlegung sind zusammengesetzte Anwendungen, die auf mehrere Datenspeicher zugreifen. Es ist viel einfacher, plattformunabhängige Abfragesprachen in der App-Ebene zu schreiben und zu verwalten als separate plattformspezifische Abfragen in der Datenbankschicht.


0

Da das Schreiben objektorientierter Software in der Hostsprache mit nativen Objekten in der Hostsprache das Schreiben von prozeduraler Software übertrifft.


0

Ich habe immer an Systemen gearbeitet, die an viele Kunden verkauft werden und auf der Hardware des Kunden laufen. Dies führt zu:

  • Sie wissen nicht, welche Version der Datenbanksoftware der Client ausführen wird.
  • Die Kunden sind möglicherweise aufgrund von Lizenzkosten oder IT-Richtlinien nicht bereit, die Datenbanksoftware zu aktualisieren, wenn Sie dies wünschen.
  • Selbst grundlegende Funktionen wie materialisierte Ansichten sind nur in einigen „Editionen“ der Datenbanksoftware enthalten. Die kleineren Kunden sind häufig nicht bereit, für die High-End-Edition der Datenbank zu zahlen.
  • Früher oder später wird einer Ihrer Vertriebsmitarbeiter der Verwendung Ihrer Software mit dem RDBMS eines anderen Anbieters zustimmen.
  • Die Wahl zwischen dem einmaligen Schreiben der Logik in der mittleren Ebene oder mindestens PL-SQL und TSQL in der Datenbank ist eine einfache Wahl!
  • Für jede Änderung an der Datenbank (neue gespeicherte Prozeduren, aktualisierte Ansichten usw.) sind DB-Administratorrechte erforderlich. Dies kann auf der Website einiger Kunden viel schwieriger sein, als nur Ihre Software zu aktualisieren.
  • Das Schreiben eines Skripts zum Aktualisieren der Datenbank ist immer schwieriger als das Installieren einer neuen Version der DLLs der Anwendung. (Die meisten Build-Systeme geben heutzutage MSI-Dateien als Teil jedes Builds aus.)
  • Es ist schwieriger, Code in einer Datenbank zu vereinheitlichen als in einer mittleren Ebene.
  • Es ist schwieriger, gespeicherte Prozesse zu debuggen als C #.
  • Nur weil es in Ihrer Datenbank funktioniert, bedeutet dies nicht, dass es in der Kundendatenbank funktioniert. RDBMS verfügt über zu viele Switches, die ihre Funktionsweise ändern. Kunden neigen immer dazu, sie auf unterschiedliche Weise festzulegen.

Angesichts all der oben genannten Faktoren muss der Gewinn durch die Verwendung einer Datenbankfunktion groß sein, bevor sich der langfristige Schmerz lohnt.

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.