Warum akzeptieren relationale Datenbanken nur SQL-Abfragen?

15

Soweit mir bekannt ist, bieten die meisten relationalen Datenbanken keine API auf Treiberebene für Abfragen, mit Ausnahme einer queryFunktion, die eine SQL-Zeichenfolge als Argument verwendet.

Ich überlege, wie einfacher es wäre, wenn man tun könnte:

var result = mysql.select('article', {id: 3})

Bei verknüpften Tabellen wäre dies etwas komplexer, aber immer noch möglich. Beispielsweise:

var tables = mysql.join({tables: ['article', 'category'], on: 'categoryID'});
mysql.select(tables, {'article.id': 3}, ['article.title', 'article.body', 'category.categoryID'])

Sauberer Code, kein Aufwand für das Parsen von Zeichenfolgen, keine Injection-Probleme, einfachere Wiederverwendung von Abfrageelementen ... Ich sehe viele Vorteile.

Gibt es einen bestimmten Grund, warum nur über SQL auf Abfragen zugegriffen werden soll?

lortabac
quelle
14
Was macht Ihr erstes Beispiel, das ein ORM noch nicht bietet?
Robert Harvey
4
Ihr Weg würde gut funktionieren, wenn das einzige, was jemals jemand getan hätte, einfache Abfragen wären.
Blrfl
5
@RobertHarvey Nichts. Es muss jedoch in SQL konvertiert werden. Der Punkt meiner Frage ist, warum wir keinen Zugriff auf Datenmanipulationsoperationen auf Treiberebene haben können.
Lortabac
20
Für mich ist das wie zu fragen, warum Toaster kein Eis akzeptieren.
HLGEM
2
Jemand hat bereits darüber nachgedacht, was Sie denken, und ist noch einen Schritt weiter gegangen, und so wurden ORMs geboren.
The Muffin Man

Antworten:

33

Datenbanken sind außer Betrieb - sie werden normalerweise auf einem anderen Server ausgeführt. Selbst wenn Sie eine API hätten, müsste sie etwas über die Leitung senden, das Ihre Abfrage und all ihre Projektionen, Filter, Gruppen, Unterabfragen, Ausdrücke, Verknüpfungen, Aggregatfunktionen usw. darstellt. Das könnte XML oder JSON oder etwas sein proprietäres Format, aber es kann auch SQL sein, weil es getestet und unterstützt wird.

Heutzutage ist es seltener, SQL-Befehle selbst zu erstellen - viele Leute verwenden eine Art ORM. Obwohl diese letztendlich in SQL-Anweisungen übersetzt werden, bieten sie möglicherweise die API, nach der Sie suchen.

Tim
quelle
17
Ich bin nicht einverstanden, SQL-Befehle von Hand zu erstellen. ORM eignet sich gut für sehr vereinfachte Datenmodelle. Alles andere als trivial schreiben Sie Ihre eigene SQL-Schicht.
Martin York
2
Ich spiele Devils Advocate und beachte, dass kein vernünftiger ORM konfigurierbar sein sollte, um den Anforderungen einer Anwendung zu entsprechen.
Mistkerl
7
@LokiAstari: Stimmt, aber das triviale CRUD-Zeug kann 80% oder mehr Ihrer Bewerbung ausmachen.
Robert Harvey
@ Tim, exzellenter Punkt. Tatsächlich sieht die in der Frage vorgeschlagene hypothetische Syntax JSON sehr ähnlich.
John M Gant
JSON ist ein Datenkapselungs- und Übertragungsformat, keine Sprache.
Craig
35

Weil SQL eine gemeinsame API bietet. Sie können einen ANSI 92 SQL-kompatiblen Treiber schreiben, der SQL ausgibt und die gewünschte API verfügbar macht. Als besonderen Bonus kann es mit fast jeder SQL-Datenbank ohne Umschreiben verwendet werden.

Wenn Sie es so machen würden, hätte jede SQL-Datenbank eine andere API. Es sei denn, wir alle haben Ihre API standardisiert. Aber dann hätten wir doch mehr oder weniger wieder SQL, oder? Abgesehen davon, dass Ihre API anscheinend programmiersprachenspezifisch ist, SQL jedoch nicht.

Robert Harvey
quelle
7

Zu Verwaltungszwecken gibt es in der Datenbank noch mehr zu tun. Daher ist es wichtig, dass Sie Skripts erstellen und Text senden können, um Benutzer hinzuzufügen, Sicherungen auszuführen, Daten zu laden, das Schema zu ändern usw. Die meisten Datenbankadministratoren möchten dies in keiner anderen Programmiersprache tun.

Wenn Datenbankadministratoren an SQL festhalten möchten, müssen Sie eine andere Sprache verwenden, damit die Datenbank beide Sprachen verarbeiten kann.

Es gibt viele neue Funktionen in Datenbanken, daher glaube ich nicht, dass sie stagnieren. Sie tun einfach nicht, was Sie aus irgendeinem Grund vorschlagen.

SQL Server kann .NET-Code über SQL CLR von innen ausführen. Dies ist hilfreich für einige Aufgaben, die nicht in ein relationales Modell passen, aber die Leistung beibehalten möchten. Mir ist klar, dass Sie nicht danach suchen. Es ist ein Beispiel für die vielen Dinge, die Datenbanken tun.

Es wird nicht so bald verschwinden. Eine der neueren Datenbanken, die auf den Markt kommen, ist NuoDB . Sie haben SQL beibehalten, ACID bereitgestellt und gleichzeitig die Möglichkeit geschaffen, Server zu verteilen und in einer Cloud auszuführen. Vielleicht möchten Sie nachsehen, warum sie sich so viel Mühe gegeben haben, um die Fortführung von SQL voranzutreiben (nicht der einzige Grund, aber ein großes Verkaufsargument).

JeffO
quelle
.NET-Code in SQL Server wird tatsächlich nicht im Datenbankmodul ausgeführt. Es handelt sich um .NET-Code, der zu einer Assembly auf dem Server kompiliert wurde, und den gespeicherten Prozeduren werden statische Klassenmethoden zugewiesen, die der Datenbankserver aufrufen kann. Die Methoden verwenden einen Datenprovider und stellen wie jeder andere .NET-Code eine Verbindung zur Datenbank her. Ähnlich verhält es sich mit Datenbanken (Oracle, Sybase), die gespeicherte Java-Prozeduren unterstützen. SQL hingegen ist die "native Schnittstelle" der Datenbank, ähnelt den meisten Datenbankprodukten und wird direkt in der Datenbank analysiert und ausgeführt.
Craig
@ Craig - Ausgezeichneter Punkt.
JeffO
3

SQL-DBMS bieten einen im Wesentlichen optimierten Zugriff auf den Speicher über die Muttersprache, und viele davon bieten, wie Sie bemerken, keine andere API.

Die Feststellung, dass die Datenbank nicht mehr in Betrieb ist, trifft in einigen Fällen nicht zu und ist nicht wirklich direkt relevant.

Sogar Datenbanken, die die Verwendung von SQL DML erfordern, bieten häufig eine Cursor-Bibliothek, um Iterator-Zugriff auf eine Ergebnismenge zu ermöglichen, und das bekannte Microsoft Access- und Btrieve SQL-DBMS bieten beide eine direkte Datensatzschnittstelle zu den einzelnen Tabellen in einer Datenbank als Mechanismus für sehr performanten Zugriff unter bestimmten Umständen.

Wie bereits erwähnt, würden komplexe Abfragen mit einer solchen Syntax das Verhalten von Netzwerkdatenbanken aus den späten 70er Jahren reproduzieren.

Die alternativen Zugriffsmechanismen sind für den Mainstream-Benutzer aufgrund der Unbekannten weniger attraktiv, aber die zunehmende Beliebtheit der NoSQL-Datenbanken könnte das Interesse an anderen APIs erhöhen, um bestimmte Leistungssteigerungen zu erzielen. Es scheint wenig anderes zu geben, um einen solchen Ansatz zu empfehlen.

Pekka
quelle