In diesem Zitat geht es nicht um die Verwendung von XML als Speicherformat im Allgemeinen (für das es je nach Anforderung in Ordnung ist), sondern um die Speicherung in Form einer Datenbank .
Wenn von Datenbanken die Rede ist, sind damit normalerweise Speichersysteme gemeint, die große Datenmengen speichern , häufig im Gigabyte- oder Terabyte-Bereich. Eine Datenbank ist möglicherweise viel größer als der verfügbare Arbeitsspeicher auf dem Server, auf dem sie gespeichert ist. Da niemand alle Daten in einer Datenbank auf einmal benötigt, sollten Datenbanken für den schnellen Abruf ausgewählter Teilmengen ihrer Daten optimiert werden: Dafür ist die SELECT
Anweisung gedacht, und relationale Datenbanken sowie NoSQL-Lösungen optimieren ihr internes Speicherformat schnell Abrufen solcher Teilmengen.
XML erfüllt diese Anforderungen jedoch nicht wirklich. Aufgrund seiner verschachtelten Tag-Struktur ist es nicht möglich zu bestimmen, wo in der Datei ein bestimmter Wert gespeichert ist (in Form eines Byte-Versatzes in einer Datei), ohne den gesamten Dokumentbaum zu durchlaufen, zumindest nicht bis zur Übereinstimmung. Eine relationale Datenbank hat Indizes, und das Nachschlagen eines Wertes in einem Index, selbst bei einer primitiven Binärsuchimplementierung, ist eine einzelne Suche nach O (log n), und das Abrufen der tatsächlichen Werte ist nichts anderes als eine Dateisuche (z. B. fseek(data_file_handle, row_index * row_size)
), das ist O (1). In einer XML-Datei können Sie am effizientesten einen SAX-Parser für Ihr Dokument ausführen, der eine Menge Lesevorgänge und Suchvorgänge ausführt, bevor Sie zu Ihren eigentlichen Daten gelangen. Sie können dies kaum besser als O (n) erreichen, es sei denn, Sie verwenden Indizes. Dann müssten Sie den gesamten Index für jede Einfügung neu erstellen (siehe unten).
Das Einfügen ist noch schlimmer. Relationale Datenbanken garantieren keine Zeilenreihenfolge, dh, sie können nur neue Zeilen anhängen oder als "gelöscht" markierte Zeilen überschreiben. Dies ist extrem schnell: Die DB kann nur einen Pool beschreibbarer Speicherorte in der Nähe aufbewahren. einen Eintrag aus dem Pool zu erhalten, ist O (1), es sei denn, der Pool ist leer; Im schlimmsten Fall ist der Pool leer und es muss eine neue Seite erstellt werden, aber auch dies ist O (1). Im Gegensatz dazu müsste eine XML-basierte Datenbank alles nach der Einfügemarke verschieben, um Platz zu schaffen. das ist O (n). Wenn Indizes ins Spiel kommen, wird es noch interessanter: Typische relationale Datenbankindizes können mit relativ geringer Komplexität aktualisiert werden, z. B. O (log n); Wenn Sie jedoch Ihre XML-Dateien indizieren möchten, ändert jede Einfügung möglicherweise den Speicherort jedes Werts im Dokument, sodass dies erforderlich istErstellen Sie den gesamten Index neu . Dies gilt auch für Aktualisierungen, da durch die Aktualisierung beispielsweise des Textinhalts eines Elements dessen Größe geändert werden kann, was bedeutet, dass die aufeinanderfolgende XML-Datei verschoben werden muss. Eine relationale Datenbank muss den Index überhaupt nicht berühren, wenn Sie eine nicht indizierte Spalte aktualisieren. Eine XML-Datenbank müsste den gesamten Index für jede Aktualisierung neu erstellen, die die Größe des aktualisierten XML-Knotens ändert.
Das sind die wichtigsten Nachteile, aber es gibt noch mehr. XML ist sehr ausführlich, was gut für die Server-zu-Server-Kommunikation ist, da es die Sicherheit erhöht (der empfangende Server kann alle Arten von Integritätsprüfungen für XML durchführen, und wenn bei der Übertragung etwas schief gelaufen ist, ist es unwahrscheinlich, dass das Dokument validiert wird ). Für den Massenspeicher ist dies jedoch tödlich: Es ist nicht ungewöhnlich, dass der Overhead für XML-Daten 100% oder mehr beträgt (es ist nicht ungewöhnlich, dass Overhead-Verhältnisse im Bereich von 1000% für SOAP-Nachrichten angezeigt werden), während für relationalen DB-Speicher typisch ist Schemata haben nur einen konstanten Overhead für Tabellenmetadaten plus ein winziges Bit pro Zeile. Der größte Teil des Overheads in relationalen Datenbanken stammt aus festen Spaltenbreiten. Wenn Sie ein Terabyte an Daten haben, ist ein Overhead von 500% aus vielen Gründen einfach nicht akzeptabel.