74 votes

Quand puis-je enregistrer des données JSON ou XML dans une table SQL ?

Lorsque vous utilisez SQL ou MySQL (ou toute autre base de données relationnelle d'ailleurs) - Je comprends que la sauvegarde des données dans des colonnes régulières est meilleure pour l'indexation et d'autres objectifs...

Le truc, c'est le chargement et la sauvegarde JSON Les données sont parfois beaucoup plus simples et facilitent le développement.

Existe-t-il des "règles d'or" en matière d'épargne brute ? JSON dans la BD ?

Est-ce que c'est une pratique absolument incorrecte de le faire ?

RÉSUMÉ

De très belles réponses ont été données, mais sans doute la plus bien organisée est la réponse donnée par @Shnugo qui mérite la prime.

Je tiens également à souligner les réponses données par @Gordon Linoff et @Amresh Pandey pour expliquer d'autres cas d'utilisation particuliers.

Merci mon Dieu, et bon travail tout le monde !

2 votes

J'imagine que l'interrogation sur des propriétés spécifiques dans le JSON lui-même pourrait entraîner des goulots d'étranglement. S'il y a des champs spécifiques qui sont nécessaires pour l'interrogation dans le JSON, ils pourraient être des candidats pour l'extraction dans leur propre colonne. Certaines bases de données ont même des types de données "json", mais je ne sais pas quel genre d'optimisations sont faites en utilisant ce type.

0 votes

Merci de poser cette question. Vous m'avez épargné beaucoup d'ennuis, car il était difficile pour moi de passer d'une base de données NoSQL à une base de données SQL.

96voto

Shnugo Points 45894

Les principales questions sont les suivantes

  • Qu'allez-vous faire de ces données ? et
  • Comment filtrez-vous/triez-vous/joindrez-vous/manipulez ces données ?

JSON (comme XML) est excellent pour l'échange de données, le stockage de petite taille et les structures définies de manière générique, mais il ne peut pas participer aux actions typiques que vous exécutez dans votre SGBDR. Dans la plupart des cas, il est préférable de transférer vos données JSON dans des fichiers tables normales et recréer le JSON quand vous en avez besoin.

XML / JSON et 1.NF

La première règle de normalisation veut que l'on ne stocke jamais plus d'un élément d'information dans une colonne. Vous voyez une colonne "Nom de personne" avec une valeur comme "Mickey Mouse" ? Vous la montrez du doigt et vous pleurez : Changez cela immédiatement !

Qu'en est-il de XML ou JSON ? Ces types sont-ils en rupture avec la norme 1.NF ? Eh bien, oui et non... 

Il est tout à fait acceptable de stocker une structure complète comme un bit d'information si c'est le cas un bit d'information en fait. Vous obtenez une réponse SOAP et vous voulez la stocker parce que vous pourriez en avoir besoin pour une référence future (mais vous ne le ferez pas). ne pas utiliser ces données pour vos propres processus ) ? Il suffit de le stocker en l'état !

Imaginez maintenant un structure complexe (XML ou JSON) représentant une personne (avec son adresse, des détails supplémentaires...). Maintenant, vous mettez ce en une seule colonne comme PersonInCharge . Est-ce mal ? Ne devrait-il pas plutôt se trouver dans des tables liées correctement conçues avec une référence à une clé étrangère plutôt que dans le XML/JSON ? En particulier, si la même personne est susceptible de figurer dans plusieurs lignes différentes, l'approche XML/JSON n'est certainement pas la bonne.

Mais imaginez maintenant la nécessité de stocker des données historiques. Vous voulez persister les données de la personne à un moment donné dans le temps. Quelques jours plus tard, la personne vous communique une nouvelle adresse ? Pas de problème ! L'ancienne adresse est conservée dans un fichier XML/JSON si jamais vous en avez besoin...

Conclusion : Si vous stockez les données juste pour les conserver, c'est bon. Si ces données sont unique partie, c'est bon...
Mais si vous avez besoin de la parties internes régulièrement ou si cela signifie un stockage redondant en double, ce n'est pas bon...

Stockage physique

Les informations suivantes concernent SQL Server et peuvent être différentes sur d'autres RDBM.

Le XML n'est pas stocké comme le texte que vous voyez, mais comme un arbre hiérarchique. L'interrogation de cette structure est étonnamment performante ! Cette structure n'est pas analysée au niveau des chaînes de caractères !
JSON dans SQL Server (2016+) vit dans une chaîne et doit être analysé. Il n'existe pas de véritable type JSON natif (comme il existe un type XML natif). Cela pourrait venir plus tard, mais pour l'instant je suppose que JSON ne sera pas aussi performant que XML sur SQL Server (voir section MISE À JOUR 2 ). Tout besoin de lire une valeur à partir de JSON nécessitera un grand nombre d'appels de méthodes de chaînes cachées...

Qu'est-ce que cela signifie pour vous ?

votre adorable artiste de la DB :-D sait, que stocker JSON en l'état est contraire aux principes communs des RDBM. Il le sait,

  • qu'un JSON est très probablement en train de briser la 1.NF
  • qu'un JSON peut changer dans le temps (même colonne, contenu différent).
  • qu'un JSON n'est pas facile à lire et qu'il est très difficile de le filtrer, de le rechercher, de le joindre ou de le trier.
  • que de telles opérations vont transférer une charge supplémentaire sur le pauvre petit serveur de base de données.

Il existe quelques solutions de contournement (en fonction du SGBDR que vous utilisez), mais la plupart d'entre elles ne fonctionnent pas comme vous le souhaiteriez...

La réponse à votre question en bref

OUI

  • Si vous ne veulent pas utiliser les données, qui sont stockées sur votre JSON pour les opérations coûteuses (filtre/jonction/tri).
    Vous pouvez le stocker comme n'importe quel autre n'existe que contenu. Nous stockons de nombreuses images sous forme de BLOB, mais nous ne voulons pas essayer de filtrer toutes les images contenant une fleur...
  • Si vous ne vous préoccupez pas du tout de ce qu'il y a à l'intérieur (stockez-le et lisez-le comme une information).
  • Si les structures sont variables, ce qui rendrait plus difficile la création de tables physiques puis le travail avec des données JSON.
  • Si la structure est profondément imbriquée, que le stockage dans des tables physiques représente une surcharge trop importante.

NON

  • Si vous voulez utiliser les données internes comme vous le feriez avec les données d'une table relationnelle (filtre, index, jointures...).
  • Si vous souhaitez stocker des doublons (créer une redondance)
  • En général : Si vous rencontrez des problèmes de performance (vous en rencontrerez certainement dans de nombreux scénarios typiques !)

Vous pouvez commencer avec le JSON dans une colonne de chaîne ou en tant que BLOB et le transformer en tables physiques lorsque vous en avez besoin. Ma boule de cristal magique me dit que ce sera peut-être demain :-D

UPDATE

Trouvez ici quelques idées sur les performances et l'espace disque : https://stackoverflow.com/a/47408528/5089204

UPDATE 2 : Plus d'informations sur les performances...

Les points suivants traitent de la prise en charge de JSON et XML dans SQL-Server 2016

L'utilisateur @mike123 a signalé un article sur un blog officiel de microsoft qui semble prouver dans une expérience, que L'interrogation d'un JSON est 10 x plus rapide puis l'interrogation d'un fichier XML dans SQL-Server.

Quelques réflexions à ce sujet :

Quelques vérifications croisées avec l'"expérience" :

  • le site "L'expérience mesure beaucoup de choses, mais pas les performances de XML par rapport à JSON. . Faire la même action contre la même chaîne (inchangée) à plusieurs reprises n'est pas un scénario réaliste.
  • Les exemples testés sont beaucoup trop simple pour une déclaration générale !
  • La valeur lue est toujours la même et n'est même pas utilisée. L'optimiseur verra cela...
  • Pas un seul mot sur le puissant XQuery soutien ! Trouver un produit avec un ID donné dans un tableau ? JSON doit lire l'ensemble du tableau et utiliser un filtre par la suite en utilisant la fonction WHERE alors que XML permettrait à une XQuery predicate . Sans parler de FLWOR ...
  • le code "expériences en l'état sur mon système : JSON semble être 3x plus rapide (mais pas 10x).
  • Ajout de /text() à la XPath réduit ce chiffre à moins de 2x . Dans l'article connexe, l'utilisateur "Mister Magoo" l'a déjà signalé, mais la appât à clics Le titre reste inchangé...
  • Avec un JSON aussi simple que celui donné dans l'"expérience", l'approche la plus rapide en T-SQL pur était une combinaison de SUBSTRING et CHARINDEX :-D

Le code suivant montre une expérience plus réaliste

  • Utilisation d'un JSON et d'un XML identique avec plusieurs Product (un tableau JSON par rapport à des nœuds frères)
  • JSON et XML sont légèrement modifiés (10000 chiffres courants) et insérés dans des tableaux.
  • Il y a un appel initial contre les deux tables afin d'éviter first-call-bias
  • Les 10000 entrées sont lues et les valeurs récupérées sont insérées dans une autre table.
  • Utilisation de GO 10 traversera ce bloc dix fois pour éviter first-call-bias

Le résultat final montre clairement que JSON est plus lent que XML. (pas tant que ça, environ 1,5x sur un exemple encore très simple).

La déclaration finale :

  • Avec un exemple excessivement simplifié, dans des circonstances indues, JSON peut être plus rapide que XML.
  • Traiter avec JSON est action de chaîne pure tandis que le XML est analysé et transformé. C'est assez coûteux dans la première action, mais cela accélérera tout, une fois que ce sera fait.
  • JSON pourrait être mieux dans un unique action (évite les frais généraux liés à la création d'une représentation hiérarchique interne d'un XML)
  • Avec un exemple encore très simple mais plus réaliste, XML sera plus rapide en lecture simple
  • Lorsqu'il est nécessaire de lire un élément spécifique d'un tableau, de filtrer toutes les entrées où un ProductID donné est inclus dans le tableau, ou de naviguer de haut en bas du chemin, JSON ne peut pas tenir. Il doit être entièrement analysé à partir d'une chaîne de caractères - à chaque fois que vous devez y accéder...

Le code de test

USE master;
GO
--create a clean database
CREATE DATABASE TestJsonXml;
GO
USE TestJsonXml;
GO
--create tables
CREATE TABLE TestTbl1(ID INT IDENTITY,SomeXml XML);
CREATE TABLE TestTbl2(ID INT IDENTITY,SomeJson NVARCHAR(MAX));
CREATE TABLE Target1(SomeString NVARCHAR(MAX));
CREATE TABLE Target2(SomeString NVARCHAR(MAX));
CREATE TABLE Times(Test VARCHAR(10),Diff INT)
GO
--insert 10000 XMLs into TestTbl1
WITH Tally AS(SELECT TOP 10000 ROW_NUMBER() OVER(ORDER BY (SELECT NULL))*2 AS Nmbr FROM master..spt_values AS v1 CROSS APPLY master..spt_values AS v2)
INSERT INTO TestTbl1(SomeXml)
SELECT 
N'<Root>
    <Products>
    <ProductDescription>
        <Features>
            <Maintenance>' + CAST(Nmbr AS NVARCHAR(10)) + ' year parts and labor extended maintenance is available</Maintenance>
            <Warranty>1 year parts and labor</Warranty>
        </Features>
        <ProductID>' + CAST(Nmbr AS NVARCHAR(10)) + '</ProductID>
        <ProductName>Road Bike</ProductName>
    </ProductDescription>
    <ProductDescription>
        <Features>
            <Maintenance>' + CAST(Nmbr + 1 AS NVARCHAR(10)) + ' blah</Maintenance>
            <Warranty>1 year parts and labor</Warranty>
        </Features>
        <ProductID>' + CAST(Nmbr + 1 AS NVARCHAR(10)) + '</ProductID>
        <ProductName>Cross Bike</ProductName>
    </ProductDescription>
    </Products>
</Root>'
FROM Tally;

--insert 10000 JSONs into TestTbl2
WITH Tally AS(SELECT TOP 10000 ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS Nmbr FROM master..spt_values AS v1 CROSS APPLY master..spt_values AS v2)
INSERT INTO TestTbl2(SomeJson)
SELECT 
N'{
    "Root": {
        "Products": {
            "ProductDescription": [
                {
                    "Features": {
                        "Maintenance": "' + CAST(Nmbr AS NVARCHAR(10)) + ' year parts and labor extended maintenance is available",
                        "Warranty": "1 year parts and labor"
                    },
                    "ProductID": "' + CAST(Nmbr AS NVARCHAR(10)) + '",
                    "ProductName": "Road Bike"
                },
                {
                    "Features": {
                        "Maintenance": "' + CAST(Nmbr + 1 AS NVARCHAR(10)) + ' blah",
                        "Warranty": "1 year parts and labor"
                    },
                    "ProductID": "' + CAST(Nmbr + 1 AS NVARCHAR(10)) + '",
                    "ProductName": "Cross Bike"
                }
            ]
        }
    }
}'
FROM Tally;
GO

--Do some initial action to avoid first-call-bias
INSERT INTO Target1(SomeString)
SELECT SomeXml.value('(/Root/Products/ProductDescription/Features/Maintenance/text())[1]', 'nvarchar(4000)')
FROM TestTbl1;
INSERT INTO Target2(SomeString)
SELECT JSON_VALUE(SomeJson, N'$.Root.Products.ProductDescription[0].Features.Maintenance')
FROM TestTbl2;
GO

--Start the test
DECLARE @StartDt DATETIME2(7), @EndXml DATETIME2(7), @EndJson DATETIME2(7);

--Read all ProductNames of the second product and insert them to Target1
SET @StartDt = SYSDATETIME();
INSERT INTO Target1(SomeString)
SELECT SomeXml.value('(/Root/Products/ProductDescription/ProductName/text())[2]', 'nvarchar(4000)')
FROM TestTbl1
ORDER BY NEWID();
--remember the time spent
INSERT INTO Times(Test,Diff)
SELECT 'xml',DATEDIFF(millisecond,@StartDt,SYSDATETIME());

--Same with JSON into Target2
SET @StartDt = SYSDATETIME();
INSERT INTO Target2(SomeString)
SELECT JSON_VALUE(SomeJson, N'$.Root.Products.ProductDescription[1].ProductName')
FROM TestTbl2
ORDER BY NEWID();
--remember the time spent
INSERT INTO Times(Test,Diff)
SELECT 'json',DATEDIFF(millisecond,@StartDt,SYSDATETIME());

GO 10 --do the block above 10 times

--Show the result
SELECT Test,SUM(Diff) AS SumTime, COUNT(Diff) AS CountTime
FROM Times
GROUP BY Test;
GO
--clean up
USE master;
GO
DROP DATABASE TestJsonXml;
GO

Le résultat (SQL Server 2016 Express sur un Acer Aspire v17 Nitro Intel i7, 8GB Ram)

Test    SumTime 
------------------
json    2706    
xml     1604

0 votes

Cet article suggère que json est 10 fois plus performant que xml. blogs.msdn.microsoft.com/sqlserverstorageengine/2017/11/13/

0 votes

Pourriez-vous mettre des nanosecondes au lieu de millisecondes dans DATEDIFF ?

0 votes

@JovanMSFT Bien sûr : json : 2281502100 et xml:1296990300. Cela signifie que XML est presque deux fois plus rapide...

13voto

Gordon Linoff Points 213350

C'est trop long pour un commentaire.

Si c'était "absolument faux", alors la plupart des bases de données ne le supporteraient pas. D'accord, la plupart des bases de données supportent les virgules dans les FROM et je considère cela comme "absolument faux". Mais la prise en charge de JSON est un nouveau développement, et non une "fonctionnalité" rétrocompatible.

Un cas évident est celui où la structure JSON est simplement un BLOB qui est renvoyé à l'application. Dans ce cas, il n'y a pas de débat, si ce n'est la surcharge liée au stockage de JSON, qui est inutilement verbeux pour des données structurées avec des champs communs dans chaque enregistrement.

Un autre cas est celui des colonnes "éparses". Vous avez des lignes avec de nombreuses colonnes possibles, mais celles-ci varient d'une ligne à l'autre.

Un autre cas est celui où vous voulez stocker des enregistrements "imbriqués" dans un enregistrement. JSON est puissant.

Si le JSON comporte des champs communs à tous les enregistrements sur lesquels vous souhaitez effectuer des requêtes, il est généralement préférable de les placer dans des colonnes de base de données appropriées. Cependant, les données sont compliquées et les formats tels que JSON ont leur place.

13voto

Rick James Points 15994

Je vais agiter ma baguette magique. Pouf ! Règles d'or sur l'utilisation de JSON :

  • Si MySQL n'a pas besoin de chercher à l'intérieur de le JSON, et que l'application a simplement besoin d'une collection d'éléments, alors le JSON est parfait, peut-être même meilleur.

  • Si vous effectuez une recherche sur des données qui sont à l'intérieur et vous avez MariaDB 10.0.1 ou MySQL 5.7 (avec un type de données et des fonctions JSON), alors JSON pourrait être pratique. Les colonnes "dynamiques" de MariaDB 5.3 sont une variante de ce principe.

  • Si vous faites des choses de type "entité-attribut-valeur", JSON n'est pas bon, mais c'est le moindre des maux. http://mysql.rjweb.org/doc.php/eav

  • Pour la recherche par une colonne indexée, le fait de ne pas avoir la valeur enfouie dans le JSON est un gros avantage.

  • Pour effectuer une recherche par plage sur une colonne indexée, ou une FULLTEXT recherche ou SPATIAL JSON n'est pas possible.

  • Pour WHERE a=1 AND b=2 l'indice "composite INDEX(a,b) est génial ; on ne peut probablement pas s'en approcher avec JSON.

  • JSON fonctionne bien avec des données "éparses" ; l'indexation fonctionne, mais pas aussi bien, avec de telles données. (Je fais référence aux valeurs qui sont "manquantes" ou NULL pour un grand nombre de lignes).

  • JSON peut vous fournir des "tableaux" et des "arbres" sans recourir à des tableaux supplémentaires. Mais en creusant dans ces tableaux/arbres uniquement dans l'application, pas en SQL.

  • JSON est bien meilleur que XML. (Mon opinion)

  • Si vous ne voulez pas accéder à la chaîne JSON, sauf à partir de l'application, je recommande de la compresser (dans le client) et de la stocker dans un fichier de type "JSON". BLOB . Pensez-y comme à un .jpg - il y a des choses dedans, mais SQL s'en moque.

Exposez votre demande ; nous pourrons peut-être être plus précis.

0 votes

Les balles sont bonnes, mais si vous pouviez faire une distinction entre "quand" et "quand", ce serait encore mieux.

2 votes

@levi - Oui, mais plusieurs ne sont pas absolument à/non ; ils dépendent plutôt des détails de la situation.

2 votes

JSON est bien meilleur que XML. (Mon opinion) Eh bien, JSON a moins de caractères... Que pouvez-vous faire avec JSON, ce que vous ne pouvez pas faire avec XML ? La partie la plus importante est : Comment traite-t-on ce type de maladie ? L'analyse du XML ou du JSON à l'aide de méthodes de type "string" sera un véritable casse-tête. Transformer la structure en un arbre d'objets permettra de bien meilleures approches. SQL Server stocke XML dans un arbre nativement, mais JSON sera - AFAIK - vivre dans une chaîne... Pourquoi préférez-vous JSON comme mondes meilleurs ?

9voto

AMRESH PANDEY Points 144

Le nouveau serveur SQL fournit des fonctions pour traiter le texte JSON. Les informations formatées en JSON peuvent être stockées sous forme de texte dans des colonnes SQL Server standard et le serveur SQL fournit des fonctions permettant de récupérer les valeurs de ces objets JSON.

    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 )
 )

Cette structure simple est similaire à la collection NoSQL standard que vous pouvez créer dans les bases de données NoSQL (par exemple Azure DocumentDB ou MongoDB) où vous avez simplement une clé qui représente l'ID et une valeur qui représente JSON.

Notez que NVARCHAR n'est pas simplement un texte brut. Le serveur SQL possède un mécanisme intégré de compression de texte qui permet de compresser de manière transparente les données stockées sur le disque. La compression dépend de la langue et peut aller jusqu'à 50% en fonction de vos données (voir la compression UNICODE ).

La principale différence entre le serveur SQL et d'autres bases de données NoSQL ordinaires est que le serveur SQL vous permet d'utiliser un modèle de données hybride dans lequel vous pouvez stocker plusieurs objets JSON dans la même "collection" et les combiner avec des colonnes relationnelles ordinaires.

À titre d'exemple, imaginez que nous savons que chaque personne de votre collection aura FirstName et LastName, et que vous pouvez stocker des informations générales sur la personne en tant qu'objet JSON unique, et les numéros de téléphone/adresses e-mail en tant qu'objets séparés. Dans SQL Server 2016, nous pouvons facilement créer cette structure sans aucune syntaxe supplémentaire :

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 )

 )

Au lieu d'un seul objet JSON, vous pouvez organiser vos données dans cette "collection". Si vous ne voulez pas vérifier explicitement la structure de chaque colonne JSON, vous n'avez pas besoin d'ajouter la contrainte de vérification JSON sur chaque colonne (dans cet exemple, j'ai ajouté la contrainte CHECK uniquement sur la colonne EmailAddresses).

Si vous comparez cette structure à la collection NoSQL standard, vous remarquerez que vous aurez un accès plus rapide aux données fortement typées (FirstName et LastName). Par conséquent, cette solution est un bon choix pour les modèles hybrides où vous pouvez identifier certaines informations qui sont répétées dans tous les objets, et d'autres informations variables peuvent être stockées en JSON. De cette façon, vous pouvez combiner flexibilité et performance.

Si vous comparez cette structure avec le schéma de la table Personne de la base de données AdventureWorks, vous remarquerez que nous avons supprimé de nombreuses tables liées.

Outre la simplicité du schéma, vos opérations d'accès aux données seront plus simples par rapport à la structure relationnelle complexe. Vous pouvez maintenant lire une seule table au lieu de joindre plusieurs tables. Lorsque vous avez besoin d'insérer une nouvelle personne avec des informations connexes (adresses e-mail, numéros de téléphone), vous pouvez insérer un seul enregistrement dans une table au lieu d'insérer un enregistrement dans la table Personne d'AdventureWorks, en prenant la colonne identité pour trouver la clé étrangère qui sera utilisée pour stocker les téléphones, les adresses e-mail, etc. En outre, dans ce modèle, vous pouvez facilement supprimer une seule ligne de personne sans suppression en cascade en utilisant les relations de clé étrangère.

Les bases de données NoSQL sont optimisées pour des opérations simples de lecture, d'insertion et de suppression - SQL Server 2016 vous permet d'appliquer la même logique dans une base de données relationnelle.

Contraintes JSON Dans les exemples précédents, nous avons vu comment ajouter une contrainte simple qui valide que le texte stocké dans la colonne est correctement formaté. Bien que JSON ne possède pas de schéma fort, vous pouvez également ajouter des contraintes complexes en combinant des fonctions qui lisent les valeurs de JSON et des fonctions T-SQL standard :

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}')

Notez que les contraintes CHECK peuvent ralentir vos processus d'insertion/mise à jour. Vous pouvez donc les éviter si vous avez besoin de performances d'écriture plus rapides.

Stockage JSON compressé Si vous avez un texte JSON volumineux, vous pouvez explicitement compresser le texte JSON en utilisant la fonction intégrée COMPRESS. Dans l'exemple suivant, le contenu JSON compressé est stocké en tant que données binaires, et nous avons calculé une colonne qui décompresse JSON en tant que texte original en utilisant la fonction DECOMPRESS :

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))

Les fonctions COMPRESS et DECOMPRESS utilisent la compression standard GZip. Si votre client peut gérer la compression GZip (par exemple, un navigateur qui comprend le contenu gzip), vous pouvez renvoyer directement le contenu compressé. Notez qu'il s'agit d'un compromis entre performance et stockage. Si vous interrogez fréquemment des données compressées, vous risquez d'avoir des performances plus faibles car le texte doit être décompressé à chaque fois.

Remarque : les fonctions JSON sont disponibles uniquement dans SQL Server 2016+ et Azure SQL Database.

Pour en savoir plus, consultez la source de cet article.

https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/23/storing-json-in-sql-server/

5voto

piisexactly3 Points 366

La "règle d'or" que j'utilise, d'une certaine manière, est que si j'ai besoin de JSON dans son format brut, il est possible de le stocker. Si je dois faire un effort particulier pour l'analyser, ce n'est pas le cas.

Par exemple, si je crée une API qui envoie du JSON brut et que, pour une raison ou une autre, cette valeur ne changera pas, alors il s'agit de ok pour le stocker en tant que JSON brut. Si je dois l'analyser, le modifier, le mettre à jour, etc... alors pas vraiment.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X