Warum sind Datenbanken nicht als Sprachfeature integriert?


25

Gibt es Programmiersprachen mit einer integrierten Datenbank als erstklassige Sprachfunktion, anstatt eine Verbindung zu einer externen SQL-Datenbank (oder einer anderen Datenbank) herzustellen? Was wären die Nachteile und Vorteile einer solchen Funktion? Wie würde ein solches Feature aussehen und wie würde es die Art und Weise, wie wir programmieren, verändern?


17
Ich dachte, SQL sei eine Sprache. : D
Kevin Cantu

8
.NET hat LINQ für SQL, was meiner Meinung nach der richtige Ansatz für ein allgemeines Problem ist. Sie sollten sich nicht an eine bestimmte Datenbank binden, und Sie können nicht allgemein genug vorgehen und dennoch jede Funktion von allem implementieren, was da draußen ist. LINQ ist immer noch fantastisch, genau wie ich.
Job

linq2SQL ist tot, ersetzt durch linq2EF, aber das gleiche Prinzip
BlackICE

3
und leider hat Linq2EF einige böse Erweiterungen nur für Microsoft, was bedeutet, dass Sie damit an SQLServer gebunden sind, wenn Sie etwas Komplexes tun.
gbjbaanb

1
@Job "Sie sollten sich nicht an eine bestimmte Datenbank binden" Wie allgemein gesagt, kann ich dieser Idee im Allgemeinen nicht mehr widersprechen. Eher würde ich diese Philosophie verfeinern oder aufhören, sie zu vertreten. Zum Beispiel würde ich meinen UI-Layer-Code nicht an eine bestimmte Datenbank binden. Ich würde jedoch auf jeden Fall meinen Service-Layer-Code an eine bestimmte Datenbank binden.
Michael O'Neill

Antworten:


15

Die einzige Sprache, an die ich denken kann, sind die alten xBase-Sprachen wie DBase, Clipper und FoxPro. Es gibt ein GNU-Projekt, das eine kostenlose und größtenteils kompatible Version namens Clip anbietet

Das war auch Pick Basic, das eine Programmiersprache direkt mit einer Datenbankplattform verband.

Das wurde gemacht. Es war eine evolutionäre Sackgasse, die den Zugriff einer Sprache auf Daten einschränkte.


2
Können Sie erläutern, warum es eine evolutionäre Sackgasse ist? Ich denke nicht an die Implementierung, ich bin nur neugierig.
VirtuosiMedia

1
@VM Es gibt einen klaren Trend zur Verwendung von APIs und zur Trennung von Sprache, Bibliotheken und Laufzeit. Ab sofort gut definierte APIs, die den gemeinsamen Zugriff auf Daten ermöglichen; unabhängig von Sprache oder Datenbank oder sogar Datenbankschema sind häufig. Die meisten gängigen Sprachen enthalten eine gemeinsame Datenbank-API als Teil der Standardbibliothek. Das Gleiche gilt für Datei- und HTTP-Zugriff. Es besteht keine Notwendigkeit mehr, es in die Sprache einzuschrauben.
Sal

1
Es gibt Größenordnungsunterschiede zwischen der lokalen und der Remote-API. Fügen Sie weitere hinzu, wenn eine Netzwerkschnittstelle vorhanden ist. Die Verwendung von Sprachen in einem DB-Stack bietet nach wie vor eindeutige und echte Vorteile.
Jé Queue

@Xepoch sicherlich, wenn Sie sich in die Datenbank und die Sprachimplementierung dieses Anbieters einbinden möchten .
BlackICE

1
@ David, lies die Frage noch einmal durch, bitte sag, welche Sprache würde dies jemals sein, die nicht für die Anbietersperre wäre?
Jé Queue

29

Sprachen sind "klein" und Datenbanken "groß"; Wenn also beide kombiniert werden, handelt es sich nicht um eine Sprache mit der Datenbank als Feature, sondern um eine Datenbank mit der Sprache als Feature. Viele Datenbanken haben einige proprietäre Sprachen, z. B. PL / SQL, T-SQL.


Wie sind Sprachen "klein"?
Rei Miyasaka

Es ist eine Frage der Wahrnehmung. Natürlich scheinen Datenbanken eine größere Codebasis, eine größere Dokumentation und größere Festplattenanforderungen zu haben (auch wenn wir die aktuellen Daten nicht berücksichtigen). Diese Vergleiche sind jedoch kaum fair, da die meisten Datenbanken eine oder sogar mehrere Programmiersprachen enthalten.
user281377

3
Rei: Sie haben sich PL / SQL nicht näher angesehen, oder? Außerdem enthält Oracle eine JVM im RDBMS.
user281377

3
Rei: Tatsächlich verwenden viele Leute PL / SQL, um Anwendungen zu schreiben, zumindest den Geschäftslogikteil. Wie Sie vielleicht wissen, ist PL / SQL auch die Sprache, die in Oracle Forms verwendet wird. Sie können also grundsätzlich ein PL / SQL-Programm schreiben und ausführen, das niemals eine Datenbank berührt. In der Praxis wird PL / SQL jedoch in Verbindung mit einem Oracle-RDBMS verwendet.
user281377

2
Verdammt, hätte ich nie gedacht.
Rei Miyasaka

16

Ich denke nicht unbedingt, dass die richtige Frage lautet: "Warum gibt es das nicht?" aber "warum sollte es sein?" Was bringt es, wenn Datenbanken ein Merkmal der Sprache sind? Denken Sie daran, dass sich die Sprache ganz unten im Programmierstapel befindet. Eine aufgeblähte Sprache wirkt sich auf alles aus . Daher müssen Sprachentwickler langsam neue Funktionen hinzufügen, insbesondere solche, die eine solche Investition erfordern.


6
Weil Sie die Vorteile der Typprüfung und sogar der einfachen Namensprüfung nutzen möchten, wenn Sie über die Grenzen der Abfragesprache und der Programmiersprache hinweg arbeiten.
Macneil

4
@ Macneil, ORM-Tools machen das jetzt. Was sollte in die Sprache eingebunden werden, wenn APIs dies können?
Sal

1
@sal Damit Distributoren von Anwendungen nicht ein riesiges DBMS bündeln müssen, nur um atomare Schreibvorgänge und Konsistenzprüfungen für ihre Caches, Suchindizes usw. durchzuführen. Deshalb gibt es SQLite: " um mit ihnen zu konkurrierenfopen() ".
Damian Yerrick

@sal: Vermutlich wäre es aus einem ähnlichen Grund, warum reguläre Ausdrücke oder Gleitkommazahlen in einigen Sprachen gebündelt werden, wenn APIs dies können. Weil jemand eine Sprache geschrieben hat und sich dazu entschlossen hat, eine bestimmte Syntax zu rechtfertigen. Natürlich ist das ein so allgemeiner Grund, dass er keine nützliche Antwort darstellt ;-)
Steve Jessop

14

Es gibt 3 Legacy-Systeme, die Ihren Anforderungen entsprechen:

  1. Pick ,
  2. MUMPS ,
  3. Microsoft Access

Pick und MUMPS wurden Jahre vor dem ersten wissenschaftlichen Artikel über relationale Datenbanken entwickelt (etwa ein Jahrzehnt, bevor das erste kommerzielle SQL-basierte Datenbanksystem auf den Markt kam) ein erfolgreiches SQL-basiertes System war später). Möglicherweise werden sie noch verwendet (unser öffentliches Nahverkehrssystem hat Pick bis vor kurzem für das Reiseplanungssystem verwendet). Du willst weder mit Pick noch mit MUMPS etwas zu tun haben, und der beste Rat, den ich geben kann, ist "Schritt weg von der Tastatur mit deinen Händen in der Luft!" Wenn Sie tun alles , was mit ihnen zu tun haben, der Begriff „werden Sie es bereuen“ sollte in den Ohren klingeln werden.

Microsoft Access wird in IT-Kreisen stark verspottet und kritisiert, da es für Nicht-Entwickler recht einfach ist, eine wichtige Geschäftsanwendung aus Access zu machen und sie zu etwas mutieren zu lassen, ohne das das Unternehmen buchstäblich nicht leben kann. Es ist auch sehr wahrscheinlich, dass einige Entwickler ihre Anfänge mit der Entwicklung über MS Access hatten und im Laufe der Zeit lernten sie, wie man diese Probleme behebt (der erste Schritt besteht traditionell darin, Visual Basic zu lernen und die Access-App erst in VB umzuschreiben, dann in etwas "Besseres"). Es ist möglich, eine gut erzogene Access-App zu erstellen, die mit einer großen Menge an Daten verteilt ausgeführt wird - ich habe es gesehen -, aber es gibt einfachere Möglichkeiten, Dinge zu tun, und es erfordert viel weniger Geschick, eine gut zu machen (und zu warten) verhaltene App aus VB und SQL Server.

Seit SQL Server 2005 bietet Microsoft die Möglichkeit, CLR in gespeicherte Prozeduren und Funktionen einzufügen. Und wenn Sie es knifflig machen möchten, können Sie Datentypen erstellen, die Sie dann als Spalten in der Datenbank verwenden können. Ich denke, Oracle hatte etwas Ähnliches mit Java.

Abgesehen davon glaube ich nicht, dass Sie irgendetwas daran hindert, eine solche zu erstellen oder eine Hypothese über sie aufzustellen. Pick und MUMPS sind älter als die meisten Codierer und spiegeln eine sehr COBOLY Sichtweise auf die Welt wider.

Mein persönlicher Rat ist, die Dinge getrennt zu halten. Verwenden Sie eine Sprache, die die Daten, die Ihr Projekt benötigt, gut manipuliert (mit dem Vorbehalt, dass manchmal die "beste" Sprache eine ist, die Sie leicht finden können, wenn Programmierer den Code lesen / schreiben können). Verwenden Sie ein Datenbanksystem, das die für Ihr Projekt erforderlichen Daten gut verwaltet.


+1 obwohl ich denke, dass ein Programmierer, der eine skalierbare Access-Anwendung erstellen kann, eine bessere Arbeitsumgebung verdient.
Larry Coleman

3
Access ist keine Programmiersprache, sondern eine integrierte Entwicklungs- und Laufzeitumgebung. VBA ist die Sprache, die für die Makroprogrammierung in den anderen Office-Produkten verwendet wird, und nicht Access-spezifisch. Der DB-Zugriff erfolgt weiterhin über die verschiedenen Anbieter auf die JET-Treiber.
Jeremy

1
Zusätzlich zu den drei von Ihnen genannten gibt es mehrere 4GL-Umgebungen: Oracle Forms, CA OpenROAD (geborene Ingres Windows4GL) und Unify's Accell (um nur die zu nennen, mit denen ich gearbeitet habe).
TMN

Ich bin mir auch nicht sicher, ob Access wirklich "Legacy" ist, egal wie teuer es sein soll :)
haylem

+1 für Mumps hervorragende Datenbank, die an eine schreckliche Sprache gebunden ist.
James Anderson

4

Das Hinzufügen einer Datenbank zu einer Programmiersprache richtet sich möglicherweise nur an eine sehr begrenzte Anzahl von Benutzern. Was ist, wenn sie einige Nicht-RDBMS-Funktionen verwenden möchten? Oder möchten Sie gar keine Datenbank verwenden? Der Compiler wird für solche Anwendungsfälle unnötigerweise aufgebläht.


4

Err.

Zunächst fragen Sie sich, warum das Framework, in dem die Sprache ausgeführt wird, keine Datenbank bietet. Eine Sprache ist einfach ein Mittel, um etwas auszudrücken, das Sie in festgelegten Grammatiken tun möchten. es bietet solche Dienstleistungen nicht wirklich an. :)

Das heißt, es gibt mehrere Gründe.

  • Das Erstellen eines effizienten Datenbankspeichersystems ist ein schwieriges Problem, wahrscheinlich in der Größenordnung von oder größer als das Erstellen von .NET Framework (zum Beispiel). Wenn ein Team versuchen würde, eine Datenbank in sein Framework aufzunehmen, wäre dies alles, woran sie gearbeitet haben.

  • Eine Datenbank, die geladen wird, sollte sich auf einem eigenen Computer befinden und nicht auf dem Code, der darauf zugreift.

  • ORMs bieten einen Großteil der Sicherheit und der Überprüfung der Kompilierungszeit, die der Vorteil einer solchen Aktion wäre, ohne dass das Framework tatsächlich versucht, eine Datenbank zu sein.

Ich denke jedoch, es wäre nicht schlecht, eine Art SQLite-Implementierung in das Framework aufzunehmen, gegen die Anwendungen mit geringerem Bedarf an Datenzugriff arbeiten könnten. Ich bin mir jedoch nicht sicher, ob es für nicht-triviale Anwendungen nützlich wäre.


Embedded SQLite ist wirklich fantastisch, wenn Sie es nicht haben, verwenden die Sprachentwickler am Ende nur XML als Speichermechanismus :(
gbjbaanb

2

Sie sind; Solche Sprachen werden 4GLs genannt . DataFlex ist mein Favorit, obwohl ich es nicht mehr benutze.

Vorsichtsmaßnahme: Ich habe die objektorientierte Version von DataFlex v3.0 mitentwickelt


2

Ich denke, Ihre eigentliche Frage lautet: "Warum gibt es keine Programmiersprachen, die mit Datenbankbibliotheken geliefert werden ? ".

Allzwecksprachen behandeln alle E / A-Vorgänge als ein und dasselbe, sei es das Schreiben oder Lesen auf / von einer Festplatte, einer Webcam, dem Netzwerk, dem Bildschirm, einem Speicherort - es sind alles E / A-Vorgänge, und das ist alles, was Programmiersprachen selbst betreffen mit.

Abgesehen vom Lesen / Schreiben auf den Heap und Stack, übernehmen die meisten Programmiersprachen nicht einmal die eigentliche Eingabe. Einige Sprachen bieten native Funktionen zum Ausdrücken von E / A-Operationen (z. B. der print Befehl in BASIC), die meisten Sprachen behandeln sie jedoch nur als normale Funktionsaufrufe (z. B. printfin C) und lassen die Bibliotheken das eigentliche Schreiben übernehmen.

Einige Sprachen wie C # bieten Sprachfunktionen zum Ausdrücken von Abfragen, aber selbst dann sind dies nur Ausdrücke in der grundlegendsten Datenstruktur von Listen (oder IEnumerables, wie sie in .NET genannt werden), die von Bibliotheken in SQL-Operationen übersetzt werden. Die Sprache selbst arbeitet immer noch mit sehr abstrakten Vorstellungen von IO.

Warum es nicht sinnvoll ist, ein Datenbankpaket in die Standardbibliothek einer Programmiersprache zu integrieren, liegt höchstwahrscheinlich daran, dass nichts anderes in einer Standardbibliothek normalerweise von der Datenbankfunktionalität abhängt.


Viele Programmiersprachen werden mit DB-Bibliotheken geliefert. Python und PHP haben beide SQLite. Visual Studio wird mit SQL Server Express ausgeliefert.
Quanticle

Dies sind DB-Schnittstellen, nicht die DBs selbst. Die .NET-Laufzeit wird weder mit Visual Studio noch mit SQL Server Express geliefert.
Rei Miyasaka

@ReiMiyasaka Die Python-Standardbibliothek enthält die gesamte SQLite-Engine, da SQLite nur eine C-Bibliothek ist, mit der ein Programm verknüpft ist, kein separater Prozess oder ähnliches.
Damian Yerrick

2

Ja. Die Sprachen auf der AS / 400-Plattform unterstützen erstklassige native Datenbanken.

Dies liegt daran, dass die AS / 400-Plattform die Datenbank überall vollständig integriert hat und viele sehr schöne Funktionen bietet, wie die einfache Navigation durch ein Resultset, das die Werte auf dem Weg durch aktualisiert.


0

Kommt auf die Sprache und die Plattform an. Zum Beispiel ist es für mich ziemlich trivial, eine Vielzahl von Datenbanken zu verwenden, während ich mit C arbeite. Ich verwende einfach die entsprechende Bibliothek.

Eine Sprache muss ihre Standardimplementierung beibehalten. Dies bedeutet in der Regel, dass die erforderliche Mindestmenge bereitgestellt wird, damit eine Person erstellen kann, was sie erstellen möchte. Alles andere wird zu einer Bibliothek oder vielleicht zu einer Erweiterung der Sprache, die von anderen gepflegt wird.

Dies gilt zumindest für Sprachen, die Standards von Organisationen wie ISO folgen.


0

Wie bereits erwähnt, ist die Frage zum Teil falsch, wie einige der obigen Gegenbeispiele gezeigt haben.

Daher würde ich zunächst die Frage verfeinern, die lautet: "Warum ist ein DBMS normalerweise nicht als Funktion einer allgemeinen Programmiersprache auf hoher Ebene integriert?".

Dies ist der gleiche Grund, warum andere Softwareprodukte wie Betriebssysteme, Dateisysteme, Webserver, Caching-Layer usw. normalerweise nicht integriert sind. Allzwecksprachen arbeiten im Allgemeinen auf einer Abstraktionsebene, die über der solcher Produkte liegt. So ist es sinnvoll ist für einen Programmierer ein DBMS zu implementieren inEine Allzwecksprache, und das DBMS kann sogar Aspekte der übergeordneten Sprache oder eine DB-spezifische deklarative Sprache zur Verwendung durch DB-Programmierer verfügbar machen. Es gibt jedoch zu viele Entwurfsoptionen beim Schreiben eines DBMS, als dass es sinnvoll wäre, sie in einer universellen Programmiersprache zu reparieren. Wenn Sie diese Probleme beheben, haben Sie es mit einem Fall wie MUMPS zu tun, in dem die Verflechtung der beiden zu einer ganzen Branche führt, die in einem Henne-Ei-Problem steckt, das mit einem veralteten DBMS und einer veralteten Programmiersprache behaftet ist.


0

Wird verwendet, um in NonStop / SQL zu arbeiten, das vollständig in NonStop / C, NonStop / C ++, NonStop / Cobol, NonStop / Fortran und wahrscheinlich auch in andere Sprachen integriert ist, sowie in NonStop / Guardian, dem Betriebssystem, auf dem die Computer installiert sind lief.

Ich denke, das ist wahrscheinlich die engste Integration, die Sie bekommen können, wenn die Datenbank das Dateisystem des Betriebssystems ist. Es ist auch eine Sackgasse. Es gibt keine Möglichkeit, Komponenten, die Datenbank, das Betriebssystem, die Hardware und die darauf geschriebene Software zu entkoppeln. Sie können niemals separat verwendet und in eine andere Umgebung portiert werden.

Am nächsten an einem PC ist wahrscheinlich MS Access, gefolgt von Embarcadero / Borland Delphi.

Danach sehen Sie sich eingebettete Datenbanken in Ihrer Anwendung an, die möglicherweise nur für Einzelanwendungen geeignet sind, die hierarchische Daten benötigen, die nicht einfach in einer einfachen Konfigurationsdatei gespeichert werden können und / oder während der Ausführung der Anwendung regelmäßig aktualisiert werden müssen . Oder für Leute, die eine tragbare Version einer Anwendung haben möchten, die einen Schnappschuss eines Teils einer größeren Datenbank verwaltet und diesen möglicherweise mit der größeren Datenbank synchronisiert, wenn die Anwendung eine Verbindung herstellen kann (praktisch für einen Verkäufer, der oft außerhalb der Reichweite von ist) Das Unternehmensnetzwerk benötigt jedoch Verkaufsdaten für seine Kundengruppe oder einen Arzt im Außendienst, der Patientenakten möchte, sich jedoch nicht mit dem Krankenhausnetzwerk verbinden kann, da kein Netzwerkzugriff besteht, zu dem er gehen muss.


0

Als ehemaliger Visual Foxpro-Entwickler finde ich es merkwürdig, dass keine gängige Sprache das relationale Modell als Teil der Sprache definiert.

Es ist keine gute Idee, die vollständige Datenbank-Engine zu haben, aber stattdessen könnte die Sprache "SQL" SEHR nützlich sein.

In OO existiert die Impedanzfehlanpassung. Dies geschah, weil sich Objekte und Sets nicht mögen. Aber wenn ich in einer Sprache TABELLEN, FELDER, BEZIEHUNGEN, BESCHRÄNKUNGEN usw. definieren kann (ohne sie an einen bestimmten Speicher zu binden), ist das sehr mächtig. Außerdem ist das Erstellen eines ORM eine 1-zu-1-Zuordnung.

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.