Wann kann ich JSON- oder XML-Daten in einer SQL-Tabelle speichern?
Bei der Verwendung SQL
oder MySQL
(oder beliebige relationale DB für diese Angelegenheit) - ich verstehe, dass das speichern der Daten in regelmäßigen Spalten ist besser für die Indizierung, sake und andere Zwecke...
Die Sache ist die das laden und speichern JSON
Daten ist manchmal viel mehr einfach. und macht die Entwicklung einfacher.
Gibt es "goldene Regeln" für das speichern von raw - JSON
Daten in der DB?
ist es absolut falsch, die Praxis zu tun?
ZUSAMMENFASSUNG
Sehr nette Antworten gegeben wurden, aber kein Zweifel, die gut organisiert ist die Antwort von @Shnugo verdient der bounty.
Möchte auch darauf hinweisen, Antworten, @Gordon Linoff und @Amresh Pandey als Erklärung für die andere spezielle Anwendungsfälle.
Gott sei Dank, und gute Arbeit an alle!
InformationsquelleAutor der Frage levi | 2017-04-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die wichtigsten Fragen
JSON (wie XML) ist ideal für den Datenaustausch, kleiner Abstellraum und allgemein definierten Strukturen, aber nicht an den typischen Aktionen, die Sie ausführen, in Ihrem RDBMS. In den meisten Fällen wird es besser sein zu transfer Ihre JSON-Daten in normalen Tabellen und neu erstellen der JSON-wenn Sie es brauchen.
XML /JSON und 1.NF
Die erste Regel der Normalisierung bestimmt, nie zu speichern mehr als ein bit information in einer Spalte. Sie sehen eine Spalte "PersonName" mit einem Wert wie "Mickey Maus"? Sie zeigen auf diese und Schrei: Ändern, sofort!
Was über XML-oder JSON? Sind diese Typen brechen 1.NF? Nun, ja und Nein...
Ist es vollkommen in Ordnung, speichern Sie eine komplette Struktur als ein bit von Informationen wenn es ein bit information eigentlich. Sie bekommen eine SOAP-Antwort und wollen, um es zu speichern, da Sie möglicherweise müssen Sie diese für zukünftige Referenz (aber Sie wird nicht verwenden diese Daten für Ihre eigenen Prozesse)? Verstauen Sie es einfach wie!
Nun stellen Sie sich eine komplexe Struktur (XML oder JSON), die eine person (mit Ihrer Adresse, weiteren details...). Jetzt setzen Sie diese in einer Spalte als
PersonInCharge
. Ist das falsch? Sollte dies nicht lieber in richtig entworfenen zugehörigen Tabellen mit foreign-key-Referenz anstelle des XML/JSON? Vor allem, wenn die gleiche person auftreten, in vielen verschiedenen Zeilen, es ist definitiv falsch zu verwenden, eine XML - /JSON-Ansatz.Aber stellen Sie sich nun die Notwendigkeit der Speicherung von historischen Daten. Sie möchten bestehen die person, die Daten für einen bestimmten moment in der Zeit. Einige Tage später die person, die Ihnen sagt, eine neue Adresse? Kein problem! Die alte Adresse wohnt in einer XML - /JSON-wenn Sie jemals brauchen...
Fazit: Wenn Sie die Daten speichern, um es zu halten, ist es okay. Wenn diese Daten eine einzigartige Teil, es ist okay...
Aber wenn Sie benötigen, die internen Teile regelmäßig oder, wenn dies bedeuten würde, redundante doppelte Lagerung es ist nicht okay...
Physischen Speicher
Folgenden wird für SQL Server und anderen möglicherweise auf andere RDBMs.
XML nicht gespeichert wie der text, den Sie sehen, sondern als eine Hierarchie-Baum. Bei der Abfrage dieser ist erstaunlich gut durchführen! Diese Struktur wird nicht analysiert, auf string-Ebene!
JSON in SQL Server (2016+) lebt in einem string und müssen analysiert werden. Es gibt keine echte native JSON-Typ (wie es eine native-XML-Typ). Dies könnte später kommen, aber jetzt würde ich davon ausgehen, dass JSON nicht so performant wie XML auf SQL Server (siehe Abschnitt UPDATE 2). Keine Notwendigkeit zu Lesen einen Wert aus der JSON-müssen eine Hölle von viel versteckte string-Methode ruft...
Was bedeutet das für Sie?
Ihre liebenswert DB-Künstler 😀 weiß, dass die Speicherung JSON wieist gegen gemeinsame Prinzipien von RDBMs. Er weiß,
Es gibt einige workarounds (je nach RDBMS, das Sie verwenden), aber die meisten von Ihnen nicht arbeiten, wie Sie möchten, es...
Die Antwort auf Ihre Frage in kürzester
JA
Sie können speichern Sie diese wie jede andere existiert nur Inhalt. Wir speichern viele Bilder als BLOBs, aber wir würden nicht versuchen, die filter für alle Bilder, die mit einer Blume...
KEINE
Könnten Sie anfangen, mit der JSON-innerhalb einer string-Spalte oder als BLOB und ändern Sie diese, um physikalische Tabellen, wenn Sie es brauchen. Meine Magische Kristallkugel sagt mir, das könnte morgen sein 😀
UPDATE
Finden Sie einige Ideen über die Leistung und Speicherplatz hier: https://stackoverflow.com/a/47408528/5089204
UPDATE 2: Mehr über die Leistungen...
Die folgenden Adressen JSON-und XML-Unterstützung im SQL-Server 2016
User @mike123 darauf Artikel auf einer offiziellen microsoft-blog das scheint Beweis in einem experiment, dass Abfragen von JSON ist 10 x schneller dann Abfragen einer XML - im SQL-Server.
Einige Gedanken darüber:
Einige cross-checks mit dem "experiment":
XQuery
Unterstützung! Suchen Sie ein Produkt mit einer bestimmten ID in einem array? JSON muss, Lesen Sie die ganze Menge und einen filter verwenden, danach mitWHERE
währendXML
erlauben würde, eine interneXQuery predicate
. Nicht zu reden vonFLWOR
.../text()
zu denXPath
reduziert diese auf weniger als 2x. In den zugehörigen Artikel der Benutzer "Mister Magoo" wies dies bereits, aber die Klick-Köder Titel ist immer noch unverändert...SUBSTRING
undCHARINDEX
😀Folgende code zeigt ein realistischeres experiment
Product
(ein JSON-array vs. Geschwisterknoten)GO 10
wird durch diesen block zehn mal zu vermeiden first-call-biasDas endgültige Ergebnis zeigt deutlich, dass bei JSON ist langsamer als XML - (nicht viel, etwa 1,5 x auf ein noch sehr einfaches Beispiel).
Die Letzte Anweisung:
Den test-code
Das Ergebnis (SQL-Server 2016 Express auf einen Acer Aspire v17 Nitro, Intel i7, 8GB Ram)
InformationsquelleAutor der Antwort Shnugo
Dies ist zu lang für einen Kommentar.
Wäre es "absolut falsch", dann die meisten Datenbanken nicht unterstützen würde. Okay, die meisten Datenbanken unterstützen Kommas in der
FROM
- Klausel, und ich, als "absolut falsch". Aber die Unterstützung für JSON ist neue Entwicklung, die nicht rückwärts-kompatibel "feature".Ein offensichtlicher Fall ist, wenn der JSON-Struktur ist einfach nur ein BLOB übergeben wird, zurück zur Anwendung. Dann gibt es keine Diskussion -- andere, dann ist der overhead für das speichern von JSON, was ist unnötig verbose für strukturierte Daten mit den gemeinsamen Feldern in jedem Datensatz.
Einem anderen Fall wird die "sparse" - Spalten Fall. Sie haben Zeilen mit vielen möglichen Spalten, aber diese variieren von Zeile zu Zeile.
Andere Fall ist, wenn Sie speichern möchten, "nested" - Datensätze in einem Datensatz. JSON ist mächtig.
Wenn die JSON-gemeinsame Felder in den Datensätzen, die Sie Abfragen möchten, dann sind Sie in der Regel besser damit, diese in der richtigen Datenbank-Spalten. Jedoch Daten ist kompliziert und es ist ein Ort für Formate wie JSON.
InformationsquelleAutor der Antwort Gordon Linoff
Werde ich Welle mein Zauberstab. Puh! Goldene Regeln für die Verwendung von JSON:
Wenn MySQL nicht suchen müssen innen JSON, und die Anwendung muss einfach nur eine Sammlung von Sachen, dann von JSON ist in Ordnung, vielleicht sogar besser.
Wenn Sie die Suche auf Daten, die innerhalb und Sie haben MariaDB 10.0.1 oder MySQL 5.7 (mit einem JSON-Datentyp und Funktionen), dann JSON - könnte praktisch sein. MariaDB 5.3 "Dynamischen" Spalten ist eine Variante.
Wenn Sie das tun, "Entität-Attribut-Wert -" Sachen, dann ist JSON nicht gut, aber es ist das geringste von mehreren übeln. http://mysql.rjweb.org/doc.php/eav
Für die Suche nach einer indizierten Spalte, die nicht den Wert begraben innerhalb JSON ist ein großes plus.
Für die Suche von einer Palette auf eine indizierte Spalte oder eine
FULLTEXT
Suche oderSPATIAL
JSON ist nicht möglich.Für
WHERE a=1 AND b=2
die "composite" - indexINDEX(a,b)
ist toll, kann wahrscheinlich gar nicht kommen in der Nähe mit JSON.JSON funktioniert gut mit "sparse" Daten; Indizierung funktioniert, aber nicht so gut, mit solchen. (Ich beziehe mich auf die Werte, die "fehlenden" oder "NULL" für die vielen Zeilen.)
JSON kann geben Sie "arrays" und "Bäume" ohne Rückgriff auf zusätzliche Tabelle(N). Aber Graben sich in solche arrays/Bäume nur in der app nicht in SQL.
JSON ist um Welten besser als XML. (Meiner Meinung nach)
Wenn Sie nicht wollen, um in den JSON-string, außer die app, dann empfehle ich komprimieren (im-client) wird es eine Speicherung in eine
BLOB
. Es ist wie bei einem .jpg-es gibt Sachen dort, aber SQL nicht kümmern.Zustand Ihrer Anwendung; vielleicht können wir etwas konkreter sein.
InformationsquelleAutor der Antwort Rick James
Neue SQL Server bietet Funktionen für die Bearbeitung von JSON-text. Informationen formatiert als JSON gespeichert werden können, die als text in standard-SQL Server-Spalten und SQL-Server bietet Funktionen, die Werte abzurufen, die von diesen JSON-Objekte.
Diese einfache Struktur ist ähnlich zu der standard-NoSQL-collection, die Sie erstellen können, NoSQL-Datenbanken (z.B. Azure DocumentDB oder MongoDB), wo man einfach Schlüssel darstellt-ID und ein Wert, der für JSON.
Beachten Sie, dass NVARCHAR ist nicht gerade ein einfacher text. SQL Server hat eine eingebaute text-Kompressionen-Mechanismus transparent zu komprimieren Daten auf der Festplatte gespeichert. Die Komprimierung hängt von der Sprache und kann gehen bis zu 50%, in Abhängigkeit Ihrer Daten (siehe UNICODE-Komprimierung ).
Der Hauptunterschied zwischen SQL server und anderen Uni-NoSQL-Datenbanken, die SQL Server ermöglicht die Verwendung von hybrid-Datenmodell, wo Sie können auch mehrere JSON-Objekte in die gleiche "Sammlung" und kombinieren Sie diese mit regulären relationalen Spalten.
Als ein Beispiel vorstellen, dass wir wissen, dass jede person in Ihrer Sammlung haben, FirstName und LastName, und Sie speichern können Allgemeine Informationen über die person, die als ein JSON-Objekt, und Rufnummern/E-Mail-Adressen, die als separate Objekte. In SQL Server 2016 können wir leicht zu erstellen, diese Struktur ohne zusätzliche syntax:
Anstelle von einzelnen JSON-Objekt können Sie organisieren Ihre Daten in dieser "Sammlung". Wenn Sie nicht wollen, um explizit zu überprüfen, die Struktur der einzelnen JSON-Spalte, die Sie nicht brauchen, um hinzuzufügen, JSON check-Einschränkung für jede Spalte (in diesem Beispiel habe ich Hinzugefügt, CHECK-Einschränkung nur auf EmailAddresses Spalte).
Vergleicht man diese Struktur auf die standard-NoSQL-collection, werden Sie feststellen, dass Sie schneller Zugriff auf typisierte Daten (Vorname und Nachname). Also, diese Lösung ist eine gute Wahl für hybrid-Modelle, bei denen Sie identifizieren können, einige Informationen, die wiederholt über alle Objekte und andere variable Daten können gespeichert werden als JSON. Auf diese Weise können Sie kombinieren die Flexibilität und Leistung.
Vergleicht man diese Struktur mit dem schema der Person-Tabelle der AdventureWorks-Datenbank, Sie können feststellen, dass wir entfernt haben, viele Verwandte Tabellen.
Neben der Einfachheit des Schemas, die Ihre Daten zugreifen Vorgänge werden einfacher im Vergleich zu komplexen relationalen Struktur. Jetzt können Sie Lesen einzelne Tabelle statt mehrere Tabellen verknüpfen. Wenn Sie brauchen, um setzen Sie neue person mit den zugehörigen Informationen (E-Mail-Adressen, Telefonnummern) können Sie einen einzelnen Datensatz in einer Tabelle anstelle von einfügen einen Datensatz in der AdventureWorks-Person-Tabelle, wobei identity-Spalte zu finden, fremde Schlüssel, der verwendet wird zum speichern von Handys, E-Mail-Adressen, etc. Zusätzlich wird In diesem Modell können Sie problemlos löschen eine einzige person der Reihe nach, ohne cascade löscht mit foreign-key-Beziehungen.
NoSQL-Datenbanken sind optimiert für den einfachen, read, insert-und delete-Operationen SQL Server 2016 ermöglicht das anwenden der gleichen Logik, die in relationalen-Datenbank.
JSON-Einschränkungen
In den vorherigen Beispielen haben wir gesehen, wie man hinzufügen einfache Bedingung, die überprüft, ob in der Spalte gespeicherten Texts ist richtig formatiert. Obwohl JSON haben keine starken schema können Sie auch komplexe Einschränkungen durch die Kombination von Funktionen Lesen Werte aus dem JSON-und standard-T-SQL-Funktionen:
Beachten Sie, dass der CHECK-Einschränkungen, verlangsamen könnte Ihre insert - /update-Prozesse, so dass Sie möglicherweise vermeiden, wenn Sie eine schnellere schreib-performance.
Komprimierte JSON-storage
Wenn Sie große JSON-text können Sie explizit zu komprimieren JSON-text mit built-in-COMPRESS-Funktion. Im folgenden Beispiel komprimierte JSON-Inhalt wird als binäre Daten gespeichert, und wir haben berechnete Spalte, Dekomprimieren JSON als ursprünglichen text über DEKOMPRIMIEREN Funktion:
KOMPRIMIEREN und DEKOMPRIMIEREN von Funktionen verwenden die standard-GZip-Komprimierung. Wenn Ihr client verarbeiten kann die GZip-Komprimierung (e.g browser versteht gzip content), können Sie direkt zurück komprimierte Inhalte. Beachten Sie, dass diese Leistung/Speicher-trade-off. Wenn Sie Häufig Abfragen komprimierte Daten, die Sie mig wesentlich langsamer sind, weil der text dekomprimiert werden müssen jeder Zeit.
Hinweis: die JSON-Funktionen sind nur verfügbar in der SQL Server-2016+ und die Azure SQL-Datenbank.
Mehr Lesen Sie in der Quelle dieses Artikels
https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/23/storing-json-in-sql-server/
InformationsquelleAutor der Antwort AMRESH PANDEY
Die "goldene Regel", die ich verwenden, in ein-hand-wavey Art und Weise, ist, dass, wenn ich brauche, JSON, in seiner raw-format, es ist okay zu speichern. Wenn ich einen speziellen Punkt der Analyse ist es, dann ist es auch nicht.
Wenn ich zum Beispiel bin erstellen einer API sendet rohen JSON, und aus welchem Grund dieser Wert ist nicht zu ändern, dann ist es okayum es zu speichern als raw JSON. Wenn ich zu analysieren, Sie zu ändern, zu aktualisieren, usw... dann nicht so viel.
InformationsquelleAutor der Antwort piisexactly3
Die Frage, die Sie haben zu Fragen, ist:
TUN
NICHT
InformationsquelleAutor der Antwort Anand
Json sind keine große relationional db. Wenn Sie entfalten sich die json-in-Spalten und speichern in einer db , es ist toll, aber die Speicherung von json als ein blob ist neben der Verwendung als Daten-Archivierungs-system.
Könnte es mehrere Gründe für die nicht-Entfaltung einer json und speichern in einer einzelnen Spalte, aber die Entscheidung getroffen worden wäre, wie die Werte in das json-Feld nicht verwendet werden, die für alle Abfragen (oder die Werte wurden bereits entfalteten in Spalten).
Auch die meisten der json-Verarbeitung wenn überhaupt war das Feld abgefragt werden würde, der außerhalb der sql-Umgebung, sql ist einfach nicht dazu gedacht, für json-Verarbeitung. Die eigentliche Frage ist dann , wo Speichere ich diese json, lasse ich es als flat-files und, wenn erforderlich, Fragen Sie über einige andere system (spark/hive/etc).
Ich würde Zustimmen, mit Ihrer DB-Künstler , nicht verwenden RDBMS für die Archivierung. Es gibt billigere Möglichkeiten. Auch json-blobs können sich riesig und können bogging die DB-Speicherplatz mit der Zeit.
InformationsquelleAutor der Antwort Satyadev