Datenbankabstraktion - wird sie übertrieben?

18

Nachdem ich zahlreichen Datenbankabstraktionsebenen ausgesetzt war, frage ich mich, worauf es bei jeder Bibliothek ankommt, die ihr eigenes Paradigma für den Datenzugriff entwickelt. Das Aufnehmen einer neuen DAL fühlt sich an, als würde ich eine neue Sprache noch einmal lernen, wenn ich normalerweise nur die Ebene davon überzeugen möchte, eine SQL-Abfrage auszugeben, die ich bereits in meinem Kopf geschrieben habe.

Und das, ohne die Lesbarkeit im Nachhinein anzugreifen:

# Exhibit A:  A typical DAL
rows = db(db.ips_x_users.ip_addr == '127.0.0.1')
    .inner_join(db.ips_x_users.user_id == db.users.id)
    .select(order=(db.ips_x_users.last_seen, 'desc'), limit=10)

# Exhibit B:  Another typical DAL
rows = db.ips_x_users
    .join(db.users, on=db.ips_x_users.user_id == db.users.id)
    .filter(db.ips_x_users.ip_addr == '127.0.0.1')
    .select(sort=~db.ips_x_users, limit=10)

# Exhibit C:  A hypothetical DAL based on standard SQL syntax
rows = db('''SELECT * FROM ips_x_users
             INNER JOIN users ON
                 (ips_x_users.user_id = users.id)
             WHERE ips_x_users.ip_addr = ip
             ORDER BY last_seen DESC LIMIT 10''', ip='127.0.0.1')

Was stimmt nicht mit der Standard-SQL-Syntax? Es wurde für einen bestimmten Zweck erstellt und passt wunderbar zu diesem Zweck. Vielleicht bin es nur ich, aber ich verstehe Snippet C viel leichter als die ersten beiden. Die umbenannten Schlüsselwörter und Syntaxtricks sind niedlich, aber IMO, wenn es darum geht, machen sie das Abrufen von Zeilen für den Codierer nicht einfacher.

Dies schien wahrscheinlich eine lange Angelegenheit zu sein, aber hier gibt es eine echte Frage. Da jede DAL eine neue DSL für Abfragen zu erfinden scheint, anstatt nur bewährtes SQL zu analysieren, muss es entweder Vorteile bei der Verwendung einer anderen Syntax geben oder Mängel in der Standard-SQL-Syntax, von denen ich nicht weiß, dass sie vorhanden sind. Kann jemand bitte darauf hinweisen, was ich hier übersehen habe?

Notiz an mich selbst - denke an einen Namen
quelle
2
Das größte Problem bei Standard-SQL ist, dass es eine Reihe datenbankspezifischer Abfragen gibt. Die Syntax für äußere Verknüpfungen ist sehr unterschiedlich, ebenso wie der Vorgang des Abrufs einer "fensterorientierten" Abfrage. Das ist die Notwendigkeit für DALs, mit anzufangen. Wenn es eine Standardvariante von SQL gäbe, die von der DAL verwendet wird und die mit den Idiotensynkrasien der verschiedenen SQL-Anbieter umgehen kann, würde ich das begrüßen.
Berin Loritsch

Antworten:

10

Das grundlegendste Problem bei der Verwendung von SQL ist, dass SQL-Abfragen Zeichenfolgen sind, die aus einer anderen Sprache bestehen. Hier kommen SQL-Injections und andere Schwachstellen und WTFs her (Ihr Beispiel ist ziemlich schlecht gewählt, da Ihre Abfrage eigentlich keine Parameter enthält).

Das nächste Problem ist eigentlich eine Konsequenz: Wenn Sie nur SQL in Ihren Code geschrieben haben, kann der Compiler nichts dagegen tun. Fehler wie Tippfehler in Spaltennamen treten nur zur Laufzeit auf. Dies ist im Grunde, warum Sie nicht nur eine Zeichenfolgendarstellung Ihrer Abfrage in Ihrem Quellcode wollen, sondern etwas, das der Compiler statisch analysieren kann, um 95% aller Facepalm-Bugs zu verhindern.

Das letzte Problem tritt auf, wenn Sie versuchen, eine relationale Datenbank auf Ihre Sprachsemantik und Ihr Programmiermodell abzubilden: RDBMS passen nicht gut zu OOP (oder zum Abrufen von Navigationsdaten). Eigentlich ist das eine schreckliche Idee, diese beiden zu kombinieren, aber darum geht es bei allen objektorientierten DAL für SQL-Datenbanken (dh ORMs). Aber all diese Abstraktionsschichten sind zum Auslaufen verurteilt. Ich denke, das ist im Grunde der Grund, warum es so viele von ihnen gibt: Weil du mit ihnen arbeitest, siehst du, dass sie fehlerhaft sind, machst du dich daran, eine DAL zu schreiben, die es richtig macht und letztendlich scheitert.

Während die Probleme eins und zwei darauf hindeuten, DALs zu haben, die SQL loswerden, impliziert Problem drei, dass es keine einfache Lösung gibt, eine zu haben (zumindest für OOP), und es wird daher immer ein Meer von DALs mit unterschiedlichen Stärken und Einschränkungen geben. Am Ende können Sie nur einige sorgfältig auswählen und dabei bleiben.

back2dos
quelle
3
"RDBMSs passen nicht gut zu OOP" - Muss alles in der Software OO sein?
quant_dev
@quant_dev: Nein. Aber "Abstraktions" -Schichten sind von Natur aus zumindest "abstraktionsorientiert". Auch die mitgelieferten Code-Schnipsel lassen vermuten, dass es sich um OO-Code handelt.
back2dos
Ich dachte immer, dass das Einbetten von SQL in C oder was auch immer das Dümmste ist, was man sich vorstellen kann. Wenn ich so etwas tun musste, habe ich ein Mittel erstellt, um die Beziehungen zwischen Tabellen zu definieren und diese in einer Datenbank zu speichern und dann mithilfe der Beziehungen dort zur Laufzeit SQL zu erstellen, um mit der Datenbank zu kommunizieren. Mein C-Code lautete einfach: "Diese Entität mithilfe dieses Schlüssels suchen", "Änderungen daran speichern".
9

Sie übersehen die offensichtliche Tatsache, dass nicht alle Datenbankplattformen dieselbe SQL-Syntax akzeptieren, sodass das Einbetten von SQL-Anweisungen in Ihre Anwendung nicht für jede Datenbankplattform funktioniert. Wenn Sie jemals mehrere Datenbankplattformen unterstützen müssen, müssen Sie die meisten (wenn nicht alle) dieser SQL-Anweisungen überdenken.

Bernard
quelle
3
@Note - Aber dann müsste die DAL einen vollständigen SQL-Parser haben und einen eigenen unterstützten Dialekt haben, der sich von einer bestimmten Datenbank unterscheidet. Und dann hätte es die Komplexität, die es derzeit hat, eine entsprechende datenbankspezifische SQL-Anweisung zu generieren. Das Schlüsselwort LIMIT in Ihrem Beispiel ist beispielsweise in MySQL gültig, jedoch nicht in Oracle oder SQL Server.
Justin Cave
2
Jetzt kommen wir zum Kern der Frage. Was macht einen nicht standardmäßigen Satz von Methodennamen und Operatorüberladungen einem nicht standardmäßigen SQL-Dialekt überlegen? Die Verwendung von SQL würde dem Codierer zumindest eine vertraute Grundlage für das Erlernen des Frameworks geben.
Hinweis für sich selbst - denken Sie an einen Namen
3
@Note to self: Wahrscheinlich, weil es einfacher ist, eine API im flüssigen Stil zu schreiben, als einen SQL-Parser in einem SQL-Dialekt zu schreiben und ihn dann in einen anderen SQL-Dialekt zu übersetzen.
Dean Harding
1
Für die Aufzeichnung bevorzuge ich auch "native" SQL. Die meisten meiner Projekte mussten nie mehr als eine Datenbank unterstützen, daher war dies für mich nie ein Problem.
Dean Harding
3
"Sie übersehen die offensichtliche Tatsache, dass nicht alle Datenbankplattformen dieselbe SQL-Syntax akzeptieren" - ja, aber wie oft schreiben Sie Code, um ihn für eine Datenbank auszuführen ? Normalerweise ist eine DB-Plattform eine erhebliche Investition und wird nicht oft geändert. Darüber hinaus kann die Optimierung Ihrer Abfragen für einen bekannten Datenbanktyp zu erheblichen Effizienzgewinnen führen.
quant_dev
5

Ich habe das Gefühl, dass SQL die gleiche große Veränderung erlebt wie vor 10 Jahren. Es wird immer wieder versucht, manuelle Arbeit mit SQL zu eliminieren und auf eine höhere Abstraktionsebene zu bringen. Das gleiche geschah vor vielen Jahren mit Zeigern und manueller Speicherverwaltung.

Da die Arbeit gerade im Gange ist, werden Ihnen viele verschiedene Ansätze vorgeschlagen, ausprobiert, aufgegeben und integriert. Ich bin sicher, wir werden mehr davon sehen, bevor sich eine Art gemeinsamer Ansatz oder Industriestandard manifestiert.

Es gibt Ihnen sicherlich einen Vorteil, wenn Sie den Datenzugriffscode auf derselben Ebene und mit demselben Paradigma bearbeiten können, das Sie bei der Arbeit mit Ihrem Anwendungscode anwenden.

In wenigen Worten - Vereinfachung, Beweglichkeit, Schnelligkeit - das sind die Ziele.


quelle
4

Joel hatte vor 10 Jahren einen schönen Artikel geschrieben: Lassen Sie sich von Architektur-Astronauten nicht erschrecken

Ich denke, das ist genau der Fall. Ich habe die Abstraktionsebene in meinen eigenen Anwendungen verwendet, seit ich ein Muster gefunden habe, und es war einfach für mich, dies zu tun. Aber es war mein DAL, ich kannte jede einzelne Zeile im Quellcode => volle Kontrolle. Aber ich würde nicht empfehlen, dieses Framework für jemanden außerhalb meines Teams / meiner Projekte zu verwenden.

Wenn Sie so etwas verwenden, ist es wichtig zu wissen, wie es implementiert ist. Das bedeutet, dass Sie viel Zeit mit dem Erlernen der Bibliothek / des Tools verbringen sollten. Wenn Sie keine Zeit haben, es zu lernen, verwenden Sie es nicht. Auch wenn es von Anfang an sehr einfach aussieht.

m5ba
quelle
Ja, eine Firma, für die ich in der Vergangenheit gearbeitet habe, begann begeistert mit Hibernate. Dann entdeckten sie, wie überraschend (auf seltsame Weise) die vom Framework generierten Abfragen sein könnten.
quant_dev
@quant_dev Ja, das ist die Falle - mit Hibernate oder JPA ist es einfach, einfache Dinge zu tun.
m5ba