Welche DBMS sind standardkonformer? [geschlossen]

7

Ich finde es frustrierend, dass dieselben Abfragen in verschiedenen DBMS nicht funktionieren.

Beispielsweise scheinen einige DBMS (wie Microsoft SQL Server und MySQL) die information_schemaTabelle zu unterstützen , während andere (wie SQLite) dies nicht tun.

Einige Datenbanken wie MySQL ermöglichen dies SHOW TABLESusw.

Einige beschränken die Ergebnisse mit, SELECT TOP 10 ...während andere mit ... LIMIT 10.

Warum sind verschiedene DBMS so inkompatibel und abweichend?

Warum folgen sie nicht dem SQL-Standard?

Welche können den SQL-Standard gut einhalten?

Welche sind notorisch schlecht darin, den SQL-Standard einzuhalten?

Fred
quelle
6
Weder show tablesnoch top 10noch limit 10ANSI SQL. Und mit MySQL und SQL Server haben Sie tatsächlich die beiden ausgewählt, die sich am wenigsten um SQL-Standards kümmern (nur Erwähnung ||vs. +für die Verkettung von Zeichenfolgen)
a_horse_with_no_name
3
Die meisten Standards sind wahrscheinlich PostgreSQL und Firebird.
Vérace
2
@ Vérace: DB2 nicht vergessen
a_horse_with_no_name
4
Viele DBMS holen auf und fügen ANSI-SQL-Funktionen hinzu (wie SQL-Server kürzlich die FETCH FIRST (n) ROWSSyntax hinzugefügt hat . Postgres fügt die hinzu GROUPING SETS. Oracle hat WITHnach vielen Jahren ihres Eigentums (rekursive) CTEs ( ) hinzugefügt CONNECT BY. Das Problem bei allen ist das Sie können die alte Syntax nicht einfach aufgeben (wie CONNECT BY oder "leere Zeichenfolge ist NULL für Oracle oder TOP und +für Verkettung und Klammern in SQL-Server oder LIMIT in MYSQL oder DISTINCT ONin Postgres). Der Grund ist nur eins: "Abwärtskompatibilität".
ypercubeᵀᴹ

Antworten:

15

Ich finde es frustrierend, dass dieselben Abfragen in verschiedenen DBMS nicht funktionieren.

Ja. Ich finde es frustrierend, dass sich die Scheinwerfer und Wischersteuerungen in verschiedenen Autos nicht immer an derselben Stelle befinden. Da ich es nicht kontrollieren kann, lerne ich damit zu leben. Ich halte mich im Allgemeinen an bestimmte Automarken, aber der Ort dieser Dinge steht nicht ganz oben auf der Liste der primären Entscheidungskriterien. Ebenso wähle ich keine Datenbankplattform aus, weil der Prozentsatz des Standards, den sie abdecken, oder wie viele Abfragen genauso funktionieren wie in Oracle und MySQL.

Beispielsweise scheinen einige DBMS (wie Microsoft SQL Server und MySQL) die Tabelle information_schema zu unterstützen, während andere (wie SQLite) dies nicht tun.

INFORMATION_SCHEMAwar eine interessante Wahl. Ja, einige Plattformen haben sich dafür entschieden, diesen Standard überhaupt nicht zu unterstützen. Andere haben das Nötigste abgedeckt. Ich mache ein ziemlich starkes Argument gegen die Verwendung INFORMATION_SCHEMAin SQL Server, zum Beispiel:

In einigen Datenbanken wie MySQL können Sie SHOW TABLES usw. erstellen.

Ja, einige Datenbanken sind berüchtigter als andere, weil sie nur Dinge erfinden, die für den Entwickler zu dieser Zeit knietief im Code sinnvoll erscheinen ( LIMITund ihre perverse GROUP BYVergebung sind andere Beispiele).

Warum sind verschiedene DBMS so inkompatibel und abweichend?

Ich bin sicher, einige machen Dinge wie, SHOW TABLESweil das als einfacher angesehen wird als SELECT name, other cols FROM sys.tables;. Tatsächlich würde ich wetten, dass dies das Problem mit der Mehrheit der weltweiten Codebasis ist, einschließlich RDBMS; Menschen neigen dazu, das zu tun, was einfacher ist als das, was richtig ist.

Ich bin mir jedoch nicht sicher, ob es ein Problem ist, dass die verschiedenen Plattformen nicht kompatibel und "abweichend" sind, wie Sie sie nennen.

Warum folgen sie nicht dem SQL-Standard?

Es ist schwierig, den gesamten Standard abzudecken. Nur abdeckenDer Standard ist noch schwieriger. Anbieter entwickeln Erweiterungen des Standards und proprietäre Funktionen, die (noch) nicht vom Standard abgedeckt werden, um Benutzern leistungsfähigere Plattformen zu bieten. Stellen Sie sich vor, wir würden auf die nächste Iteration des Standards warten, bevor wir etwas entwickeln könnten? Stellen Sie sich vor, alle Plattformen decken den vollen Standard ab und nichts als den Standard? Stellen Sie sich vor, alle Plattformen hätten nur neue Funktionen implementiert, die sie alle zur gleichen Zeit entwickeln und freigeben wollten. Was wäre der Sinn verschiedener Plattformen? Sie wären alle gleich, und die Inkompatibilität wäre kein Problem mehr, da Sie ohne Risiko frei zwischen Plattformen wechseln könnten - aber warum sollten Sie dann, wenn sie alle gleich sind? Sehen Sie sich das Problem an, das Sie "lösen" - es entsteht nur ein anderes Problem.

Nehmen Sie zum Beispiel Indizes. Der Standard kümmert sich nicht um die physische Implementierung, und einige Anbieter haben beschlossen, alle Arten von nützlichen Indexvariationen und physischen Speichermechanismen zu implementieren, um ihre Plattformen zu verbessern. SQL Server hat Indizes gefiltert, einschließlich Spalten, XML-Indizes, Volltextindizes, In-Memory-Tabellen, Spaltenspeicher usw. usw. Keine davon lesen Sie im Standard. Wie sollen sie diese Dinge bei der Entwicklung mit irgendetwas kompatibel machen, das Oracle möglicherweise entwickelt oder plant? Postgres hat die Entscheidung getroffen, dass eine ausgefeilte JSON-Unterstützung weitaus wichtiger ist als beispielsweise Leistungssteigerungen durch Parallelverarbeitung. Das ist in Ordnung und völlig in ihrem Recht. Das bedeutet nicht, dass SQL Server dasselbe tun soll.

Normales Ad-hoc-CRUD-Material sollte für grundlegende Vanilla-Tabellen plattformübergreifend identisch funktionieren (obwohl MySQL selbst dort einige funky Dinge wie die Verwendung von Backticks um Tabellennamen standardmäßig getan hat, die entfernt werden müssen, wenn versucht wird, den Code auf eine andere Plattform zu portieren ). Sobald Sie anfangen, etwas Exotischeres außerhalb des normalen Speicherns und Abrufens zu tun, wirft der Standard seine Arme in die Luft. Sie möchten Fensterfunktionen? Okay, Ihr Anbieter muss die Ärmel hochkrempeln und implementieren, da die meisten Plattformen sie nicht haben und viel Arbeit erfordern. Selbst SQL Server ist noch nicht vollständig, aber sie sind den anderen weit voraus. Und sie haben viele andere Sprachfunktionen, über die ich mich sehr freue, obwohl sie nicht im Standard enthalten sind.

Welche können den SQL-Standard gut einhalten?
Welche sind notorisch schlecht darin, den SQL-Standard einzuhalten?

Ich weiß nicht genug über den vollständigen Standard und alle Plattformen, um Kommentare abzugeben. Aber ich werde Folgendes vorschlagen: Wenn Sie sich aus diesem Grund für die eine oder andere Plattform entscheiden, hören Sie auf, was Sie gerade tun, und fragen Sie sich, warum dies so wichtig ist. Ich werde auch vorschlagen, dass SQL Server viel besser darin geworden ist, den Standard einzuhalten und Erweiterungen dort zu implementieren, wo sie von Vorteil sind (ein Rückblick in die Geschichte auf Dinge wie timestampund, ja, topzeigt, dass sie sich früher viel weniger darum gekümmert haben). Einige andere Plattformen geben dem Standard einen großen Mittelfinger und tun dies auch weiterhin.

Aaron Bertrand
quelle