New SQL Server bietet Funktionen zur Verarbeitung von JSON-Text. Als JSON formatierte Informationen können als Text in Standard-SQL Server-Spalten gespeichert werden, und SQL Server bietet Funktionen, mit denen Werte von diesen JSON-Objekten abgerufen werden können.
DROP TABLE IF EXISTS Person
CREATE TABLE Person
( _id int identity constraint PK_JSON_ID primary key,
value nvarchar(max)
CONSTRAINT [Content should be formatted as JSON]
CHECK ( ISJSON(value)>0 )
)
Diese einfache Struktur ähnelt der Standard-NoSQL-Sammlung, die Sie in NoSQL-Datenbanken (z. B. Azure DocumentDB oder MongoDB) erstellen können, in denen Sie nur einen Schlüssel haben, der die ID darstellt, und einen Wert, der JSON darstellt.
Beachten Sie, dass NVARCHAR nicht nur ein einfacher Text ist. SQL Server verfügt über einen integrierten Textkomprimierungsmechanismus, mit dem auf der Festplatte gespeicherte Daten transparent komprimiert werden können. Die Komprimierung hängt von der Sprache ab und kann je nach Ihren Daten bis zu 50% betragen (siehe UNICODE-Komprimierung).
Der Hauptunterschied zwischen SQL Server und anderen einfachen NoSQL-Datenbanken besteht darin, dass Sie mit SQL Server ein hybrides Datenmodell verwenden können, in dem Sie mehrere JSON-Objekte in derselben „Sammlung“ speichern und mit regulären relationalen Spalten kombinieren können.
Stellen Sie sich beispielsweise vor, wir wissen, dass jede Person in Ihrer Sammlung Vor- und Nachnamen hat und dass Sie allgemeine Informationen über die Person als ein JSON-Objekt und Telefonnummern / E-Mail-Adressen als separate Objekte speichern können. In SQL Server 2016 können wir diese Struktur ohne zusätzliche Syntax einfach erstellen:
DROP TABLE IF EXISTS Person
CREATE TABLE Person (
PersonID int IDENTITY PRIMARY KEY,
FirstName nvarchar(100) NOT NULL,
LastName nvarchar(100) NOT NULL,
AdditionalInfo nvarchar(max) NULL,
PhoneNumbers nvarchar(max) NULL,
EmailAddresses nvarchar(max) NULL
CONSTRAINT [Email addresses must be formatted as JSON array]
CHECK ( ISJSON(EmailAddresses)>0 )
)
Anstelle eines einzelnen JSON-Objekts können Sie Ihre Daten in dieser „Sammlung“ organisieren. Wenn Sie die Struktur jeder JSON-Spalte nicht explizit überprüfen möchten, müssen Sie nicht für jede Spalte eine JSON-Überprüfungsbeschränkung hinzufügen (in diesem Beispiel habe ich die CHECK-Einschränkung nur für die Spalte EmailAddresses hinzugefügt).
Wenn Sie diese Struktur mit der Standard-NoSQL-Sammlung vergleichen, werden Sie möglicherweise feststellen, dass Sie schneller auf stark typisierte Daten (Vorname und Nachname) zugreifen können. Daher ist diese Lösung eine gute Wahl für Hybridmodelle, bei denen Sie einige Informationen identifizieren können, die für alle Objekte wiederholt werden, und andere variable Informationen als JSON gespeichert werden können. Auf diese Weise können Sie Flexibilität und Leistung kombinieren.
Wenn Sie diese Struktur mit dem Schema der Personentabelle AdventureWorks vergleichen, stellen Sie möglicherweise fest, dass wir viele verwandte Tabellen entfernt haben.
Neben der Einfachheit des Schemas sind Ihre Datenzugriffsvorgänge im Vergleich zu komplexen relationalen Strukturen einfacher. Jetzt können Sie eine einzelne Tabelle lesen, anstatt mehrere Tabellen zu verbinden. Wenn Sie eine neue Person mit verwandten Informationen (E-Mail-Adressen, Telefonnummern) einfügen müssen, können Sie einen einzelnen Datensatz in eine Tabelle einfügen, anstatt einen Datensatz in die AdventureWorks Person-Tabelle einzufügen. Verwenden Sie dabei die Identitätsspalte, um den Fremdschlüssel zu finden, der zum Speichern von Telefonen verwendet wird , E-Mail-Adressen usw. Darüber hinaus können Sie in diesem Modell problemlos einzelne Personenzeilen löschen, ohne Kaskadenlöschungen mithilfe von Fremdschlüsselbeziehungen durchzuführen.
NoSQL-Datenbanken sind für einfache Operationen zum Lesen, Einfügen und Löschen optimiert. Mit SQL Server 2016 können Sie dieselbe Logik in relationalen Datenbanken anwenden.
JSON-Einschränkungen In den vorherigen Beispielen haben wir gesehen, wie einfache Einschränkungen hinzugefügt werden, die überprüfen, ob der in der Spalte gespeicherte Text ordnungsgemäß formatiert ist. Obwohl JSON kein starkes Schema hat, können Sie auch komplexe Einschränkungen hinzufügen, indem Sie Funktionen kombinieren, die Werte aus JSON lesen, und Standard-T-SQL-Funktionen:
ALTER TABLE Person
ADD CONSTRAINT [Age should be number]
CHECK ( ISNUMERIC(JSON_VALUE(value, '$.age'))>0 )
ALTER TABLE Person
ADD CONSTRAINT [Person should have skills]
CHECK ( JSON_QUERY(value, '$.skills') IS NOT NULL)
First constraint will take the value of $.age property and check is this numeric value. Second constraint will try to find JSON object in $.skills property and verify that it exists. The following INSERT statements will fail due to the violation of constraints:
INSERT INTO Person(value)
VALUES ('{"age": "not a number", "skills":[]}')
INSERT INTO Person(value)
VALUES ('{"age": 35}')
Beachten Sie, dass CHECK-Einschränkungen Ihre Einfüge- / Aktualisierungsprozesse verlangsamen können, sodass Sie sie möglicherweise vermeiden, wenn Sie eine schnellere Schreibleistung benötigen.
Komprimierter JSON-Speicher Wenn Sie großen JSON-Text haben, können Sie JSON-Text mithilfe der integrierten COMPRESS-Funktion explizit komprimieren. Im folgenden Beispiel wird komprimierter JSON-Inhalt als Binärdaten gespeichert, und wir haben eine Spalte berechnet, die JSON als Originaltext mithilfe der DECOMPRESS-Funktion dekomprimiert:
CREATE TABLE Person
( _id int identity constraint PK_JSON_ID primary key,
data varbinary(max),
value AS CAST(DECOMPRESS(data) AS nvarchar(max))
)
INSERT INTO Person(data)
VALUES (COMPRESS(@json))
Die Funktionen COMPRESS und DECOMPRESS verwenden die Standard-GZip-Komprimierung. Wenn Ihr Client die GZip-Komprimierung verarbeiten kann (z. B. ein Browser, der GZIP-Inhalte versteht), können Sie komprimierte Inhalte direkt zurückgeben. Beachten Sie, dass dies ein Kompromiss zwischen Leistung und Speicher ist. Wenn Sie häufig komprimierte Daten abfragen, ist die Leistung möglicherweise geringer, da der Text jedes Mal dekomprimiert werden muss.
Hinweis: JSON-Funktionen sind nur in SQL Server 2016+ und in der Azure SQL-Datenbank verfügbar.
Weitere Informationen finden Sie in der Quelle dieses Artikels
https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/23/storing-json-in-sql-server/