Ich möchte eine XML-Datei speichern, die ich in meinem Java-Webdienst erhalte. Berichte würden alle 5 Minuten ausgeführt, um einige Daten in den XML-Elementen zu ziehen.
Ich dachte an zwei Ansätze, um dieses Problem zu lösen.
Erstellen Sie mehrere Tabellen in der Datenbank, um die XML-Daten zu erfassen. Grundsätzlich hat jedes Element eine eigene Spalte in der Datenbank.
Dump das gesamte XML in einer Spalte, die XML-Daten speichern kann. Analysieren Sie den Wert für die Berichterstellung in der Abfrage selbst.
Welcher der oben genannten Ansätze ist besser, besonders in Bezug auf die Leistung? Dies ist kritisch, da Berichte in sehr hoher Frequenz (alle 5 Minuten) generiert werden.
Das XML-Schema ist ziemlich kompliziert und nicht einfach.
Wenn Daten einmal geschrieben und oft abgefragt werden, ist es mit ziemlicher Sicherheit effizienter, das XML-Dokument einmal zu analysieren, die Daten in einem geeigneten relationalen Schema zu speichern und das relationale Schema abzufragen. Das Analysieren von XML ist nicht billig, so dass der Aufwand für das Parsen potenziell mehrerer XML-Dokumente alle 5 Minuten erheblich sein kann.
Wie bei allen Leistungsfragen kann Ihre Laufleistung natürlich variieren, so dass es sich lohnt, sie zu testen. Wenn Sie Oracle 11.2 verwenden und die Daten als binäres XML speichern (in diesem Fall wird es nach dem Parsen gespeichert), und Sie erstellen geeignete XMLIndexes für die XMLTypes, die Sie speichern, kann dies zu einer Leistungseinbuße für das Verlassen der Daten im XML-Dokument führen ziemlich klein. Es sollte immer noch langsamer als eine richtige relationale Struktur sein, aber der Unterschied ist möglicherweise für Sie nicht sinnvoll.
Persönlich würde ich den relationalen Speicheransatz im Allgemeinen bevorzugen, auch wenn ich die Performance-Probleme ignoriere, da dies es anderen erleichtert, mit den Daten zu interagieren. Es gibt viel mehr Entwickler, die anständiges SQL schreiben können, als anständige XPath-Ausdrücke schreiben können, und es gibt weit mehr Abfragetools, die Berichte aus relationalen Tabellen generieren können, als Berichte aus XML in einer Datenbank erzeugen können.
Maximus, Es hängt wirklich davon ab, was Sie mit den XML-Daten machen wollen.
Wenn ich XML zu Kontrollzwecken verwende, z. B. um zu konfigurieren, wie eine Seite angezeigt wird, speichere ich das gesamte XML in einem einzigen BLOB-Feld. Es ist schnell und extrem einfach. Es ist eine einfache Routine zum Speichern und Laden. Sie können das XML im BLOB-Feld leicht anzeigen und bearbeiten.
Wenn Sie nach Werten innerhalb des XML suchen oder Berichte dazu erstellen müssen, z. B. wie viele Kunden ein bestimmtes Attribut haben, möchten Sie wahrscheinlich einzelne Attribute analysieren. Dies bedeutet im Allgemeinen, dass Sie einige Vor- und Nachbearbeitungen durchführen müssen, aber Sie können schnell zu einzelnen Attributen gelangen.
Adhoc-Zugriff
Wenn Sie effiziente Abfragen für die XML-Daten ad hoc oder auf beliebige Art ausführen müssen, sollten Sie sie in Tables
und Columns
analysieren, die logisch indexiert und verknüpft sein können.
Eingeschränkter Zugriff
Wenn Sie die Daten nur speichern und basierend auf anderen Kriterien wie einer eindeutigen ID oder einem anderen Schlüssel bereitstellen und das XML im Wesentlichen ein undurchsichtiges BLOB
ist, speichern Sie es einfach in einer Spalte BLOB
und be damit gemacht.
Hybridmodell
Was Sie wahrscheinlich brauchen, ist etwas dazwischen, wo das XML in einem BLOB
gespeichert wird und nur relevante Bits in Tables
und Columns
gespeichert werden, so dass Sie effektiv nach den XML-Nutzdaten suchen können.
Ohne etwas mehr zu wissen, ist es schwer zu sagen, aber höchstwahrscheinlich fehlt Ihnen ein wichtiger Teil, der das Leben sehr vereinfachen kann.
Je nachdem, welche Art von Berichten Sie erstellen, sollten Sie auch die Möglichkeit in Betracht ziehen, Daten nur im Speicher zu behalten. Alle fünf Minuten klingt das nicht nach Leistung, aber auch hier ist nicht immer Persistenz gefragt Daten oder Backups).
Sie können auch den Spaltentyp XMLData in Sqlserver oder Xml Type in Oracle auschecken Ссылка
Sie könnten berechnete Spalten in Ihrer xml-Datenspalte für die am meisten abgefragten XML-Felder erstellen, die bei schnelleren Abrufen helfen würden. Um einen bestimmten Wert an einem bestimmten xpath abzurufen, müssen Sie den xpath nur an sqlserver übergeben, damit er den Wert an diesem xpath an Sie zurückgibt.